1 / 70

MIT503 Veri Yapıları ve algoritmalar Algoritma geliştirme – böl-ve-fethet yaklaşımı

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ı

dian
Download Presentation

MIT503 Veri Yapıları ve algoritmalar Algoritma geliştirme – böl-ve-fethet yaklaşımı

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. MIT503 Veri Yapıları ve algoritmalarAlgoritma geliştirme– böl-ve-fethet yaklaşımı Y. Doç. Yuriy Mishchenko

  2. 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

  3. 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ı

  4. 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ı

  5. 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ş

  6. 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

  7. 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ş

  8. 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

  9. 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ı

  10. Böl-ve-fethet yaklaşımı • Böl-ve-fethet yaklaşımı, algoritma geliştirme en esas genel metodudur

  11. 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

  12. 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

  13. 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

  14. 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 !

  15. 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

  16. 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)

  17. 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

  18. 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

  19. 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

  20. Naif sıralama • Naif sıralama algoritmaları • Seçme sıralama • Ekleme sıralama • Kabarcık sıralama

  21. 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.

  22. 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ü

  23. 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

  24. 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

  25. 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

  26. 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ç

  27. 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

  28. 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)

  29. 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

  30. 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

  31. 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

  32. 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ş

  33. 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

  34. 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

  35. Böl-ve-fethet sıralama • Böl-ve-fethet sıralama algoritmaları • Hızlı sıralama (quicksort) • Birleşme sıralama (mergesort)

  36. 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

  37. 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

  38. 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ı

  39. 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ş

  40. 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)

  41. 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)

  42. 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 ...

  43. 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

  44. mergesort 2 7 15 18 30 5 11 13 17 23 Daha küçük İşaretçi

  45. mergesort 2 7 15 18 30 5 11 13 17 23 Daha küçük Soldan sağa ilerliyor 2

  46. mergesort 2 7 15 18 30 5 11 13 17 23 Daha küçük 2 5

  47. mergesort 2 7 15 18 30 5 11 13 17 23 Daha küçük 2 5 7

  48. mergesort 2 7 15 18 30 5 11 13 17 23 Daha küçük 2 5 7 11

  49. 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

  50. mergesort 2 7 15 18 30 5 11 13 17 23 Daha küçük 2 5 7 11 13 15

More Related