710 likes | 1.16k Views
MIT503 Veri Yapıları ve algoritmalar Algoritmalar nasıl oluşturulur. Y. Doç. Yuriy Mishchenko. Algoritmalar Nasıl Oluşturulur. Ders planı Algoritmalar nasıl oluşturulur Lineer olmayan denklem çözme Hızlı sıralama Çok boyutlu (belgeler) arama. Algoritmalar Nasıl Oluşturulur.
E N D
MIT503 Veri Yapıları ve algoritmalarAlgoritmalar nasıl oluşturulur Y. Doç. Yuriy Mishchenko
Algoritmalar Nasıl Oluşturulur Ders planı • Algoritmalar nasıl oluşturulur • Lineer olmayan denklem çözme • Hızlı sıralama • Çok boyutlu (belgeler) arama
Algoritmalar Nasıl Oluşturulur Algoritmalar nasıl oluşturulur • Sorun çözme bir fikri almak lazım • Çözme sürecini adım adım şekilde yazmak lazım • Çözme sürecini formal şekilde (sözde kod yada akış şeması olarak) belirtmek lazım
Lineer olmayan denklem çözme • Lineer olmayan denklem: • Burada, f(x) lineer olmayan bir fonksiyon, ve x bir yada çok boyutlu vektör olabilir • Bu soruların birçok uygulaması var
Lineer olmayan denklem çözme • Kolay durumda bile yapılamaz bir sorun: • Bunun gibi sorular çözmek için bir algoritma nasıl oluşturabiliriz?
Lineer olmayan denklem çözme 1. Adım: • Herhangi diğer bir problem gibi, ilk önce çözümün bir fikri bulmamız lazım • Peki, orijinal denklemi yapamayız, ne yapabiliriz ama? • Lineer denklemi nasıl yapabileceğini biliyoruz...
Lineer olmayan denklem çözme • Ana fikri: • Orijinal denklemi yaklaşık olarak lineer denklem ile temsil edeceğiz • Bu yaklaşık denklemi çözeceğiz • Sonucu gerçek çözümüne belki daha yakın olacak • Tekrarlayacağız
Lineer olmayan denklem çözme 2. Adım – talimat listesi: • Orijinal denklemi yaklaşık olarak lineer denklem ile temsil edeceğiz türev
Lineer olmayan denklem çözme 2. Adım – talimat listesi: • Bu yaklaşık denklemi çözeceğiz; yeni “x” doğru çözümüne daha yakın olacağını umuyoruz
Lineer olmayan denklem çözme 2. Adım – talimat listesi: • Tekrar tekrar edeceğiz
Lineer olmayan denklem çözme 2. Adım – talimat listesi : • Orijinal denklemi yaklaşık olarak lineer denklem ile temsil edeceğiz (türev kullanarak) • Yaklaşık lineer denklemi çözüp yeni “x” doğru çözümüne daha yakın olacağını umuyoruz • Tekrarlıyoruz
Lineer olmayan denklem çözme 3. Adım – formal belirtme: • Algoritmada kullanılacak değişkenler: • x, çözüm noktasını temsil eder, bir gerçek sayıdır; • f, çözülecek fonksiyon, bir fonksiyondur; • f‘, çözülecek fonksiyonun türevi, bir fonksiyondur.
Lineer olmayan denklem çözme Algoritmanın söz kodu: f:=çözülecek fonksiyon //girdif’:=f’nin türevi //girdix:=ilk nokta //girdiDÖNGÜ x:=x-(f’(x)^-1)*f(x) DÖNGÜ SONU
Lineer olmayan denklem çözme Algoritmanın söz kodu: f:=çözülecek fonksiyon //girdif’:=f’nin türevi //girdix:=ilk nokta //girdiDÖNGÜ x:=x-(f’(x)^-1)*f(x) DÖNGÜ SONU Burada bir sorun var – döngü ne zaman bitiyor ?
Lineer olmayan denklem çözme Algoritmanın söz kodu f:=çözülecek fonksiyon //girdif’:=f’nin türevi //girdix:=ilk nokta //girdi e:= hedef hassasiyeti //girdi (0.0001 gibi) x0:=-100000 //önceki nokta(|x-x0|/x0>e)’İKEN x0:=x x:=x-(f’(x)^-1)*f(x) DÖNGÜ SONU
Lineer olmayan denklem çözme Algoritmanın söz kodu f:=çözülecek fonksiyon //girdif’:=f’nin türevi //girdix:=ilk nokta //girdi e:= hedef hassasiyeti //girdi (0.0001 gibi) x0:=-100000 //önceki nokta(|x-x0|/x0>e)’İKEN x0:=x x:=x-(f’(x)^-1)*f(x) DÖNGÜ SONU Burada da bir sorun var – eğer bu metod çözüme yaklaşmıyorsa (ve yaklaşmayabilir) döngü durmaz
Lineer olmayan denklem çözme Algoritmanın söz kodu f:=çözülecek fonksiyon //girdif’:=f’nin türevi //girdix:=ilk nokta //girdi e:= hedef hassasiyeti //girdi (0.0001 gibi)m:=max tekrarlama //girdi (max tekrarlama sayısı) n:=0 //tekrarlama sayacı x0:=-100000 //önceki nokta(|x-x0|/x0>e VE n<m)’İKEN x0:=x n:=n+1 x:=x-(f’(x)^-1)*f(x) DÖNGÜ SONU
Newton-Raphsonmetodu Algoritmanın söz kodu f:=çözülecek fonksiyon //girdif’:=f’nin türevi //girdix:=ilk nokta //girdi e:= hedef hassasiyeti //girdi (0.0001 gibi)m:=max tekrarlama //girdi (max tekrarlama sayısı) n:=0 //tekrarlama sayacı x0:=-100000 //önceki nokta(|x-x0|/x0>e VE n<m)’İKEN x0:=x n:=n+1 x:=x-(f’(x)^-1)*f(x) DÖNGÜ SONU <Algoritma OluşturmaBudur
Hızlı Sıralama • Sıralama sorununa önce baktık • Bir sayı dizisini sıralanmış şekline çevirmek lazım • Kıbarcık sıralama metodu vardı • Çok kötü sıralama metodu – O(n2) vakit gerekir Diziyi ilk sayı’dan son sayı’ya inceleyip yanlış sırada çiftleri varsa ... ... sayıların yerleri değiştirin 2 5 7 11 17 13 15 18 23 30
Hızlı Sıralama 1. Adım – Ana Fikri: • Eğer sıralama n2 vakit gerekiyorsa, daha hızlı sıralama için bir fikir olabilir ki... • Orijinal diziyi iki eş parçaya bölüp şunları ayrı ayrı sıralayabiliriz, vakit = 2*(n/2)2=n2/2 • Yani: orijinal diziyi iki eş parçaya bölürek onu daha hızlı sıralayabiliriz • Neden iki parçaya bölmeleyiz ?? bu iki parçayı tekrar bölebiliriz !! Daha hızlı bile sıralayabiliriz !!
Hızlı Sıralama 2. Adım – talimat listesi: • Bu fikrini adım adım şekilde yazdırmamız lazım • Var olan diziyi iki eş parçaya bölelim (örneğin – sol ve sağ yarısı) • İki parçayı ayrı ayrı sıralayalım, aynı algoritmayı kullanarak; yani tekrar iki yeni parçaya bölürek vb • özyineleme var – birinci derste konuştuk biraz – algoritma kendine referans ediyor ! • İki sıralanmış parçayı geri birliğe toplayalım
Hızlı Sıralama 3. Adım – formal belirtme: Algoritma sozde kodu (hızlı arama) D:=girdi dizi //girdisol:=D’nin sol yarısısağ:=D’nin sağ yarısısol:=hızlı_sıralama(sol) //özyineleme sağ:=hızlı_sıralama(sağ) //özyineleme “sağ” ve “sol”u geri birliğe toplayın
Hızlı Sıralama 3. Adım – formal belirtme: Algoritma sozde kodu (hızlı arama) D:=girdi dizi //girdisol:=D’nin sol yarısısağ:=D’nin sağ yarısısol:=hızlı_sıralama(sol) //özyineleme sağ:=hızlı_sıralama(sağ) //özyineleme “sağ” ve “sol”u geri birliğe toplayın ???
Hızlı Sıralama • Yeni sorun (alt sorun): sıralanmış sol ve sağ dizileri birliğe nasıl toplayacağız? • Sağ ve sol dizide bir işaretçi oluşturalım • EĞER sol işaretçi sağ işaretçiden daha küçük, sonuca sol taraftan sayı koyup sol işaretçiyi artıracağız • YOKSA sonuca sağ taraftan sayı koyup sağ işaretçiyi artıracağız
Hızlı Sıralama 2 7 15 18 30 5 11 13 17 23 Daha küçük
Hızlı Sıralama 2 7 15 18 30 5 11 13 17 23 Daha küçük 2
Hızlı Sıralama 2 7 15 18 30 5 11 13 17 23 Daha küçük 2 5
Hızlı Sıralama 2 7 15 18 30 5 11 13 17 23 Daha küçük 2 5 7
Hızlı Sıralama 2 7 15 18 30 5 11 13 17 23 Daha küçük 2 5 7 11
Hızlı Sıralama 2 7 15 18 30 5 11 13 17 23 Daha küçük 2 5 7 11 13
Hızlı Sıralama 2 7 15 18 30 5 11 13 17 23 Daha küçük 2 5 7 11 13 15
Hızlı Sıralama 2 7 15 18 30 5 11 13 17 23 Sıralanmış toplama algoritması bu... 2 5 7 11 13 15 17 18 23 30
Hızlı Sıralama Algoritma sozde kodu (hızlı arama) D:=girdi dizi //girdisol:=D’nin sol yarısısağ:=D’nin sağ yarısı sol:=hızlı_sıralama(sol) //özyineleme sağ:=hızlı_sıralama(sağ) //özyineleme çıktı:=sıralanmış_toplama(sol,sağ)
Hızlı Sıralama Algoritma sozde kodu (sıralanmış toplama) işar_sağ:=1 işar_sol:=1 (solda yada sağda kalan sayılar var) İKEN EGER sol(işar_sol)<sağ(işar_sağ) sonuç:=dizi(sonuç,sol(işar_sol)) işar_sol:=işar_sol+1 AKSİ HALDE sonuç:=dizi(sonuç,sol(işar_sol)) işar_sol:=işar_sol+1DÖNGÜ SONU
Hızlı Sıralama Algoritma Analizi • Kıbarcık sıralama n2 vakit gerektiriyordu • Hızlı algoritma ne kadar zamandır gerekiyor ?
Hızlı Sıralama Algoritma Analizi • Eğer T(n) n boyutta dizi sıralama vakti ise, bu vakit ne içerir ? • İki daha küçük dizi sıralama (2T(n/2) vakti) ve bu dizileri geri toplama (n vakit) • Sonuçta bu formül çıkıyor
Hızlı Sıralama Algoritma Analizi • T(n)=n olamaz (çünkü bu durumda T(n)=2T(n/2)) • Aynı zamanda T(n)=n2 de olamaz (çünkü bu durumda n2>2(n/2)2+n)
Hızlı Sıralama Algoritma Analizi • Birkaç opsiyon deneyince, T(n)=n log2 n olduğunu görebilirsiniz
Hızlı Sıralama Algoritma Analizi • Hızlı sıralama sadece O(n log n) vakit gerekiyor • Algoritma analizi budur
Hızlı Sıralama Algoritma Analizi • Başka bir hızlı sıralama yaklaşımı: çıktı birbiri ardına hemen sıralanmış şekilde oluşturmak • Sıralanmış diziye yeni sayı ikiye bölme kullanarak verimli şekilde ekleyebiliriz (log n vakit gerekiyor) İkiye bölme araması... 2 5 7 11 12 13 17 22 23 30 hedef
Hızlı Sıralama Algoritma Analizi Sözde Kod (başka hızlı sıralama algoritması) girdi:=girdi dizi //girdi çıktı:=boş dizi //oluşturulacak çıktı BÜTÜN girdi’DEKİ sayı’lar İÇİN sayı ikiye bölme kullanarak çıktıye sıralanmış şeklinde ekle DÖNGÜ SONU
Hızlı Sıralama Algoritma Analizi Sözde Kod (başka hızlı sıralama algoritması) • Bu algoritma da n log2 n vakit gerekiyor • Bir ikiye bölme ekleme operasyonu, en çok log2 n vakit gerekiyor • n ekleme opearsyon var, toplam O(n log n) vakit gerekiyor • Aslında, sıralama en az n log n vakit gereksinimi gösterilebilir – daha hızlı algoritmalar yok
Çok boyutlu arama • Bir boyutlu diziler için ikiye bölme arama algoritması gördük • Gerçekten çok faydalı yaklaşımdır – n sayılar içeren dizide hedefi bulma sadece log2 n adım gerekiyor • 1,000,000 var olan sayı – arama 20 adımla yapılabilir
Çok boyutlu arama • Dizi birçok bouytlu ise – 2D, 10D, 1000D ? • Bu sorunun ana örğeği internet aramadır: • Bütün internet belgeleri anahtar kelime kümelerle temsil edilebilir • Belgenin birçok anahtar kelim olabilmesi için, bu bütün belgeler birçok boyutlu “anahtar kelime” vektörleriyle (üzlerce boyut) bilgisayar veri tabanında saklanabilir • Kullanıcı arama satırı alınca, miliyonlarca olabilir belgelerin arasında uygun bir hedefi hızlı bulmak lazım
Çok boyutlu arama Ana fikri: • Verimli çok boyutlu arama (KD-araması) • İlk önce bütün belgeler için anahtar kelimlerini birçok hücreye koyuyoruz • Örneğin: • Bütün belgeleri birinci anahtar kelimesine göre iki bölgeye (“büyük”/”küçük” anahtar kelimesi) bölüyoruz • Bütün belgeleri ikinci anahtar kelimesine göre iki bölgeye (“büyük”/”küçük” anahtar kelimesi) bölüyoruz • Devam ...
Çok boyutlu arama K=2 durumu (KD’de K boyut sayısı demektir) Belgeleri ve iki anahtar kelimesi 2. boyut 1. boyut
Çok boyutlu arama K=2 durumu 1. anahtar kelimesine göre bölme 2. boyut 1. boyut
Çok boyutlu arama K=2 durumu 2. anahtar kelimesine göre bölme 2. boyut 1. boyut
Çok boyutlu arama K=2 durumu 4 tane hücre oldu I II 2. boyut III IV 1. boyut
Çok boyutlu arama K=2 durumu Bütün hücrelerde 4 kat daha az belge oldu I II 2. boyut III IV 1. boyut