YZM 3207- ALGORİTMA ANALİZİ VE TASARIM DERS#6: AZALT VE FETHET YÖNTEMİ
Azalt ve Fethet Algoritmaları Problemi daha küçük bir örneğine çevir: Küçük örneği çöz Çözümü asıl probleme genişlet 3 tipi vardır: Bir sabitle azalt (Genellikle 1) Eklemeli Sıralama (Insertion Sort) Topolojik Sıralama (Topological Sort) Permütasyon, alt küme oluşturma algoritmaları Sabit bir oranla azalt (Genellikle yarıya) İkili Arama (Binary Search) Değişken boyutla azalt Öklid algoritması
Bir Sabitle Azaltma a n üstel problemi a n = a n-1.a ise F(n) = a n problemi özyinelemeli olarak çözülebilir.
Sabit bir Oranla Azaltma a n üstel problemi a n = (a n/2 ) 2 ise
Değişken Oranla Azaltma Öklid in EBOB algoritması
Eklemeli Sıralama En kötü durum: Dizinin ters sıralı olması En iyi durum: Dizinin sıralı olması Ortalama durum: Dağınık dizi
DFS - BFS Etraflı arama bir çizgenin Tüm düğümlerini ve ayrıtlarını sistematik olarak gezen iki önemli algoritmada da uygulanabilir Depth First Search - DFS (Önce Derinlik Arama) Breadth First Search BFS (Önce Genişlik Arama) Bu algoritmalar çizge yapılarının kullanıldığı yapay zeka algoritmaları, Operations Research (Yöneylem Araştırması) gibi algoritmalar için oldukça kullanışlıdır. Ayrıca bağlantı, çevrim gibi temel çizge özelliklerinin incelenmesinde oldukça etkin yöntemlerdir.
Derinlik Öncelikli Arama (DFS) DFS bir çizgeyi dolaşmaya istenen bir düğümden başlar. Başlangıç düğümünü «Geçildi», «Ziyaret Edildi» olarak işaretler. Her iterasyonda bulunduğu düğümün bitişik bir düğümüne geçer Birden fazla bitişik düğüm varsa belirlenen kurala göre geçer En yakın, en uzak, alfabetik olarak vs. Bu işlem tüm komşuları ziyaret edilmiş bir düğüme rastlayana kadar devam eder (Dead End) Dead End de, DFS bir önceki düğüme döner ve buradan ziyaret edilmemiş başka bir bitişik düğüme geçmeyi dener Başlangıç düğümüne geri döndüğünde algoritma sonlanır Eğer ziyaret edilmemiş düğüm kaldıysa algoritma o düğümden tekrar başlatılır.
DFS DFS işlemlerini takip etmek için yığın (stack) yapısı kullanmak uygundur. İlk kez ziyaret edilen düğüm yığına eklenir. Bir düğüm «Dead end» olduğunda yığından kaldırılır. DFS bir ormanı oluşturmak için de kullanışlıdır: İlk düğüm bir ormanın ilk ağacının köküdür Ziyaret edilmemiş bir düğüme erişildiğinde, erişildiği düğüme çocuk olarak eklenir Bu tür bir ayrıta «ağaç ayrıtı» (tree edge) denir Bu ayrıtlar ormanı oluşturur Algoritma bir DFS ormanında ebeveyninden önceki atalarına doğru olan bir ayrıta rastlayabilir Bu tür ayrıta «geri ayrıt»(back Edge) denir
DFS Örnekteki DFS alfabetik olarak ilerlemiştir
DFS Sözde kodunun yalın olması DFS nin sofistike bir algoritma olmadığını göstermez Algoritmanın gücü ve etkinliği algoritma hareketlerinin bitişiklik matrisi yada bitişiklik listesi üzerinde daha iyi anlaşılır DFS nin etkinliği graf yapısının gösterildiği veri yapısına göre değişir Bitişiklik Matrisi ise θ( V 2 ) Bitişiklik listesi ise θ( V + E ) V ve E düğüm ve ayrıt sayısı
DFS DFS de iki türlü düğüm sıralaması vardır: Bir düğüme ilk kez erişildiğinde (Push) Düğüm «dead end» olduğunda (Pop) DFS bir çizgenin bağlantılılığını ve çevrimselliğini kontrol etmek için kullanışlıdır: Algoritma durduğunda tüm düğümler ziyaret edildiyse çizge bağlantılıdır. Algoritmada bir geri ayrıt bulunduysa çizge çevrimseldir.
Genişlik Öncelikli Arama (BFS) DFS «cesurca» ilerleyen bir algoritma iken BFS dikkatli ilerleyen bir algoritmadır DFS her adımda başlangıç düğümünden mümkün olduğunca uzağa gitmeye çalışır. BFS her adımda başlangıç düğümünün bitişik düğümlerine gitmeyi hedefler. BFS başlangıç düğümüne bitişik tüm düğümleri belirlenen sırayla gezer Ardından iki ayrıt uzaklıktaki tüm düğümleri sırayla gezer Başlangıç düğümüne bağlı tüm düğümler ziyaret edilene kadar algoritma devam eder
Genişlik Öncelikli Arama (BFS) BFS işlemlerini takip etmek için kuyruk yapısı uygundur Başlangıç düğümü eklenerek kuyruk başlatılır Her bitişik komşuya geçildiğinde «Ziyaret edildi» diye işaretlenip kuyruğa eklenir İlk eklenen düğüm ilk çıkar BFS de bir ormanı oluşturmak için de kullanışlıdır İlk düğüm bir ormanın ilk ağacının köküdür Ziyaret edilmemiş bir düğüme erişildiğinde, erişildiği düğüme çocuk olarak eklenir Bu tür bir ayrıta «ağaç ayrıtı» (tree edge) denir Bu ayrıtlar ormanı oluşturur Algoritma bir BFS ormanında ebeveyninden önceki atalarına doğru olan bir ayrıta rastlayabilir Bu tür ayrıta «Çapraz ayrıt»(cross Edge) denir
Genişlik Öncelikli Arama (BFS)
Genişlik Öncelikli Arama (BFS)
Genişlik Öncelikli Arama (BFS) BFS nin etkinliği DFS gibidir Graf yapısının gösterildiği veri yapısına göre değişir Bitişiklik Matrisi ise θ( V 2 ) Bitişiklik listesi ise θ( V + E ) V ve E düğüm ve ayrıt sayısı DFS den farklı olarak tek tip sıralama yapabilir Kuyruk yapısının FIFO özelliği sebebiyle BFS de bir grafın bağlantılılığını ve çevrimselliğini kontrol etmek için kullanışlıdır Algoritma durduğunda tüm düğümler ziyaret edildiyse graf bağlantılıdır Algoritmada bir geri ayrıt bulunduysa graf çevrimseldir. DFS ile yapılamayacak olan Verilen iki düğüm arası minimum ayrıttan oluşan yolu bulabilir
Genişlik Öncelikli Arama (BFS)
DFS vs. BFS
Topolojik Sıralama Topolojik Sıralama Önkoşul, gereklilik gibi kısıtlılıklar doğrultusunda yapılması gereken sıralama Yönlü Çizgeler- Directed graph (Digraph) Tüm sınır yönleri belirli Yönlü Yönsüz Çizge Farkı Yönlü Çizge: Komşuluk matrisleri simetrik olmak zorunda değil Yönlü Çizge: Bir ayrıtın sadece bir karşı düğümü vardır
Topolojik Sıralama Bir öğrencinin alması gereken 5 ders var: Derslerin bazıları ön koşullu Bir dönemde sadece bir ders alabiliyor Dersleri hangi sırayla almalı? Ders Önkoşul C1 - C2 - C3 C1, C2 C4 C3 C5 C3, C4
DFS Çözümü Ders Önkoşul C1 - C2 - C3 C1, C2 C4 C3 C5 C3, C4 Topolojik sıralama probleminin çözümü için dag olmalı
Bir Azaltma Çözümü Her adımda kendisine gelen ayrıt olmayan düğümü çıkar:
Sabit Oranla Azaltma Genellikle logaritmik zamanlı ve etkin algoritmalar Azaltma oranı genellikle 2 İkili Arama
İkili Arama Sıralı bir dizide K elemanının aranması Dizinin orta (m) elemanı seçilir K ile m karşılaştırılır K ile m eşitse bulunmuş olur Eşit değilse; K < m isi dizinin ilk yarısı» K > m ise dizinin ikinci yarısı için işlem tekrar eder.
İkili Arama K=70
İkili Arama Algoritma etkinliği Temel İşlem : Karşılaştırma En kötü durum: K nın dizide bulunamaması
Sahte Bozuk Para Problemi Aynı görünüme sahip n tane bozuk para var. Herhangi bir terazi aracılığıyla iki farklı bozuk paranın ağırlıklarını karşılaştırmak mümkün. Sahte olan bozuk para, gerçek bozuk paralardan daha hafif. Sahte bozuk parayı nasıl belirleyebiliriz?
Sahte Bozuk Para Problemi n tane bozuk parayı n/2 luk iki parçaya ayır: Eğer tek sayıda bozuk para varsa, bir tanesini ayır: İki parçayı «terazi» de tart. Eğer, her iki yük eşit ise, ayırdığın tek bozuk para sahtedir. Aksi takdirde, daha hafif olan set üzerinde aramaya aynı biçimde devam et.
Sahte Bozuk Para Problemi Tasarım tekniğimiz? Böl ve yönet mi? Azalt ve fethet mi? En kötü durum senaryosu (Ağırlık ölçü sayısı): n/3 şeklinde parçalarsak: