Seperti yang dicatat Ariel , algoritma pencarian maksimum standar yang diberikan di bawah ini:
def find_maximum(a):
m = a[0]
for x in a:
if x > m: m = x
return m
sebenarnya akan bekerja tanpa modifikasi selama:
- setiap pasangan elemen dapat dibandingkan, dan
- input dijamin mengandung elemen maksimal, yaitu elemen yang berpasangan lebih besar dari elemen lain dalam input.
(Asumsi pertama di atas sebenarnya dapat dilonggarkan, bahkan tanpa harus memodifikasi algoritme, asalkan kita mengasumsikan bahwa elemen maksimal sebanding dengan setiap elemen lainnya dan itu x > y
selalu salah jika elemenx
dan y
tidak .)
Secara khusus, klaim Anda bahwa:
[...] untuk memastikan jawaban, elemen tersebut harus secara eksplisit dibandingkan dengan setiap elemen lainnya (karena perbandingan tidak transitif).
tidak benar berdasarkan asumsi yang diberikan di atas. Bahkan, untuk membuktikan bahwa algoritma di atas akan selalu menemukan elemen maksimal, cukup untuk mengamati bahwa:
- karena loop berulang pada semua elemen input, pada beberapa iterasi
x
akan menjadi elemen maksimal;
- karena elemen maksimal berpasangan lebih besar daripada elemen lainnya, maka pada akhirnya iterasi
m
akan menjadi elemen maksimal; dan
- karena tidak ada elemen lain yang bisa berpasangan lebih besar dari elemen maksimal, maka
m
tidak akan berubah pada iterasi berikutnya.
Oleh karena itu, pada akhir loop, m
akan selalu menjadi elemen maksimal, jika inputnya mengandung satu.
Ps. Jika input tidak selalu selalu mengandung elemen maksimal, maka memverifikasi fakta itu memang akan membutuhkan pengujian jawaban kandidat terhadap setiap elemen lainnya untuk memverifikasi bahwa itu benar-benar maksimal. Namun, kami masih dapat melakukannya dalam waktu O ( n ) setelah menjalankan algoritma pencarian maksimum di atas:
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
(Saya berasumsi di sini bahwa hubungannya >
tidak refleksif, yaitu tidak ada elemen yang bisa lebih besar dari dirinya sendiri. Jika itu belum tentu demikian, perbandingan x > m
pada langkah 2 harus diganti dengan x ≠ m and x > m
, di mana ≠
menunjukkan perbandingan identitas. Atau kita bisa menerapkan optimasi tercantum di bawah ini.)
Untuk membuktikan kebenaran variasi algoritma ini, pertimbangkan dua kemungkinan kasus:
- Jika input berisi elemen maksimal, maka langkah 1 akan menemukannya (seperti yang ditunjukkan di atas) dan langkah 2 akan mengkonfirmasinya.
- Jika input tidak mengandung elemen maksimal, maka langkah 1 akan memilih elemen arbitrer sebagai
m
. Tidak masalah elemen mana itu, karena dalam hal apa pun akan menjadi non-maksimal, dan karenanya langkah 2 akan mendeteksi itu dan kembali None
.
Jika kita disimpan indeks dari m
dalam array masukan a
, kita bisa benar-benar mengoptimalkan langkah 2 hanya memeriksa unsur-unsur yang datang sebelum m
di a
, karena setiap elemen kemudian telah dibandingkan dengan m
pada langkah 1. Tapi optimasi ini tidak mengubah kompleksitas waktu asimptotik dari algoritma, yang masih O ( n ).