Böl ve Fethet Algoritması
Bu rehberde, böl ve fethet algoritmasının nasıl çalıştığını öğreneceksiniz. Ayrıca yinelemeli bir problemi çözmek için böl ve fethet yaklaşımını diğer yaklaşımlarla karşılaştıracağız.
Böl ve Fethet algoritmasının büyük problemleri çözerkenki stratejisi şudur:
Problemi daha küçük problemlere ayırın.
Küçük problemleri çözün.
Bunları birleştirerek istenen çıktıyı elde edin.
Böl ve Fethet algoritmasında özyineleme kullanılır. Farklı programlama dillerinde özyinelemeyi öğrenmek için:
Böl ve Fethet Algoritması Nasıl Çalışır?
İşte ilgili adımlar:
Böl: Verilen problemi özyineleme kullanarak daha küçük probleme bölün
Fethet: Daha küçük problemleri özyineleme ile çözün. Eğer yeteri kadar küçükse, direkt çözün.
Birleştir: Asıl problemi çözmek için özyinelemeli sürecin parçası olan alt problemlerin çözümlerini birleştirin.
Bu kavramı bir örnek yardımıyla anlayalım.
Burada, böl ve yönet yaklaşımını kullanarak bir diziyi sıralayacağız.(Yani Birleştirme sıralaması ile)
- Verilen dizi şöyle olsun:
- Diziyi iki yarıma bölün.
- Tek elaman kalana dek diziyi özyinelemeli şekilde alt parçalara bölmeye devam edin.
- Şimdi, sıralanmış şekilde tüm elemanları birleştirin. Burada, fethet ve birleştir adımları sırayla gerçekleşir.
Zaman Karmaşıklığı
Böl ve yönet algoritmasının karmaşıklığı, master teoremi kullanılarak hesaplanır.
T(n) = aT(n/b) + f(n)
n = girdi sayısı
a = rekürsifteki alt problemlerin sayısı
n/b = Her alt problemin boyutu. Her alt problemin
aynı boyuta sahip olduğu varsayılır
f(n) = Problemi bölmenin maliyeti ve
alt problemleri birleştirme maliyeti dahil
rekürsif problemin dışında yapılan işin maliyeti
Özyinelemeli bir problemin zaman karmaşıklığını bulmak için bir örnek alalım. Bir birleştirme sıralaması için denklem şu şekilde yazılabilir:
T(n) = aT(n/b) + f(n)
= 2T(n/2) + O(n)
a = 2 (her seferinde bir problem 2 alt probleme bölünür)
n/b = n/2 (her alt problemin boyutu girdinin yarısıdır)
f(n) = Problemi bölmek ve alt problemleri birleştirmek icin geçen süre
T(n/2) = O(n log n) (Bunu anlamak için, master teoremine bakın)
Öyleyse, T(n) = 2T(n log n) + O(n)
≈ O(n log n)
Böl ve Fethet vs Dinamik Yaklaşım
Böl ve fethet yaklaşımı, bir problemi daha küçük alt problemlere böler; bu alt problemler özyinemeli şekilde çözülür. Her alt problemin sonucu ileride ulaşılmak üzere saklanmaz. Buna karşılık, dinamik bir yaklaşımda, her bir alt problemin sonucu ileride ulaşılmak üzere saklanır.
Aynı alt problem birden çok kez çözülmediğinde böl ve yönet yaklaşımını kullanın. Bir alt problemin sonucu gelecekte birden çok kez kullanılacaksa dinamik yaklaşımı kullanın.
Bunu bir örnekle açıklayalım. Fibonacci serisini bulmaya çalıştığımızı varsayalım.
Böl ve Fethet Yaklaşımı
fib(n)
If n < 2, return 1
Else , return f(n - 1) + f(n -2)
Dinamik Yaklaşım
mem = []
fib(n)
If n in mem: return mem[n]
else,
If n < 2, f = 1
else , f = f(n - 1) + f(n -2)
mem[n] = f
return f
Dinamik yaklaşımda, mem
değişkeni her bir alt problemin sonucunu tutuyor.
Böl ve Fethet Algoritmasının Avantajları
Saf halde iki matrisin çarpımındaki zaman karmaşıklığı
O(n
3
)
iken böl ve fethet algoritması kullanılarak(Bknz. Strassen’in Matris Çarpımı) bulunan karmaşıklıkO(n
2.8074
)
olarak hesaplanır. Bu yaklaşım aynı zamanda Hanoi Kulesi gibi diğer sorunları da basitleştirir.Bu yaklaşım, çok işlemli sistemler için uygundur.
Bellek önbelleklerini verimli bir şekilde kullanır.
Böl Ve Fethet Kullanımları
Strassen’s matrix çarpımı
Karatsuba algoritması