700 likes | 1.16k Views
MIT503 Veri Yapıları ve algoritmalar Algoritma geliştirme – böl-ve-fethet yaklaşımı. Y. Doç. Yuriy Mishchenko. Algoritma geliştirme. Ders planı Böl-ve-fethet genel yaklaşımı ve kavramları S ıralama sorunu ve böl-ve-fethet yaklaşımı
E N D
MIT503 Veri Yapıları ve algoritmalarAlgoritma geliştirme– böl-ve-fethet yaklaşımı Y. Doç. Yuriy Mishchenko
Algoritma geliştirme Ders planı • Böl-ve-fethet genel yaklaşımı ve kavramları • Sıralama sorunu ve böl-ve-fethet yaklaşımı • Naif sıralama algoritmaları–seçme sıralama, ekleme sıralama ve kabarcık sıralama • Böl-ve-fethet sıralama algoritmaları–hızlı sıralama (quicksort), birleşme sıralama (mergesort) ve hipsort (heapsort) • Özel tamsayı sıralama algoritmaları–sayım sıralama, kova sıralama ve radix sıralama
Veri yapılarının uygulanması • Bugüne kadar birkaç algoritma ile karşılaştık; veri yapıları algoritmaları: • Yığın, kuyruk (LİFO/FİFO – son-geldi-ilk-çıktı/ilk-geldi-ilk-çıktı), ve öncelikli kuyruklar daki yeni nesne koyup almaalgoritmaları • Bağlantılı listeler deki nesne koyma, alma ve silme algoritmaları • Arama ağaçlarındaki nesne koyma, alma, silme ve min/max aramaalgoritmaları
Veri yapılarının uygulanması • Arama ağacında min ve max operasyonlarının algoritmaları hatırlatma: 9 max min 5 15 3 7 12 18 1 4 11 14 arama ağaçları
Veri yapılarının uygulanması Arama ağaçlarının min/max algoritmaları min sözde kodup:=ağacın kökü p’nin sol çocuğu varKEN p:=p’nin sol çocuğu döngünün sonu yaz p //bu mindir başlangıç p’nin sol çocuğu var? evet p:=p’nin sol çocuğu max sözde kodu p:=ağacın kökü p’nin sağ çocuğu varKEN p:=p’nin sağ çocuğu döngünün sonu yaz p //bu maxdır hair yaz p bitiş
Veri yapılarının uygulanması • Arama ağacında arama operasyonunun algoritması • Köküyle başlarken anahtarları inceleyin; hedef anahtardan daha küçükse, sola aksi halde sağa gidin hedef=14 9 14? 5 15 3 7 14? 12 18 1 4 11 14
Veri yapılarının uygulanması başlangıç Arama ağacın arama algoritması eşit ise Arama sözde kodup:=ağacın kökü DÖNGÜ p’nin değeri hedefe eşit ISEdöngüden çıkın p’nin değeri hedeften daha büyük ISE p:=p’nin sol çocuğu p’nin değeri hedeften daha küçük ISE p:=p’nin sağ çocuğu p’nin çocukları varKEN yaz p p’nin değeri ve hedef karşılaştırın p:=p’nin sol çocuğu daha büyük ise daha küçük ise p:=p’nin sağ cocuğu yaz p bitiş
Genel algoritma geliştirme • Daha çok algoritma var tabiki... • Çeşitli sorular için çözümleri sağlarlar; • Hem basit hem ileri pratik sorunlar için kullanılırlar • Genellikle, farklı sorunların hepsi için ayrı algoritmalar oluşturmak zorundayız • Böyle ilk algoritmalar primitif ve verimsiz olabilirler, ama zamanla daha ileri algoritmalar bulunur–algoritma geliştirme
Algoritma geliştirme • Algoritma geliştirme esas metodları: • Böl-ve-fethet yaklaşımı • Açgözlü (yerel) yaklaşımı • Dynamik programlama yaklaşımı • Özyineleme yaklaşımı
Böl-ve-fethet yaklaşımı • Böl-ve-fethet yaklaşımı, algoritma geliştirme en esas genel metodudur
Böl-ve-fethet yaklaşımı • Böl-ve-fethet’in ana fikri: • Bir sorun için bir primitif algoritma varsa; • Bu primitif algoritma “kötü” algoritmadır, yani “N” boyutlu girdiler için N2vakit gerekiyor (örneğin–basit sıralama algoritmaları) • Bu durumda, “süper lineer zaman algoritması” diyoruz
Böl-ve-fethet yaklaşımı • Böl-ve-fethet’in ana fikri: • Bu durumda, böyle strateji düşünülebilir: N boyutlu sorundan yeni iki daha küçük N/2 boyutlu alt sorun yapalım ve şunlar için “kötü” algoritmayı iki kez kullanalım
Böl-ve-fethet yaklaşımı • Böl-ve-fethet’in ana fikri: • Bu durumda ne olacak? İki alt sorun için iki kez süper lineer algoritmasını kullanma 2 kat daha az vakit gerekecek–T=2(N/2)2
Böl-ve-fethet yaklaşımı • Böl-ve-fethet’in ana fikri: • Farkedin ki, N/2 boyutlu alt sorunlarıtekrar yeni daha küçük N/4 boyutlu sorunlara bölebiliriz, ve şu için tekrar algoritmamızı birkaç kez kullanabiliriz • Dört kez N/4-boyutlu algoritmayı kullanma4 kat daha az vakit gerekiyor–4*C*(N/4)2 !
Böl-ve-fethet yaklaşımı • Bu fikri kullanarak, “süper lineer zaman algoritması” varsa sorunu her zaman daha küçük parçalara bölüp parçalarını ayrı ayrı yapınca sonucunu daha az vakitle sağlayabiliriz
Böl-ve-fethet yaklaşımı • Böl-ve-fethet yaklaşımında böyle önemli kavramlar var: • Vakit gereksinimi, N boyutlu sorun için gereken çözme zamanı–Ta(N)=O(Nk) (genellikle süper lineer zaman) • Alt sonuçları toplama vakit gereksinimi, N boyutlu alt sonuçları tek sonuca toplamak için gereken zaman–Tt(N)=O(N) (genellikle lineer zaman)
Böl-ve-fethet yaklaşımı • Böl-ve-fethet yaklaşımında önemli kavramlar: • Toplam vakit gereksinimi bu durumda bu şekilde hesaplanır–Ta(N/2)+ Ta(N/2)+Tt(N) • EĞER Ta(N/2)+ Ta(N/2)+Tt(N) < Ta(N) DOĞRU İSE, böl-ve-fethet yaklaşımı avantajlı oluyor
Böl-ve-fethet yaklaşımı • Böl-ve-fethet ünlü uygulamaları: • Hızlı Fourier Dönüşümü, dünyadaki böl-ve-fethet yaklaşımının en ünlü uygulamasıdır • Sinyaller frekans gösterimine çevirmek için kullanılan matematiksel operasyonu (dönüşüm) • Pratik uygulamalarda çok kullanılır • Naif uygulaması O(N2) vakit gerekiyor • Böl-ve-fethet metoduyla O(N log N) vakitle hesaplanabilir • Sıralama – klasik böl-ve-fethet uygulamasıdır • Sıralamanın naif uygulaması O(N2) vakit gerekiyor (kabarcık) • Böl-ve-fethet metoduyla O(N log N) vakitle yapılabilir
Böl-ve-fethet sıralama • Sıralama sorunu hatırlatma • Bir sayısal dizi var, N boyutlu • O dizinin sıralanmış olmasını istiyoruz • Sıralanmış veriler, arama için daha çok avantajlı (sözlükleri düşünün) , ve birçok diğer önemli uygulama var 15 2 2 2 13 5 11 6 7 7 9 5 11 2 13 6 9 15 x x
Naif sıralama • Naif sıralama algoritmaları • Seçme sıralama • Ekleme sıralama • Kabarcık sıralama
Seçme sıralama • Ana fikri • Çıktı dizisinin birinci pozisyonu için verilen dizideki en küçük sayıyı bulup çıktının 1. pozısyonuna koyuyoruz • Çıktı dizisinin ikinci pozisyonu için verilen dizideki en küçük kalan sayıyı bulup çıktının 2. pozısyonuna koyuyoruz • Üçüncü pozısyon için, verilen dizideki en küçük kalan sayısını bulup tekrar çıktının 3. pozısyonuna koyuyoruz • v.b.
Seçme sıralama • Seçme sıralama en küçük birinci 2 15 2 2 15 2 2 2 5 13 15 13 11 11 15 13 11 13 7 7 7 11 5 5 5 7 2 2 6 6 6 6 9 9 9 9 x x x x buraya bakın yeni en küçük ikinci yeni en küçük üçüncü yeni en küçük dördüncü
Seçme sıralama Seçme sıralama sözde kodusonuç:=boş dizi p:=giriş dizi p boş değil iken a:=p’deki min nesne seçin; sonuç:=(sonuç, a); p’den a’yı çıkartın; döngü sonuyaz sonuç başlangıç a:=p’den min nesne seçin Sonuca a’yı ekleyin p’dan a’yı çıkartın yok p’de kalan nesneler var? var bitiş yaz p
Seçme sıralama • Seçme sıralamada, bütün kalan diziyi tekrar tekrar incelememiz lazım • İlk pozısyon için, N sayı incelememiz lazim • İkinci pozısyon için, N-1 sayı incelememiz lazim • Üçüncü pozısyon için, N-2 sayı incelememiz lazim • vb • Toplam, N(N-1)/2=O(N2) operasyon yapıyoruz
Ekleme sıralama • Ana fikri • Sonucu sıralanmış şekilde baştan oluşturuyoruz • Bunun için, verilen diziden bir sayı alırken o sayıyı her zaman sonuca doğru bir pozisyona ekliyoruz(ama bunun için ikiye bölme kullanmıyoruz) • Doğru pozisyonu bulmak için bütün var olan çıktı dizisini tekrar tekrar incelememiz lazım
Ekleme sıralama • Naif sıralama: ekleme sıralama girdi sonuç 2 15 2 2 15 15 15 15 13 15 11 2 2 2 2 15 13 13 13 13 13 11 15 11 11 11 7 7 7 7 5 5 5 5 2 2 2 2 6 6 6 6 9 9 9 9 x x x x x x x x girdi sonuç girdi sonuç girdi sonuç
Ekleme sıralama başlangıç Seçme sıralamasonuç:=boş dizi p:=giriş dizi p boş değil iken a:=p’den birinci nesne alin i:=0 döngü // doğru pozisiyonu bul i:=i+1 döngü (sonuç[i]>a)iken a, sonucun i-1 pozisiyonuna ekleyin p’den a’yı çıkartın döngü sonuyaz sonuç a:=p’den ilk nesne seçin i=i+1 sonuç[i]>a evet hair a, sonucun i-1 pozisiyonuna ekle p’dan a’yı çıkartın yok var p’de nesneler var? bitiş yaz p
Ekleme sıralama • Ekleme sıralamada, doğru pozisyonu bulmak için bütün çıktı dızısını incelememiz gerekiyor • Bu nedenle, bu algoritma için ortalama N(N-1)/2=O(N2) operasyon gerekiyor • Girdi olarak neredeyse sıralanmış dizi varsa, çok hızlı algoritma olabilir (bu durumda daha avantajlı algoritmadır)
Kabarcık sıralama • Kabarcık sıralama, çok popüler algoritmadır ve her zaman “algoritmalar” derslerinde verilir • Ana fikri • Diziyi inceliyoruz • Bir yanlış sırada çift varsa, yani soldaki sayı sağdaki sayı’dan daha büyükse, çiftteki sayıların pozısyonlarını değiştiriyoruz • Sonra var olan diziyi tekrar inceliyoruz, bu şekilde devam ediyoruz
Kabarcık sıralama • Naif sıralama: kabarcık sıralama girdi 2 2 15 2 2 2 13 13 2 15 11 11 13 13 13 13 11 15 7 11 11 11 15 15 7 7 7 15 7 7 5 5 5 5 5 5 2 2 2 2 2 2 6 6 6 6 6 6 9 9 9 9 9 9 x x x x x x girdi girdi girdi girdi girdi
Kabarcık sıralama kabarcık – üstüne gidiyor • Naif sıralama: kabarcık sıralama girdi 2 2 2 2 15 2 13 11 15 13 2 11 15 13 13 11 13 13 15 7 15 11 11 11 7 7 15 7 7 7 5 5 5 5 5 5 2 2 2 2 2 2 6 6 6 6 6 6 9 9 9 9 9 9 x x x x x x girdi girdi girdi girdi girdi
Kabarcık sıralama başlangıç Kabarcık sıralamap:=giriş_dizi döngü i:=0 p[i]<p[i+1] iken i=i+1; döngü eğer p[i], p’nin sonunda ise döngüden çıkın; // hiç yanlış sırada // çift bulunmadı p[i] ve p[i+1] değiştirin döngü sonuyaz p i=0 i=i+1 p[i]<p[i+1] evet hair evet p’nin sonunda? hair p[i] ve p[i+1] değiştirin yaz p bitiş
Kabarcık sıralama • Kabarcık sıralama, ortalama tekrar O(N2) operasyon gerekiyor • Girdi olarak neredeyse sıralanmış dizi varsa, tekrar onu hızlı sıralayabilir ve avantajlı algoritmadır
Naif sıralama: özet • Naif sıralama algoritmalar • Seçme sıralama – O(N2) • Ekleme sıralama – O(N2) • Kabarcık sıralama – O(N2) • Naif sıralama algoritmalarının hepsi O(N2) algoritmalardır • Böl-ve-fethet strateji burada uygundur
Böl-ve-fethet sıralama • Böl-ve-fethet sıralama algoritmaları • Hızlı sıralama (quicksort) • Birleşme sıralama (mergesort)
Hızlı sıralama (quicksort) • Ana fikri • Naif sıralama algoritması var, O(N2)algoritmasıdır • Dizide bir sayı seçiyotuz (ona “pivot” sayı denir), A • A’dan daha küçük sayıların hepsini solakoyuyoruz, A’dan daha büyük sayıların hepsini sağakoyuyoruz • Soldaki ve sağdaki dizileri ayrı olarak sıralıyoruz • Sonuç için, soldaki dizi sola koyup sağdaki dizi sağa koyuyoruz
Hızlı sıralama (quicksort) • Ana fikri • Sol dizi sadece A’dan daha küçük sayıları ve sağ dizi sadece A’dan daha büyük sayıları içerdiği için sol sıralanmış dizi solda sağ sıralanmış dizi sağda koyup hemen sıralanmış sonucu alıyoruz • Pivot olarak genellikle dizinin ortasındanki sayı seçilir
quicksort • Quicksort sıralama girdi 15 2 2 2 2 2 2 2 5 5 13 5 11 6 6 6 7 7 7 7 5 9 15 9 pivot 11 13 2 11 11 6 13 13 9 15 15 9 x x x x bölme sol dizi sağ dizi yeni sıralayın; tekrar quicksort kullanın ... yeni sıralayın; tekrar quicksort kullanın sol/sağdaki sıralama toplama sıralanmış çıktı
quicksort başlangıç quicksortp:=giriş dizi A:=p[orta] sol_dizi=boş dizi sağ_dizi=boş dizi döngü i=0’dan p’nin boyutuna kadar eğer p[i]<A isep[i] sol_diziye ekleyin aksi halde p[i] sağ_diziye ekleyin eğer sonu döngü sonu sol_dizi:=quicksort(sol_dizi);sağ_dizi:=quicksort(sağ_dizi); p:=(sol_dizi, sağ_dizi) yaz p seç A; sol=boş; sağ=boş;i=0; i++<boyut(p) hair evet hair p[i]<A p->sağ evet p->sol sol=quicksort(sol); sağ=quicksort(sağ); [sol;sağ] bitiş
quicksort • Quicksort sıralama için ortalama O(N log N) operasyon gerekiyor • Ama kötü durumunda O(N2) operasyon gerekebilir (“pivot” kötü şekilde seçilmiş ise)
mergesort • Ana fikri • Naif sıralama algoritması var, O(N2)algoritmasıdır • Quicksort’e benzeyen, ama sol ve sağ diziler için girdi dizisini ortada bölüyoruz (yani “pivot” kullanmıyoruz) • Sol ve sağ parçaları ayrı ayrı sıralıyoruz ve sonra geri topluyoruz (quicksort gibi)
mergesort • Ana fikri • Sol ve sağdaki dizilerde hem çok küçük hem çok büyük sayılar olabilir • Bu nedenle sol ve sağ dizilerin toplaması biraz daha zor olabilir • Verimli şekilde yapılabilir ...
mergesort • Mergesort toplama algoritması: • Sağ ve sol dizide bir işaretçi oluşturuyoruz • İşaretçiler soldan sağa ilerletirken iki işaretçinin daha küçüğü sonuca ekliyoruz
mergesort 2 7 15 18 30 5 11 13 17 23 Daha küçük İşaretçi
mergesort 2 7 15 18 30 5 11 13 17 23 Daha küçük Soldan sağa ilerliyor 2
mergesort 2 7 15 18 30 5 11 13 17 23 Daha küçük 2 5
mergesort 2 7 15 18 30 5 11 13 17 23 Daha küçük 2 5 7
mergesort 2 7 15 18 30 5 11 13 17 23 Daha küçük 2 5 7 11
mergesort 2 7 15 18 30 5 11 13 17 23 Daha küçük 2 5 7 11 13 Sonuç sıralanmış şekilde toplanır
mergesort 2 7 15 18 30 5 11 13 17 23 Daha küçük 2 5 7 11 13 15