ในฐานะที่เป็นเอเรียลบันทึกอัลกอริทึมการค้นหาสูงสุดมาตรฐานที่ระบุด้านล่าง:
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 )