Dinamik programlama ve Açgözlü algoritma

Slides:



Advertisements
Benzer bir sunumlar
FIRAT ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ
Advertisements

Yinelemeli Algoritma Analizi & Asimptotik Notasyon
Ayrık Yapılar Algoritma Analizi.
MIT503 Veri Yapıları ve algoritmalar
IT503 Veri Yapıları ve algoritmalar
AES (Advanced Encryption Standart)
MIT503 Veri Yapıları ve algoritmalar Algoritma Oluşturma – Açgözlü algoritmalar ve buluşsallar Y. Doç. Yuriy Mishchenko.
SINIFLANDIRMA VE REGRESYON AĞAÇLARI (CART)
Huffman Encoding by Snowblind.
MIT503 Veri Yapıları ve algoritmalar Algoritmalara giriş
İçerik Ön Tanımlar En Kısa Yol Problemi Yol, Cevrim(çember)
MIT503 Veri Yapıları ve algoritmalar En önemli graf problemleri
Özyinelemeli(Recursive) Algoritma Tasarımı
Karar Ağaçları.
Bölüm 3 – Yapısal Programlama
En Küçük Yol Ağacı (Minimum Spanning Tree)
TBF Genel Matematik I DERS – 1 : Sayı Kümeleri ve Koordinatlar
Yapısal Program Geliştirme – if, if-else
KESİRLER.
MIT503 Veri Yapıları ve algoritmalar Veri ağaçları
Veri Yapıları ve Algoritmalar
KESİRLER.
CEBİRSEL İFADELER ŞEHİT POLİS İSMAİL ÖZBEK ORTA OKULU BURSA/KESTEL.
HUFFMAN VE TELEGRAF KODLAMALARI
İNTERNET PROGRAMLAMA - 1
HIZLI SIRALAMA ALGORİTMALARI(QUICK SORT)
TAM SAYILARDA TOPLAMA VE ÇIKARMA
Veri Yapıları ve Algoritmaları ders_1
RASYONEL SAYILAR Q.
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
BAH TABLOSU.
RASYONEL SAYILAR Q.
Sayı Sistemleri Geçen Hafta Analog ve Sayısal Büyüklük Kavramı
Algoritmalar ve Programlama I Ders 2: Akış Diyagramları
ANALOG-SAYISAL BÜYÜKLÜK VE SAYI SİSTEMLERİ
Karşılaştırıcı ve Aritmetik İşlem Devreleri
SİMPLEKS METOT Müh. Ekonomisi.
Adım Adım Algoritma.
AVL(Adel’son-Vel’skiĭ and Landis) Ağacı AVL ağacı, iki alt ağacının yükseklikleri farkının en fazla 1 olabildiği dengeli ikili arama ağacıdır. AVL ağacında.
Sayısal Analiz 7. Hafta SAÜ YYurtaY.
Floyd Algoritması Floyd Algoritması Dijkstra algoritmasının daha genel halidir. Çünkü şebekedeki herhangi iki düğüm arasındaki en kısa yolu belirler. Algoritma,
METİNLERİ Matrislerle ŞİFRELEME
RASYONEL SAYILAR.
Dinamik programlama ve açgözlü yaklaşım soruları.
Algoritmalar II Ders 6 Açgözlü Algoritmalar.
0-1 Sırt Çantası Problemi
Algoritmalar II Ders 2 Dinamik Programlama Yöntemi.
Algoritmalar II Ders 5 Açgözlü Algoritmalar.
Algoritmalar II Ders 10 Dinamik Programlama ve Açgözlü Yaklaşım Soruları-2.
DERS 2 SAYI DÜZENLERİ.
Algoritmalar II Ders 8 Açgözlü Algoritmalar.
Algoritmalar II Ders 13 Çizgelerde tüm ikililer arasında en kısa yollar.
Algoritmalar II Ders 1: Alan zaman takası yöntemi.
Algoritmalar II Ders 7 Açgözlü Algoritmalar.
Algoritmalar II Ders 4 Dinamik Programlama Yöntemi.
Algoritmalar II Ders 14 Çizgelerde tüm ikililer arasında en kısa yollar.
KAREKÖKLÜ SAYILAR YUNUS AKKUŞ 2017.
İleri Algoritma Analizi
HAZIRLAYAN:ELİF CEYLAN.   Tam sayılarda toplama işlemi yapılırken, verilen tam sayıların aynı veya farklı işaretli oluşlarına göre işlem yapılır. Aynı.
9. Ders Tüm ikililer arasında en kısa yollar
İleri Algoritma Analizi
Algoritma Nedir? Algoritmayı, herhangi bir problemin çözümü için izlenecek yolun adımlar halinde yazılması olarak tanımlayabiliriz. Algoritma, bir problemin.
Bilgisayar Mühendisliğine Giriş
Algoritmalar II Ders 9 Dinamik Programlama ve Açgözlü Yaklaşım Soruları.
Algoritmalar II Ders 3 Dinamik Programlama Yöntemi.
İleri Algoritma Analizi
Algoritmalar II Ders 2 Dinamik Programlama Yöntemi.
10. Ders Floyd-Warshal algoritması
Kelime (Text) İşleme Algoritmaları
Sunum transkripti:

Dinamik programlama ve Açgözlü algoritma

Dinamik Programlama Yaklaşımı Para Bozdurma Sorusu Dinamik Programlama Yaklaşımı

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.

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.

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.

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=5+1+1+1 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

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.

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

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.

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

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

Sözde Kod Change(x, k, n) 1 C[0] ← 0 2 for p ← 1 to n 3 min ← ∞ 4 for i ← 1 to k 5 if x[i] <= p then 6 if 1 + C[p − x[i]] < min then 7 min ← 1 + C[p − x[i]] 8 coin ← i 9 C[p] ← min 10 S[p] ← coin 11 return C and S

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]]

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.

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

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.

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.

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.

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.

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

ÇÖ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.

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.

3 - 2.adımdaki işlem tekrarlanarak en küçük frekanslı iki düğüm tekrar toplanır ve yeni bir düğüm oluşturulur.

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.

5 - 2.adımdaki işlem tekrarlanarak en küçük frekanslı iki düğüm tekrar toplanır ve yeni bir düğüm oluşturulur.

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.

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.

Dalların kodlarla işaretlenmiş hali aşağıdaki gibi olacaktır.

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.

Ş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 (50+35+20+10+8+4) = 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 = 50 + 70 + 60 + 40 + 40 + 20 = 280 bit olacaktır.

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.

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.

ÖRNEK; Huffman Kodu ile kodlanmış elimizde bu katarın olduğunu düşünelim; “101111111111101110101”

ÇÖ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)