Ana içeriğe geç

Açgözlü Algoritma

İngilizcesi
Greedy Algorithm
Okunuşu
gridi elgıridım

Günlük kullanımda iki ad da yaygın.

Güncellendi 3 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/greedy-algorithm

Kısaca

Açgözlü algoritma, önceki kararları yeniden düşünmeden her adımda o an en iyi görünen seçimi yaparak çözümü adım adım kuran bir algoritmadır.

Açgözlü algoritma (greedy algorithm) nedir?

Açgözlü algoritma bir problemi bir dizi seçimle çözer ve her adımda o an en iyi görünen seçeneği, yani yerel olarak en iyi seçimi alır. Verilen bir kararı bir daha asla gözden geçirmez. Bu, açgözlü algoritmaları yazması basit ve genellikle çok hızlı yapar; ancak yalnızca doğru yapıya sahip problemlerde en iyi genel cevabı bulurlar.

Açgözlü yaklaşımın çalışması, bir problemin iki özelliğe sahip olmasıyla garanti edilir: açgözlü seçim özelliği, yani yerel olarak en iyi seçimin her zaman bir optimal çözümün parçası olabilmesi; ve optimal alt yapı, yani bu seçimden sonra geriye kalanın aynı problemin daha küçük bir sürümü olması. Birinci özelliği kanıtlamak zor kısımdır ve çoğu zaman bir değişim argümanıyla (exchange argument) yapılır; bu, herhangi bir optimal çözümün daha kötüye gitmeden açgözlü seçimi içerecek biçimde değiştirilebileceğini gösterir. Birçok açgözlü algoritma girdisini sıralayarak başlar; bu yüzden genellikle O(n log n) sürede çalışırlar.

Mümkün olan en az madeni parayla para üstü vermek klasik örnektir: 25, 10, 5 ve 1 sentlik madeni paralarla, sığan en büyük parayı vermeye devam etmek en iyi cevabı verir. Bilinen açgözlü algoritmalar arasında Dijkstra'nın en kısa yol algoritması, minimum kapsayan ağaçlar için Prim ve Kruskal algoritmaları, veri sıkıştırma için Huffman kodlaması ve her zaman en erken biten toplantıyı seçerek bir odaya en çok toplantıyı sığdıran aralık zamanlaması (interval scheduling) bulunur. Bir problem tam olarak çözülemeyecek kadar zor olduğunda açgözlü yöntemler, her zaman en iyisi olmasa da iyi bir cevap veren hızlı sezgisel yöntemler olarak da işe yarar.

Açgözlü algoritmalar, ikisi de optimal alt yapılı problemler üzerinde çalıştığı için sıklıkla dinamik programlamayla karıştırılır. Açgözlü algoritma her adımda tek bir seçime bağlanırken dinamik programlama her seçimi değerlendirir ve alt problemlerin saklanmış sonuçlarını birleştirir; bu daha yavaştır ama açgözlülüğün başarısız olduğu durumlarda doğrudur. Madeni para örneği farkı gösterir: 1, 3 ve 4 değerli paralarla 6 oluşturmak açgözlü yöntemle 4 + 1 + 1, yani üç para verir; dinamik programlama ise yalnızca iki para olan 3 + 3'ü bulur.

Önemli noktalar

  • Açgözlü algoritma her zaman o an en iyi görünen seçimi alır ve asla geri dönmez.
  • Yalnızca problem açgözlü seçim özelliğine ve optimal alt yapıya sahip olduğunda optimaldir.
  • Örnekleri arasında Dijkstra algoritması, Huffman kodlaması ve Kruskal ile Prim'in minimum kapsayan ağaç algoritmaları bulunur.
  • Açgözlü algoritmalar genellikle hızlıdır; girdiyi önce sıraladıkları için çoğu kez O(n log n) sürer.
  • Dinamik programlama tüm seçimleri değerlendirir, bu yüzden açgözlü seçimlerin başarısız olduğu problemleri çözer.

Örnek

Açgözlü aralık zamanlaması: bir odaya en çok toplantıyı sığdırmakpython
def max_meetings(meetings):
    # Greedy choice: always take the meeting that ends earliest
    chosen, free_at = [], 0
    for start, end in sorted(meetings, key=lambda m: m[1]):  # O(n log n)
        if start >= free_at:  # it fits after the last chosen meeting
            chosen.append((start, end))
            free_at = end
    return chosen

meetings = [(9, 12), (9, 10), (10, 11), (11, 13), (12, 14), (13, 15)]
print(max_meetings(meetings))  # [(9, 10), (10, 11), (11, 13), (13, 15)]

Sık sorulan sorular

Açgözlü algoritma ne zaman optimal cevabı verir?

Problem açgözlü seçim özelliğine, yani yerel olarak en iyi bir seçimin en iyi genel çözümü asla dışarıda bırakmadığı bir yapıya ve optimal alt yapıya sahip olduğunda. Aralık zamanlaması, minimum kapsayan ağaçlar ve Huffman kodlaması kanıtlanmış durumlardır; diğer birçok problemde açgözlü yöntem yalnızca bir yaklaşık çözüm verir.

Açgözlü algoritma ile dinamik programlama arasındaki fark nedir?

Açgözlü algoritma, o an en iyi görünene göre adım başına geri döndürülemez tek bir seçim yapar. Dinamik programlama ise alt problemlerin saklanmış cevaplarını kullanarak tüm seçimleri değerlendirir; bu daha çok zaman ve bellek harcar ama açgözlü seçimlerin başarısız olduğu yerde optimumu bulur.

Dijkstra algoritması açgözlü müdür?

Evet. Her adımda bilinen en küçük uzaklıklı ziyaret edilmemiş düğümü kesinleştirir; bu açgözlü bir seçimdir ve hiçbir kenar ağırlığı negatif olmadığı sürece doğru olduğu kanıtlanmıştır.

İlgili sayfalar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar