Algoritmalar Heap Sort Bahar 2017 Doç. Dr. Suat Özdemir 1
Heap Sort Heap Sort algoritması Merge Sort ve Insertion Sort algoritmalarının iyi özelliklerini bir arada toplar. Algoritma Insertion Sort gibi yerinde sıralama yaparken Merge Sort gibi O nlgn çalışma zamanını garanti eder. En önemli özelliği ise bir veri yapısından (Heap) faydalanarak sıralama işlemini gerçekleştirmesidir. Bu daha önceki algoritmalarda görmediğimiz bir özellikti. Bahar 2017 Doç. Dr. Suat Özdemir 2
Heap Veri Yapısı İkili (binary) Heap veri yapısı neredeyse tam dolu ikili ağaç olarak gösterilebilecek bir dizidir. Neredeyse dolu tanımının kullanılması sadece yapraklarda boşluk olabileceği anlamına gelir. Bir başka ifade ile ağaç dengelidir. Ağaç üzerindeki her bir düğüm dizinin bir elemanıdır. Ağaç yapraklar hariç tüm seviyelerde doludur, yaprak seviyesinde ise ağaç soldan sağa doğru doldurulur. Bir Heap oluşturan A dizisi iki tane tanımlayıcı niteliğe sahiptir: Dizideki eleman sayısını belirleyen length[a] Heap içerisinde tutulan A dizisine ait elemanların sayısı heap size[a] Bahar 2017 Doç. Dr. Suat Özdemir 3
Heap Veri Yapısı Ağacın kökü A[1] ile ifade edilir. İndeks değeri i olan bir düğümün ebeveyn (Parent), sağ (Right) ve sol (Left) çocukları aşağıdaki gibi bulunur. Çoğu bilgisayarda i/2 ve 2i işlemleri sola ve sağa bit kaydırmaları ile kolayca yapılabildiğinden Heap Sort algoritmasının uygulanması oldukça kolaydır. Kullanılan floor fonksiyonu bölme işlemi sonucunda elde edilen değerin tam sayı kısmını döndürür. Parent (i) return floor(i/2) Left (i) return 2i Right (i) return 2i + 1 Bahar 2017 Doç. Dr. Suat Özdemir 4
Heap Veri Yapısı Max ve Min Heap olmak üzere iki çeşit Heap vardır. Her ikisinde de ağaç üzerindeki kök hariç her düğümün heap property i (heap özelliğini) sağlaması gereklidir. Max Heap te heap özelliği kök hariç tüm düğümlerin şartını sağlamasıdır. A[Parent(i)] A[i] Bu özelliğe göre Heap içindeki herhangi bir düğümün değeri en çok ebeveyni kadar olabilir, bu nedenle kökte bulunan değer dizi içindeki en büyük değerdir. Bahar 2017 Doç. Dr. Suat Özdemir 5
Heap Veri Yapısı Aynı şekilde Min heap de heap özelliği kök hariç tüm düğümlerin A[Parent(i)] A[i] şartını sağlamasıdır. Kökte bulunan değer dizi içindeki en küçük değerdir. Bu derste Heap Sort anlatılırken Max Heap yapısı kullanılacak ve kolaylık açısından sadece Heap olarak adlandırılacaktır. Bahar 2017 Doç. Dr. Suat Özdemir 6
Örnek: Max-Heap İndeks değerlerinin soldan sağa ve yukarıdan aşağı doğru arttığına dikkat ediniz. Ağaç kökünün indeks değeri 1 dir. Tüm düğümler Heap özelliğini sağlamaktadır. Bahar 2017 Doç. Dr. Suat Özdemir 7
Örnek: Max-Heap Aynı Heap dizi olarak da gösterilebilir. Bu dizi kökten başlayarak soldan sağa doğru Heap üzerine yerleştirilebilir. 14 12 7 10 8 6 Heap yapısında ağacın yüksekliği yapraklardan köke ulaşan en uzun yol olarak tanımlanır. Kökün yüksekliği Heap yüksekliği olup n elemanlı dizi için θ(lgn)'dir, bu nedenle heap üzerinde gerçekleştirilecek olan çoğu işlem O(lgn) zamanda bitirilebilir. Diğer Heap özellikleri: Yaprak sayısı: ceiling(n/2) h yüksekliğindeki düğüm sayısı ceiling( n 2 h+1) Bahar 2017 Doç. Dr. Suat Özdemir 8
Heap Özelliğinin Korunması Heapify Ağaç içerisindeki bir düğümün Heap özelliğini bozması durumunda Heapify fonksiyonu kullanılarak durum düzeltilir. Heapify fonksiyonu özelliği bozan düğümün değerini çocuklarından en büyük değere sahip olanı ile yer değiştirir. Bu durum alt ağaçta Heap özelliğinin bozulmasına neden olabilir bu nedenle Heapify fonksiyonu özyineli olarak yapraklara ulaşana kadar tüm çocuklara uygulanır. Bahar 2017 Doç. Dr. Suat Özdemir 9
Heap Özelliğinin Korunması Heapify Aşağıda Heapify fonksiyonun sözde kodu verilmiştir. Heapify fonksiyonu i indeks değerine sahip düğüm için çağrılmaktadır. i indeksli düğüm sol ve sağ çocukları ile karşılaştırılmakta ve en büyük değer belirlenmektedir. Eğer en büyük değer i indeksli düğüm değilse, en büyük değere sahip olan çocuğu ile yer değiştirilerek Heapify fonksiyonu tekrar çağrılmaktadır. Bu şekilde yaprak düğümlere kadar yukarıdan aşağı inilir, bir yaprak düğüm için çocuklarının indeks değerleri heap-size[a] dan büyük olacağı için Heapify fonksiyonu bir daha çağrılmayacak ve işlem sonlanacaktır. Bahar 2017 Doç. Dr. Suat Özdemir 10
Heap Özelliğinin Korunması Heapify Bahar 2017 Doç. Dr. Suat Özdemir 11
Örnek Heapify A dizisinin yerleştirildiği yukarıdaki ağaçta 1 indeksli kök düğümün Heap özelliğini bozduğu görülmektedir. Bu durumda Heapify(A,1) fonksiyonu çağrılarak ağaçta Heap özelliği sağlanabilir. Bahar 2017 Doç. Dr. Suat Özdemir 12
Örnek Heapify Heapify(A,1) çağrıldığında 1 numaralı düğüm çocukları ile karşılaştırılır ve en büyük değer belirlenir. Sol çocuk 12 en büyük olduğu için sözde koddaki enbuyuk değişkeni sol çocuğun indeks değerine eşit olur (Adım 4). Daha sonra 8. Adımda i değişkeni ve enbuyuk değişkeni birbirine eşit olmadıkları için yer değiştirme yapılarak Heapify(A,2) fonksiyonu çağrılır. Bahar 2017 Doç. Dr. Suat Özdemir 13
Örnek Heapify Bahar 2017 Doç. Dr. Suat Özdemir 14
Örnek Heapify Yeni Heap üzerinde Heapify(A,2) çağrıldığında Heap özelliğinin sağlanmadığı görülür ve aynı işlemler yapılarak 2 ve 5 indeksli düğümler arasında yer değiştirme yapılır. Heapify (A,2) çağrıldıktan sonra 10 ve 9 yer değiştirmiş olur. Ağaç artık Heap özelliği göstermektedir. 5 indeks değerine sahip düğüm için Heapify (A,5) çağrılır ancak 5. düğümün çocukları olan 10. ve 11. düğümler sözde kodun 3. ve 6. adımlarında heap-size değerinden büyük olacakları için işlem sonlanır. Bahar 2017 Doç. Dr. Suat Özdemir 15
Heapify fonksiyonunun çalışma zamanı analizi En kötü durumda Heapify fonksiyonu üstteki örnekte olduğu gibi kök düğümden başlayıp yaprakta sonlanabilir. Ağaç yüksekliği kadar Heapify fonksiyonu çağrılmış olur. Heapify fonksiyonun her çalışması sadece bir yer değiştirme işlemi içerdiğinden Θ(1) zaman alır. Bahar 2017 Doç. Dr. Suat Özdemir 16
Heapify fonksiyonunun çalışma zamanı analizi En kötü durumda ağaç sol alt ağaçta 2n/3 ve sağ alt ağaçta n/3 düğüm olacak şekilde bölünür. Bu durumda T(n) = T(2n/3) + θ(1) Master metot 2. durum ile O n log 3 21 lgn = O(lgn) Bu duruma göre en kötü durumda Heapify fonksiyonu Θ(lgn) zaman alacaktır. Bahar 2017 Doç. Dr. Suat Özdemir 17
Heap Oluşturulması Build Heap oluşturma işlemi Build fonksiyonu ile gerçekleştirilir. Heap formatına sokulmak istenen bir A dizisi için Build fonksiyonu Heapify fonksiyonunu A dizisinin yapraklar hariç tüm elemanları için aşağıdan başlayarak çağırır. Yaprak düğümlerin çocuğu olmadığı için zaten Heap özelliği gösterirler. Burada Heap veri yapısının özelliğine göre ağaç içerisindeki elemanların yarısının yapraklarda olacağına dikkat ediniz. En son kök eleman için Heapify fonksiyonu çağrıldığında Heap oluşmuş olur. Aşağıda Build fonksiyonunun sözde kodu verilmiştir. Bahar 2017 Doç. Dr. Suat Özdemir 18
Heap Oluşturulması Build Bahar 2017 Doç. Dr. Suat Özdemir 19
Örnek - Build Aşağıda verilen A dizisinde bir Heap oluşturulmak isteniyor. 11 21 9 18 10 16 19 Bahar 2017 Doç. Dr. Suat Özdemir 20
Örnek - Build A dizisi aşağıdaki gibi ağaca yerleştirilirse Heap özelliğini göstermediği görülür. Bu diziden Heap oluşturmak için Build fonksiyonu 3 indeksli elemandan başlamak üzere kök elemana kadar Heapify fonksiyonunu çağırır (Adım 2 de floor(7/2)=3). Bahar 2017 Doç. Dr. Suat Özdemir 21
Örnek - Build Heapify(A,3) çağrıldığında ağaçtaki değişiklik. (9 ve 19 yer değiştirdi) Bahar 2017 Doç. Dr. Suat Özdemir 22
Örnek - Build Heapify(A,2) çağrıldığında ağaçtaki değişiklik. (21 çocuklarından büyük olduğu için yer değiştirme olmadı) Bahar 2017 Doç. Dr. Suat Özdemir 23
Örnek - Build Heapify(A,1) çağrıldığında ağaçtaki değişiklikler. (Önce 11 ve 21 yer değiştirir, 11 Heap özelliğini bozacağı için 18 ile yer değiştirir) Bahar 2017 Doç. Dr. Suat Özdemir 24
Örnek - Build Kök düğüm için Heapify fonksiyonu çağrıldıktan sonra tüm ağaç artık Heap özelliği göstermektedir. Bahar 2017 Doç. Dr. Suat Özdemir 25
Build fonksiyonunun çalışma zamanı analizi Build fonksiyonunun çalışma zamanı nedir? Düğümlerin yarısı için çağrılıyor Heapify kullanıyor? Bahar 2017 Doç. Dr. Suat Özdemir 26
Build fonksiyonunun çalışma zamanı analizi Basit bir analiz ile Build fonksiyonunun O(nlgn) zamanda çalıştığı görülebilir (n/2 defa Heapify fonksiyonun çalışması gerekmektedir). Ancak daha detaylı bir analiz ile fonksiyonun çok daha düşük çalışma zamanına sahip olduğu da gösterilebilir. Buradaki önemli nokta çağrılan Heapify fonksiyonlarının çoğunluğunun yüksekliği fazla olmayan düğümler için olmasıdır. Bahar 2017 Doç. Dr. Suat Özdemir 27
Build fonksiyonunun çalışma zamanı analizi Daha önceki bölümlerde n belirtildiği üzere bir Heap te h yüksekliğindeki düğüm sayısı en fazla 2h+1 olabilir. Buna göre her yükseklikte çağrılan Heapify fonksiyonlarını ayrı ayrı düşünerek çalışma zamanını hesaplarsak aşağıdaki ifadeyi elde etmiş oluruz: lgn h=0 n lgn 2 h+1 O h = O(n h=0 h 2 h+1 ) Bu ifade Stirling s yaklaşımına göre sadeleştirilirse çalışma zamanı olarak O(n) elde edilir. Bahar 2017 Doç. Dr. Suat Özdemir 28
Build fonksiyonunun çalışma zamanı analizi Stirling's approximation n x nx ( 1 x) n0 2 Eğer x=1/2 ise (1/2) n =1/(2 n ) olur. Bu nedenle: n0 h 1 2 h 1/ 2 (1 1/ 2) 2 2 T ( n) O lgn h1 n 2 h h On h1 h 2 h O( n2) O( n) Bahar 2017 Doç. Dr. Suat Özdemir 29
Heap Sort Sıralanacak bir A dizisi için Heap Sort algoritması Build fonksiyonu yardımıyla Heap oluşturur. Oluşan Heap te kökte yer alan elemanın en büyük değer olduğu bilindiğinden bu değer en son yaprak (en büyük indeks değerli yaprak) ile yer değiştirilir. Son elaman Heap dışına alınır ve kök için Heapify fonksiyonu çağrılarak Heap özelliği korunur. Yeni ağaç için de aynı işlemler yapılarak sıralama işlemi tamamlanmış olur. Bahar 2017 Doç. Dr. Suat Özdemir 30
Heap Sort Bahar 2017 Doç. Dr. Suat Özdemir 31
Örnek: Heap Sort Verilen bir A dizisinden aşağıdaki Heap elde edilmiş olsun. Her aşamada kök eleman en sondaki eleman ile yer değiştirilir, son elaman Heap dışına alınır ve Heap özelliği korunur. Bahar 2017 Doç. Dr. Suat Özdemir 32
Örnek: Heap Sort Bahar 2017 Doç. Dr. Suat Özdemir 33
Bahar 2017 Doç. Dr. Suat Özdemir 34
Bahar 2017 Doç. Dr. Suat Özdemir 35
Bahar 2017 Doç. Dr. Suat Özdemir 36
En son kök eleman da sıralanmış dizinin en başına eklenir ve sıralı dizi elde edilmiş olur. Bahar 2017 Doç. Dr. Suat Özdemir 37
Heap Sort Algoritması Çalışma Zamanı Analizi Heapify ve Build fonksiyonlarının çalışma zamanı analizi yapılmış ve sırası ile O(lgn) ve O(n) olarak bulunmuştu. Heap Sort algoritması bir defa Build fonksiyonunu ve n defa da Heapify fonksiyonunu çağırmaktadır. Bu nedenle Heap Sort algoritmasının en kötü çalışma zamanı O(nlgn) değerine eşit olur. Bu Merge Sort algoritmasının çalışma zamanına eşittir. Ayrıca Heap Sort yerinde sıralama yapmakta ve ek yere ihtiyaç duymamaktadır. Bahar 2017 Doç. Dr. Suat Özdemir 38
Priority Queues Heap önceliklendirilmiş kuyruk yapılarını uygulamak için kullanılır Kuyruk dinamik olarak S tane değeri tutar Eğer max heap olarak uygulanırsa en büyük eleman her zaman kuyruğu başında yer alır Yerleştirme, çıkarma, değer artırma/azaltma (güncelleme) gibi tüm işlemler O(lgn) zaman alır Bahar 2017 Doç. Dr. Suat Özdemir 39
Priority Queues Max(S,x) Kökde yer alan değeri getirir. O(1) zaman alır. Max-Heap-Insert(S,x) En sona bir değer ekler ve parental karşılaştırarak köke kadar çıkar Bahar 2017 Doç. Dr. Suat Özdemir 40
Insert Örnek 11 değeri Heap e eklenecek 1 14 1 14 2 3 7 10 4 5 6 7 6 5 9 2 2 3 7 10 4 5 6 7 11 5 9 2 11 6
Insert Örnek Köke kadar çıkılır 1 14 2 3 11 10 4 5 6 7 7 5 9 2 6
Extract Max Kökte yer alan değeri çıkartır. Heapify fonksiyonu ile tekrar heap oluşturur