Algoritmalar Sıralama Problemi ve Analizi Bahar 2017 Doç. Dr. Suat Özdemir 1
Sıralama Problemi ve Analizi Bu bölümde öncelikle bir diğer böl-ve-yönet yöntemine dayalı algoritma olan Quick Sort algoritması üzerinde durulacaktır Merge Sort algoritmasına karşı üstünlükleri gösterilecektir. Sıralama probleminin çözümünde veri yapılarından nasıl faydalanabileceğini görmek açısından Heap veri yapısına bağlı Heap Sort algoritması işlenecektir. Sıralama probleminin çözümünde elde edilebilecek en düşük çalışma zamanını elde edebilmek için doğrusal zamanda çalışan algoritmalar üzerinde durulacaktır. Bahar 2017 Doç. Dr. Suat Özdemir 2
Çabuk Sıralama (Quick Sort) Quick Sort adı ile de bilinir. En kötü çalışma zamanı O n 2 Gerçek hayat problemlerinin çözümünde çok sık kullanılan bir sıralama algoritmasıdır. Bu çalışma zamanı aslında Merge Sort ile elde ettiğimiz O nlgn logaritmik değerinden oldukça yüksektir. Neden Quick Sort algoritması gerçek hayatta çok kullanılmaktadır? Quick Sort algoritmasının oldukça düşük O nlgn ortalama çalışma zamanına sahiptir Merge Sort performansına eşit olan bu değer içinde bulunan ve asimptotik analiz sırasında ihmal edilen sabit değerler de oldukça küçüktür. Algoritma yerinde sıralama yapar. Sıralama için ek yere ihtiyaç duymaz. Merge Sort algoritması sıralama esnasında bölünen dizilerin ayrı bir yere kopyalanmasını gerektirir Bu nedenle özellikle yer kısıtı olan problemlerde Quick Sort algoritması daha çok tercih edilebilmektedir. Bahar 2017 Doç. Dr. Suat Özdemir 3
Çabuk Sıralama (Quick Sort) Merge Sort gibi Quick Sort algoritması da böl-ve-yönet metodolojisi üzerine kurgulanmıştır. Algoritmanın en çok zaman alan temel işlemi sıralanacak olan diziyi ikiye bölen Partition (Böl) fonksiyonudur. Merge Sort da en çok zaman alan işlemin birleştirme işini yapan Merge fonksiyonuydu. Quick Sort algoritmasının üç temel basamağı aşağıda verilmiştir. Algoritma ile A b s formatında verilen bir diziyi sıralamaktadır. Böl: A b s dizisini A b r 1 ve A r + 1 s gibi iki alt diziye böl. Öyle ki A b r 1 alt dizisindeki her eleman A r den küçük veya eşit ve A r + 1 s alt dizisindeki her bir eleman da A r den büyük olsun. İndeks r değerini Partition fonksiyonunu kullanarak hesapla. Yönet: A b r 1 ve A r + 1 s alt dizilerini Quick Sort algoritmasını özyineli şekilde çağırarak sırala. Birleştir: Alt diziler yerinde sıralanmaktadır bu nedenle birleştirme için herhangi bir işlem yapılmasına gerek yoktur. A b s dizisi yerinde küçükten büyüğe sıralanmıştır. Bahar 2017 Doç. Dr. Suat Özdemir 4
Çabuk Sıralama (Quick Sort) Algoritma girdi olarak A dizisi ve A dizinin başlangıç ve bitiş indeks değerlerini almaktadır. n elemanlı A dizisini sıralamak için algoritmanın Quick Sort (A,1, n) şeklinde çağrılması yeterli olacaktır. Bahar 2017 Doç. Dr. Suat Özdemir 5
Dizinin bölünmesi (Partition) Quick Sort algoritmasının temel fonksiyonu dizinin ikiye bölünmesi işlemidir. Partition işlemi öncelikle sıralanacak dizi içerisinde bir pivot eleman seçer ve diziyi bu pivot elemandan küçük değerler solda büyük değerler sağda kalacak şekilde yeniden organize ederek ikiye böler. Pivot eleman en soldaki, en sağdaki, ortadaki ya da rastgele bir eleman olarak seçilebilir. Bu ders kapsamında pivot eleman olarak dizinin en sağındaki eleman kullanılacaktır. Bahar 2017 Doç. Dr. Suat Özdemir 6
Dizinin bölünmesi (Partition) Bahar 2017 Doç. Dr. Suat Özdemir 7
Dizinin bölünmesi (Partition) A dizisinin en sağındaki eleman pivot olarak seçilmekte j indeksi ile dizinin en solundan başlamak üzere tüm elamanlar ile karşılaştırılmaktadır. A[ j ] pivot şartı sağlandığında j indeksinin gösterdiği değer dizinin sol kısmına alınmaktadır. Bu işlem dizinin tüm elemanları için yapıldığında pivot değerinden küçükler dizinin sol tarafında büyükler ise sağ tarafında kalmaktadır. Pivot eleman ise hala dizinin en sağında yer alır. 7. Adımda gerçekleştirilen yer değiştirme işlemi ile pivot değer kendinden büyük değerlerin en solundaki değer ile yer değiştir ve fonksiyon pivot değerin indeks değerini yani dizinin ikiye bölüneceği değeri döndürür. Bahar 2017 Doç. Dr. Suat Özdemir 8
Örnek Bahar 2017 Doç. Dr. Suat Özdemir 9
Örnek Bahar 2017 Doç. Dr. Suat Özdemir 10
Örnek Bahar 2017 Doç. Dr. Suat Özdemir 11
Örnek Tüm elamanlar pivot ile karşılaştırılmıştır. Partition işleminin tamamlanması için son olarak pivot elemanın yer değiştirmesi gerekmektedir (Adım 7.) Bahar 2017 Doç. Dr. Suat Özdemir 12
Partition Örnek 2 2 8 7 p 1 3 5 6 4 r Bahar 2017 Doç. Dr. Suat Özdemir 13
Partition Örnek 2 i j 2 8 7 p 1 3 5 6 4 r pivot: 4 Bahar 2017 Doç. Dr. Suat Özdemir 14
Partition Örnek 2 i j 2 8 7 p 1 3 5 6 4 r pivot: 4 Bahar 2017 Doç. Dr. Suat Özdemir 15
Partition Örnek 2 i j 2 8 7 p 1 3 5 6 4 r pivot: 4 Bahar 2017 Doç. Dr. Suat Özdemir 16
Partition Örnek 2 i j 2 8 7 p 1 3 5 6 4 r pivot: 4 Bahar 2017 Doç. Dr. Suat Özdemir 17
Partition Örnek 2 i 2 8 7 p j 1 3 5 6 4 r pivot: 4 Bahar 2017 Doç. Dr. Suat Özdemir 18
Partition Örnek 2 i j 2 1 7 8 3 5 p 6 4 r pivot: 4 Bahar 2017 Doç. Dr. Suat Özdemir 19
Partition Örnek 2 i j 2 1 3 8 7 5 p 6 4 r pivot: 4 Bahar 2017 Doç. Dr. Suat Özdemir 20
Partition Örnek 2 2 1 3 8 7 5 p i j 6 4 r pivot: 4 Bahar 2017 Doç. Dr. Suat Özdemir 21
Partition Örnek 2 2 1 3 8 7 5 p i j 6 4 r pivot: 4 Bahar 2017 Doç. Dr. Suat Özdemir 22
Partition Örnek 2 i 2 1 3 4 7 5 6 8 p r pivot: 4 Bahar 2017 Doç. Dr. Suat Özdemir 23
Quick Sort Algoritmasının Performansı Quick Sort algoritması Partition fonksiyonunu alt dizileri bölmek için de kullanır ve kendisini özyineli bir şekilde çağırarak diziyi yerinde sıralar. Yukarıda belirtildiği üzere algoritmanın çalışma performansını belirleyen Partition fonksiyonudur. Partition fonksiyonun performansı ise yapılan bölünmenin ne kadar dengeli olduğuna bağlıdır. Partition fonksiyonu ile elde edilebilecek en iyi bölünme sol ve sağ alt dizilerin büyüklük olarak birbirine eşit olması durumudur. Bu durumda algoritmanın çalışma zamanı Merge Sort a eşit olur. Bahar 2017 Doç. Dr. Suat Özdemir 24
Quick Sort Algoritmasının Performansı En kötü bölünme ise sağ ya da sol alt dizide hiç eleman bulunmamasıdır ki, bu durumda Quick Sort algoritmasının çalışma zamanı Insertion Sort a eşit olur. Bölünme pivot değerine göre yapıldığı için, pivot değerinin nasıl seçildiği algoritma performansı üzerinde doğrudan bir etkiye sahiptir. Sürekli en sondaki (ya da baştaki) değeri seçmek her zaman iyi bir bölünmeye neden olmayabilir. Sıralanacak olan dizinin ortanca (median) değerinin pivot olarak seçilmesi her zaman dengeli bir bölünme sağlar. Ancak ortanca değerin bulunması özellikle büyük boyutlu diziler için sorun oluşturur ve algoritmanın çalışma zamanını artırır. Bahar 2017 Doç. Dr. Suat Özdemir 25
Quick Sort Algoritmasının Performansı Pratik bir çözüm olarak dizi içinde bazı elemanlar seçilerek bu değerlerin ortancası bulunarak pivot eleman olarak kullanılabilir. Örneğin dizinin ilk üç değerinin ortancası ya da baş, orta ve son değerlerin ortancası bulunarak pivot değer olarak seçilebilir. Bu pratik çözüm ile algoritmanın çalışma performansının Merge Sort a eşit olması sağlanabilir. Buna ilişkin bir örnek aşağıda verilmiştir. Bahar 2017 Doç. Dr. Suat Özdemir 26
Örnek: Quick Sort Pivot elemanın seçilmesi Yukarıdaki dizi için algoritmada Partition fonksiyonu çağrıldığında, eğer en son eleman pivot olarak seçilirse bölünme aşağıdaki gibi dengesiz olacaktır. Bunun yerine dizinin ilk üç elemanı dikkate alınır ve bunların ortanca değeri kullanılırsa daha dengeli bir bölünme elde edilebileceği görülür. İlk üç eleman olan 9, 20 ve 16 değerlerinin ortanca değeri 16 değeridir. Bahar 2017 Doç. Dr. Suat Özdemir 27
Örnek: Quick Sort Pivot elemanın seçilmesi Bahar 2017 Doç. Dr. Suat Özdemir 28
En Kötü Çalışma Zamanı Analizi Quick Sort algoritmasında en kötü çalışma zamanı durumu bölünme sonucunda oluşan alt dizilerden birinin (n 1) diğerinin de 0 elemanlı olması durumudur Bölünme sonucunda oluşan bu dengesiz durumun özyineli olarak Quick Sort algoritmasının her çağrılışında gerçekleştiğini kabul edelim. Dengesiz bölünme aslında yukarıda pivot elemanın seçilmesi örneğinde olduğu gibi dizi içerisindeki en büyük elemanın pivot olarak seçilmesi durumda oluşur. Dizi zaten sıralı ise sürekli en sondaki eleman pivot olarak seçileceği için Partition fonksiyonunun her çağrılışında en kötü bölünme gerçekleşir. Bahar 2017 Doç. Dr. Suat Özdemir 29
En Kötü Çalışma Zamanı Analizi Basit Maliyet analizi: c[n + (n 1) + (n 2) + + 2] = c θ(n 2 ) = θ(n 2 ) Bahar 2017 Doç. Dr. Suat Özdemir 30
En Kötü Çalışma Zamanı Analizi Formal analiz: Partition işlemi bu durumda her elemanın pivot elemanla karşılaştırılması (Adım 4.) ve swap işlemlerini gerektirir. Bu işlemler n defa yapılacağı için bölünme için gerekli olan zaman θ(n) olacaktır. Alt diziler için maliyete bakacak olursak; 0 elemanlı alt dizi için çağrılacak Quick Sort T 0 = θ(1) olacaktır. Diğer taraftaki alt dizi (n-1) elemanlıdır ve gerekli çalışma zamanı T n 1 olarak ifade edilir. Bu durumda en kötü çalışma zamanı analizi için algoritmanın tekrarlı ifadesi T n = T n 1 + T 0 + θ(n) Bahar 2017 Doç. Dr. Suat Özdemir 31
En Kötü Çalışma Zamanı Analizi Bu ifade tekrarlı ifade ağacına yerleştirildiğinde çalışma zamanının T n = θ n 2 olduğu rahatlıkla görülür. Bahar 2017 Doç. Dr. Suat Özdemir 32
En İyi Çalışma Zamanı Analizi En iyi çalışma zamanı durumu ise oluşan alt dizilerin her ikisinin de n/2 boyutunda olması durumudur. Sıralanacak dizi tek sayıda değerden oluşursa her iki alt dizide n/2 boyutunda olur, eğer çift sayıda elemandan oluşan bir dizi bölünüyorsa bir alt dizi n/2 diğer (n/2)-1 boyutunda olacaktır. Bu durumda tekrarlı ifade T n = 2T n/2 + θ(n) olur. Bu tekrarlı ifade ise Master Metot 2. durum ile çözülebilir ve elde edilen asimptotik ifade Merge Sort algoritmasına eşit olan T n = O(nlgn) ifadesi olacaktır. Bahar 2017 Doç. Dr. Suat Özdemir 33
Ortalama Çalışma Zamanı Analizi Quick Sort algoritmasının çalışma zamanı en kötü durumda Insertion Sort algoritmasına eşit olmasına rağmen gerçek hayatta çok fazla kullanılır olduğu ifade edilmişti. Bunun nedeni en kötü çalışma zamanını oluşturacak durumun kolay kolay ortaya çıkmamasıdır (her zaman en büyük değerin pivot eleman olarak seçilmesi durumu). Ayrıca Quick Sort algoritmasının performansı bölünme en kötüye çok yakın dahi olsa yine en iyi çalışma zamanı performansına yakındır. Bahar 2017 Doç. Dr. Suat Özdemir 34
Ortalama Çalışma Zamanı Analizi Ortalama çalışma zamanı bölünmelerin ne en iyi ne de en kötü olduğu durumda ortaya çıkar. Biz örneğimizde bölünmelerin en kötüye daha yakın bölünmeler olduğunu varsayacağız. Örneğin Partition fonksiyonunun her zaman 9 a 1 oranında bölünme yaptığını varsayalım. Bölme işlemi için cn gibi sabit bir zaman harcandığını kabul edelim. Bu durumda oluşan tekrarlı ifade T n = T 9n/10 + T n/10 + cn Bahar 2017 Doç. Dr. Suat Özdemir 35
Ortalama Çalışma Zamanı Analizi Bu durum için tekrarlı ifade ağacı çizilirse elde edilen asimptotik notasyonun T(n) = O nlgn olduğu görülecektir. Literatürde yapılan çalışmalar gerçek hayatta rastgele bir girdi için bölünmelerin %80 nin 9 a-1 den daha iyi, %20 sinin ise 9 a-1 den daha kötü olduğunu göstermektedir. Bu nedenle Quick Sort algoritmasının performansı ortalama durum için en iyi durum çalışma zamanına eşittir denilebilir. Örneğin pivot elemanın rastgele olarak seçildiği Randomized-Quick Sort algoritmasının performansı da T(n) = O nlgn e eşittir. Bahar 2017 Doç. Dr. Suat Özdemir 36
Ortalama Çalışma Zamanı Analizi Nasıl lgn kullandık? log 10/9 n = log 2n = log 2n = c(log log 2 (10/9) 0.152 2n) Bahar 2017 Doç. Dr. Suat Özdemir 37