Sunuyu indir
1
Dinamik programlama ve Açgözlü algoritma
2
Dinamik Programlama Yaklaşımı
Para Bozdurma Sorusu Dinamik Programlama Yaklaşımı
3
Soru N lira para ve her birinden yeterli miktarda x1, x2,…,xk birimlik bozuk paralar veriliyor. N ve x1, x2,…xk sayıları pozitif tam sayılardır. Amacımız N lira parayı toplam bozuk para sayısı en az olacak biçimde bozdurmaktır.
4
Sorunun matematiksel ifadesi
Yani öyle a1, a2,…ak negatif olmayan tam sayılarını bulmak gerekir ki N=a1.x1+a2.x2+…ak.xk ve a1+a2+…ak toplamı en az olsun.
5
Açgözlü Algoritma? Bu soruyu çözmek için açgözlü (greedy) algoritma uygulanabilir mi? Yani önce S={x1, x2,…xk} kümesinin mümkün olabilecek en büyük elemanını mümkün olabilecek sayıda kullanırız. Sonra da N in artan kısmına aynı algoritmayı tekrar tekrar uygularız.
6
Açgözlü Algoritma? S={x1, x2,…xk}={1, 4, 5, 10} ve N=8 olursa Açgözlü algoritmaya göre önce 5, sonra 3 tane 1 alınır, yani N= bulunur. Bu durumda 4 bozuk para bulunur. Oysaki N=4+4 optimal çözümdür, yani 2 bozuk para ile 8 lirayı bozabiliriz. Yani Açgözlü algoritma çalışmaz
7
Dinamik programlama 1. adım. Optimal çözümün yapısını karakterize etme
N=a1.x1+a2.x2+…an.xn+…ak.xk olsun. Bu çözümü her hangi bir bozuk paraya göre iki parçaya ayırdığımızda, örneğin, b=a1.x1+…an.xn ve diğer parça da N-b olduğunda b lira paranın bozuk paralara optimal ayrılışı b=a1.x1+…an.xn olacaktır. Aynısı N-b için de geçerlidir.
8
ispat b nin bozuk paralara ayrılışı daha az sayıda bozuk para ile mümkün olsaydı N=b+N-b sayısının da bozuk paralara ayrılışı daha az sayıda bozuk para ile yapılabilirdi, bu ise N=a1.x1+a2.x2+…ak.xk ayrılışının optimal olması ile çelişmektedir
9
Optimal çözümün değeri için formül
2. adım. Optimal Çözümün değeri için özyinelemeli (rekursive) formül bulunması C[p] ile p lira paranın optimal bozulması için gerekli olan bozuk para sayısını işaret edelim. xi<=p koşuluna uyan ve p lira paranın optimal bozulmasında kullanılan ilk bozuk para birimi xi olsun.
10
Optimal çözümün değeri için formül
1. adıma göre p-xi lira para da optimal bozulmuş olur. Yani C[p]=1+C[p-xi] olur. Biz xi nin kaç olduğunu bilmiyoruz ama k tane i için tüm durumlara bakabiliriz. C[p]= 0, eğer p=0 ise, min {1+C[p-xi] }, eğer p>0 ise 1<=i<=k xi<=p
11
Optimal Çözümün değerinin hesaplanması
3. adım. Optimal Çözümün değerlerini aşağıdan yukarıya doğru hesaplayabiliriz. Aşağıdaki sözde kodda x bozuk para birimleri dizisini, k bu dizinin eleman sayısını, n ise bozulması gereken para değerini göstermektedir
12
Sözde Kod Change(x, k, n) 1 C[0] ← 0 2 for p ← 1 to n 3 min ← ∞
for i ← 1 to k if x[i] <= p then if 1 + C[p − x[i]] < min then min ← 1 + C[p − x[i]] coin ← i C[p] ← min S[p] ← coin 11 return C and S
13
Hesaplanan değerlerden optimal çözümün oluşturulması
4. adım Make-Change(S, x, n) 1 while n > 0 2 Print S[n] 3 n ← n − x[S[n]]
14
Huffman kodları Huffman kodları algoritması veri sıkıştırma için 1952 yılında Huffman tarafından üretilmiştir. Bu algoritma açgözlü yaklaşımla tasarlanmıştır.
15
Sıkıştırma problemi Problem: Verilen metni en az bit kullanarak sıkıştırınız (kodlayınız) 2 tür sıkıştırma vardır: -Veri kaybına yol açan sıkıştırmalar. Örneğin WhatsApp da gönderilen fotoğraflar veri kaybına uğrar. -Veri kaybına uğramayan sıkıştırmalar, yani sıkıştırılmış metin orijinaline dönüştürülebilir
16
Brute force çözüm Veri kaybına yol açmadan sıkıştırma problemi aşağıdaki gibi çözülebilir: Her sembolü aynı uzunlukta ikilik sayılarla eşleştiririz.
17
Huffman ana fikri Veri içerisinde EN AZ kullanılan karakter için EN UZUN, EN ÇOK kullanılan karakter için de EN KISA kod üretelim. Bir karakterin bir metinde kullanım sayısına bu karakterin frekansı denir.
18
Huffman ağacı Frekans tablosunu metin dosyasını kullanarak elde ettikten sonra yapmamız gereken’’Huffman Ağacını’’ oluşturmaktır. Huffman ağacı hangi karakterin hangi bitlerle temsil edileceğini(kodlanacağını) belirlememize yarar.
19
Algoritma Algoritmanın adımları aşağıdaki şekildedir:
1. Her karakter frekanslarına göre küçükten büyüğe doğru sıralanır ve tüm karakterler bir ağacın yaprak düğümlerine eklenir. 2. Sırada, birden fazla düğüm kaldığı sürece aşağıdaki adımlar döngü halinde yapılır. a. Sıradan, en az frekansa sahip iki düğüm alınır. b. Yeni bir iç düğüm (internal node) oluşturulup, değer olarak bu alınan iki düğümün toplamı atanır. c. Yeni düğüm ağaca ve sıraya eklenir. 3. Döngü bitip tek düğüm kaldıysa, bu düğüm, kök düğüm yapılır ve algoritma sona erer.
20
ÖRNEK; Bu örnekte aşağıdaki frekans tablosu kullanılacaktır.
Bu tablodan çıkarmamız gereken şudur : Elimizde öyle bir metin dosyası varki "a" karakteri 50 defa, "b" karakteri 35 defa .... "ğ" karakteri 4 defa geçiyor. Amacımız ise her bir karakteri hangi bit dizileriyle kodlayacağımızı bulmak.
21
ÇÖZÜM; 1 - Öncelikle "Huffman Ağacını" ndaki en son düğümleri(dal) oluşturacak bütün semboller frekanslarına göre aşağıdaki gibi küçükten büyüğe doğru sıralanırlar.
22
2 - En küçük frekansa sahip olan iki sembolün frekansları toplanarak yeni bir düğüm oluşturulur. Ve oluşturulan bu yeni düğüm diğer varolan düğümler arasında uygun yere yerleştirilir. Bu yerleştirme frekans bakımından küçüklük ve büyüklüğe göredir.
23
3 - 2.adımdaki işlem tekrarlanarak en küçük frekanslı iki düğüm tekrar toplanır ve yeni bir düğüm oluşturulur.
24
4 - 2.adımdaki işlem tekrarlanarak en küçük frekanslı iki düğüm tekrar toplanır ve yeni bir düğüm oluşturulur.Yeni dizimiz aşağıdaki şekilde olacaktır.
25
5 - 2.adımdaki işlem tekrarlanarak en küçük frekanslı iki düğüm tekrar toplanır ve yeni bir düğüm oluşturulur.
26
6 - 2.adımdaki işlem en tepede tek bir düğüm kalana kadar tekrar edilir.Böylece huffman ağacının son hali aşağıdaki gibi olacaktır.
27
7 - Huffman ağacının son halini oluşturduğumuza göre her bir sembolün yeni kodunu oluşturmaya geçebiliriz. Sembol kodlarını oluşturuken Huffman ağacının en tepesindeki kök düğümden başlanır. Kök düğümün sağ ve sol düğümlerine giden dala sırasıyla "0" ve "1" kodları verilir. Sırası ters yönde de olabilir. Bu tamamen seçime bağlıdır. Ancak ilk seçtiğiniz sırayı bir sonraki seçimlerde korumanız gerekmektedir.
28
Dalların kodlarla işaretlenmiş hali aşağıdaki gibi olacaktır.
29
8 - Sıra geldi her bir sembolün hangi bit dizisiyle kodlanacağını bulmaya. Her bir sembol dalların ucunda bulunduğu için ilgili yaprağa gelene kadar dallardaki kodlar birleştirilip sembollerin kodları oluşturulur.
30
Şimdi örneğimizdeki gibi bir frekans tablosuna sahip olan metnin Huffman algoritması ile ne oranda sıkışacağını bulalım : Sıkıştırma öncesi gereken bit sayısını bulacak olursak : Her bir karakter eşit uzunlukta yani 8 bit ile temsil edildiğinden toplam karakter sayısı olan ( ) = 127 ile 8 sayısını çarpmamız lazım. Orijinal veriyi sıkıştırmadan saklarsak 127*8 = 1016 bit gerekmektedir. Huffman algoritmasını kullanarak sıkıştırma yaparsak kaç bitlik bilgiye ihtiyaç duyacağımızı hesaplayalım : 50 adet "a" karakteri için 50 bit, 35 adet "b" karakteri için 70 bit, 20 adet "k" karakteri için 60 bit....4 adet "ğ" karakteri için 20 bite ihtiyaç duyarız. (yukarıdaki tabloya bakınız.) Sonuç olarak gereken toplam bit sayısı = 50*1 + 35*2 + 20*3 + 10*4 + 8*5 + 4*5 = = 280 bit olacaktır.
31
SONUÇ; 1016 bitlik ihtiyacımızı 280 bite indirdik. Yani yaklaşık olarak %72 gibi bir sıkıştırma gerçekleştirmiş olduk. Gerçek bir sistemde sembol frekanslarınıda saklamak gerektiği için sıkıştırma oranı %72’ten biraz daha az olacaktır. Bu fark genelde sıkıştırılan veriye göre çok çok küçük olduğu için ihmal edilebilir.
32
Huffman kodu ile sıkıştırılmış s eski haline getirilmesi;
Önek ağacı kullanıldığı ve yaprak düğümler harici veri saklanılmadığı için Huffman Ağacında kod sözcüklerinin çözülmesi oldukça kolaydır. Kodlanmış verinin çözülmesi için kök düğümden başlanarak ve her gelen bit’e karşılık kodlanmış veride bir ilerlenerek yaprak düğüme ulaşılır. Yaprak düğüme ulaşıldığında bir sonraki koda geçildiği anlaşılır ve tekrar kök düğümden başlanarak aynı işlem kodlanmış veri bitene kadar tekrarlanır.
33
ÖRNEK; Huffman Kodu ile kodlanmış elimizde bu katarın olduğunu düşünelim; “ ”
34
ÇÖZÜM; Huffman ağacından faydalanarak bu katarın ilk karakterden başlayıp yolları takip ettiğimizde; • 1 -> abfc • 0 -> a (hiç çocuğu yok, köke dön) • 1 -> bfc • 1 -> b (hiç çocuğu yok, köke dön)
Benzer bir sunumlar
© 2024 SlidePlayer.biz.tr Inc.
All rights reserved.