Ariel'in belirttiği gibi , aşağıda verilen standart maksimum bulma algoritması:
def find_maximum(a):
m = a[0]
for x in a:
if x > m: m = x
return m
Aslında şu sürece değişiklik yapmadan çalışacaktır:
- herhangi bir eleman çifti karşılaştırılabilir ve
- girişin maksimum bir öğe içerdiği garanti edilir, yani girişteki diğer tüm öğelerden çift olarak daha büyük bir öğe.
(Yukarıdaki ilk varsayım, maksimum öğenin diğer x > y
tüm öğelerle karşılaştırılabilir olduğunu ve öğeler x
ve y
karşılaştırılamazsa her zaman yanlış olduğunu varsaydığımız sürece, algoritmayı değiştirmek zorunda kalmadan bile gerçekten rahatlatılabilir .)
Özellikle:
[…] Bir yanıttan emin olmak için, öğenin açıkça diğer tüm öğelerle karşılaştırılması gerekir (çünkü karşılaştırma geçişli değildir).
yukarıda verilen varsayımlar altında doğru değildir. Aslında, yukarıdaki algoritmanın her zaman maksimum unsuru bulacağını kanıtlamak için şunları gözlemlemek yeterlidir:
- döngü tüm girdi öğeleri üzerinde yinelendiği için, bazı yinelemelerde
x
maksimum öğe olacaktır;
- maksimal eleman diğer tüm elemanlardan çift olarak büyük olduğu için, bu yinelemenin sonunda
m
maksimum eleman olacağını takip eder; ve
- başka hiçbir öğe maksimum öğeden çift olarak daha büyük olamayacağından
m
, sonraki yinelemelerde değişmeyecektir.
Bu nedenle, döngünün sonunda m
, giriş bir tane içeriyorsa , her zaman maksimum öğe olacaktır.
Ps. Giriş yoksa değil mutlaka her zaman maksimal eleman içerirler, o zaman gerçekten maksimal olduğunu doğrulamak için her elemana karşı aday cevabı test gerektiren aslında gerçeğini doğrulayan. Bununla birlikte, yukarıdaki maksimum bulma algoritmasını çalıştırdıktan sonra yine de O ( n ) zamanda yapabiliriz :
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
(Burada ilişkinin >
düzensiz olduğunu varsayıyorum, yani hiçbir öğe kendisinden daha büyük olamaz. Durum böyle değilse x > m
, adım 2'deki karşılaştırmanın yerine geçmesi gerekir x ≠ m and x > m
, burada ≠
kimlik karşılaştırmasını gösterir. Ya da sadece optimizasyonu uygulayabiliriz Aşağıda belirtilmiştir.)
Algoritmanın bu varyasyonunun doğruluğunu kanıtlamak için iki olası durumu göz önünde bulundurun:
- Giriş maksimum bir öğe içeriyorsa, 1. adım onu (yukarıda gösterildiği gibi) bulur ve 2. adım bunu onaylar.
- Giriş yoksa değil bir maksimal elemanı ihtiva ardından 1. adımı gibi bazı keyfi elemanı çekme sona erecek
m
. Hangi eleman olduğu önemli değil, çünkü her durumda maksimal olmayacak ve bu nedenle 2. adım bunu tespit edip geri dönecek None
.
Biz dizinini depolanmış olursa m
girdi dizisinde a
, biz aslında sadece önce gelen unsurları kontrol etmek optimize 2. adımı olabilir m
de a
daha sonraki unsurların beri, zaten karşılaştırılmıştır m
1. adımda Ama bu optimizasyon asimptotik zaman karmaşıklığı değişmez algoritma, ki bu hala O ( n ) 'dir.