İleri Algoritma Analizi Ders7: Algoritmaların ortalama işlem zamanı analizi Arama algoritmaları örneği Prof. Dr. Şahin EMRAH İleri Algoritma Analizi
İkili arama algoritması (Binary Search (BS)) Problem: Sıralı bir dizide verilen bir elemanı arama Giriş: Sıralı A[n] dizisi ve bu dizide aranan bir key elemanı Algoritma: Dizinin ortanca elemanı ile key elemanını karşılaştır, eşit çıkarsa aranan eleman budur, ortanca eleman küçük çıkarsa, aranan eleman sağ tarafta, aksi durumda sol taraftadır. Aynı algoritmayı kalan parçaya uygula.
Sözde kod Algorithm BS(A,n,key) left←1 right ←n while left<right mid←floor((left+right)/2) if key=A(mid) then return mid else if key>A(mid) left ←mid+1 else right ←mid-1
Ortalama işlem zamanı analizi Bu algoritma için ortalama karşılaştırma sayısını bulalım: key=A[i] ise bu elemanı bu algoritma ile bulmak için gerekli karşılaştırma sayısı C[i] olsun. Bu durumda ortalama karşılaştırma sayısı Cort=(C[1]+C[2]+…C[n])/n olur.
Örnek üzerinde hesaplama Verilen dizi 1,2,3,4,5,6,7 olsun. Eğer key=4 ise BS algoritması bu değeri 2 karşılaştırma ile (1=left≤right=7 ve A(mid=4)=4) karşılaştırmaları ile bulur. Eğer key=2 veya key=6 ise BS algoritması bu değerleri bulmak için key=4 durumuna ek olarak 3 karşılaştırma daha yapmalıdır (örneğin, key=2 için if key=2>A(mid=4) sonra 1=left<right=3 ve sonra A(mid=2)=2 karşılaştırmaları)
Hesaplama(devam) Yani her sonraki parçanın ortasını bulmak için ek olarak 3 karşılaştırma yapmak gerekir
Toplam karşılaştırma sayısı Yani tam olarak 1 değer için (ortanca sayı) 2 karşılaştırma, 2 değer için (sol ve sağ parçaların ortası) 5 karşılaştırma, 4 değer için 8 karşılaştırama,… yapmak gereklidir. Genel durumda 2i-1 değer için tam olarak 3i-1 karşılaştırma yapılmalıdır. Şimdi n= 2k -1 olsun. Cort=(C[1]+C[2]+…C[n])/n=(1.2+2.5+4. 8+… 2i-1.(3i-1)+… 2k-1.(3k-1))/n
Ortalama karşılaştırma sayısı Cort=(C[1]+C[2]+…C[n])/n=(1.2+2.5+4.8+… 2i-1.(3i- 1)+… 2k-1.(3k-1))/n=3(1.1+2.2+3. 22+…k. 2k-1 )/n- (1+2+… 2k-1)/n Sk=1.1+2.2+3. 22+…k. 2k-1 olsun. 2Sk= 1.2+2. 22 +3. 23+…k. 2k oldu. Buradan da Sk= 2Sk-Sk=-(1+2+… 2k-1)+ k. 2k = k. 2k - 2k +1= (n+1) log2 (n+1)-n Buradan da Cort=(3(n+1)log2(n+1))/n-4=3log2(n+1)+(3 log2(n+1))/n-4
İyileştirlmiş İkili Arama Algoritması Ana fikir: Gerçekleşmesi daha az olasılıklı olan key=A(mid) karşılaştırmasını en sonda yazmakla algoritmadaki ortalama karşılaştırma sayısını azaltabiliriz.
Sözde kod Algorithm IBS(A,n,key) left←1 right ←n while left<right mid←floor((left+right)/2) if key>A(mid) left ←mid+1 else if key<A(mid) right ←mid-1 else return mid