ในฐานะที่เป็นเอเรียลบันทึกอัลกอริทึมการค้นหาสูงสุดมาตรฐานที่ระบุด้านล่าง:
def find_maximum(a):
m = a[0]
for x in a:
if x > m: m = x
return m
จะใช้งานได้จริงโดยไม่มีการดัดแปลงตราบใดที่:
- องค์ประกอบใด ๆ ที่สามารถเปรียบเทียบและ
- อินพุตรับประกันว่าจะมีองค์ประกอบสูงสุดคือองค์ประกอบที่เป็น pairwise มากกว่าองค์ประกอบอื่น ๆ ในอินพุต
(ข้อสันนิษฐานแรกข้างต้นสามารถผ่อนคลายได้จริงโดยไม่ต้องปรับเปลี่ยนอัลกอริทึมตราบใดที่เราสันนิษฐานว่าองค์ประกอบสูงสุดเทียบได้กับองค์ประกอบอื่น ๆ และx > y
เป็นเท็จเสมอถ้าองค์ประกอบx
และy
หาที่เปรียบมิได้)
โดยเฉพาะอย่างยิ่งการอ้างสิทธิ์ของคุณที่:
[…] เพื่อให้แน่ใจในคำตอบองค์ประกอบจะต้องมีการเปรียบเทียบอย่างชัดเจนกับองค์ประกอบอื่น ๆ ทั้งหมด (เนื่องจากการเปรียบเทียบไม่ใช่สกรรมกริยา)
ไม่เป็นจริงภายใต้สมมติฐานที่ให้ไว้ข้างต้น ในความเป็นจริงเพื่อพิสูจน์ว่าอัลกอริทึมด้านบนจะค้นหาองค์ประกอบสูงสุดเสมอก็เพียงพอที่จะสังเกตว่า:
- เนื่องจากการวนซ้ำวนซ้ำทุกองค์ประกอบอินพุตที่การวนซ้ำบางรายการ
x
จะเป็นองค์ประกอบสูงสุด
- เนื่องจากองค์ประกอบสูงสุดเป็น pairwise มากกว่าองค์ประกอบอื่น ๆ ทุกอย่างมันจึงตามมาว่าในตอนท้ายของการทำซ้ำนั้น
m
จะเป็นองค์ประกอบสูงสุด และ
- เนื่องจากไม่มีองค์ประกอบอื่นใดสามารถจับคู่ได้มากกว่าองค์ประกอบสูงสุดมันจึงตามมาซึ่ง
m
จะไม่เปลี่ยนแปลงในการวนซ้ำใด ๆ ที่ตามมา
ดังนั้นในตอนท้ายของลูปm
จะเป็นองค์ประกอบสูงสุดเสมอหากอินพุตมีหนึ่งรายการ
ps หากการป้อนข้อมูลไม่จำเป็นต้องมีองค์ประกอบสูงสุดเสมอการยืนยันความจริงที่ว่าจะต้องมีการทดสอบคำตอบที่ผู้สมัครกับทุกองค์ประกอบอื่น ๆ เพื่อตรวจสอบว่ามันเป็นจริงสูงสุด อย่างไรก็ตามเรายังคงสามารถทำได้ในเวลา O ( n ) หลังจากเรียกใช้อัลกอริทึมการค้นหาสูงสุดด้านบน:
def find_maximum_if_any(a):
# step 1: find the maximum, if one exists
m = a[0]
for x in a:
if x > m: m = x
# step 2: verify that the element we found is indeed maximal
for x in a:
if x > m: return None # the input contains no maximal element
return m # yes, m is a maximal element
(ฉันสมมติว่านี่>
คือความสัมพันธ์แบบirreflexive นั่นคือไม่มีองค์ประกอบใดสามารถยิ่งใหญ่กว่าตัวเองได้หากไม่จำเป็นต้องเป็นกรณีนี้การเปรียบเทียบx > m
ในขั้นตอนที่ 2 ควรถูกแทนที่ด้วยx ≠ m and x > m
โดยที่จะเป็นการ≠
เปรียบเทียบตัวตนหรือเราอาจใช้การเพิ่มประสิทธิภาพ ระบุไว้ด้านล่าง.)
เพื่อพิสูจน์ความถูกต้องของอัลกอริทึมการเปลี่ยนแปลงนี้ให้พิจารณาสองกรณีที่เป็นไปได้:
- หากอินพุตมีองค์ประกอบสูงสุดแล้วขั้นตอนที่ 1 จะค้นหา (ดังแสดงด้านบน) และขั้นตอนที่ 2 จะยืนยัน
- ถ้าใส่ไม่ได้มีองค์ประกอบสูงสุดแล้วขั้นตอนที่ 1
m
จะจบลงหยิบบางองค์ประกอบโดยพลการเป็น มันไม่สำคัญซึ่งองค์ประกอบมันเป็นเพราะมันจะในกรณีใด ๆ จะไม่ใช่สูงสุดและดังนั้นขั้นตอนที่ 2 None
จะตรวจสอบว่าและผลตอบแทน
ถ้าเราเก็บไว้ในดัชนีของm
ในอาร์เรย์การป้อนข้อมูลที่a
เราสามารถทำได้จริงขั้นตอนการเพิ่มประสิทธิภาพที่ 2 เพื่อตรวจสอบองค์ประกอบเฉพาะผู้ที่มาก่อนm
ในa
ตั้งแต่องค์ประกอบใด ๆ ในภายหลังได้รับแล้วเมื่อเทียบกับm
ในขั้นตอนที่ 1 แต่เพิ่มประสิทธิภาพนี้ไม่ได้เปลี่ยนความซับซ้อนเชิงเวลา ของอัลกอริทึมซึ่งยังคงเป็น O ( n )