MIT503 Veri Yapıları ve algoritmalar Yrd. Doç. Dr. Yuriy Mishchenko
Tanıştırma ve Temel Kavramlar Ders planı Algoritmalara giriş, algoritmalar nedir Algortimaların temel temsili Algoritmaların temel türleri Algoritmaların temel analizi
Algoritmalar nedir? Algoritmalar Algoritmaları çoğunlukla bilgisayar yazılım anlamından biliyoruz Algoritmaların çoğunun matematiksel ve bilgisayar algoritmaların olmasına rağmen, algoritmalar çok daha geniş bir kavramdır
Algoritmalar nedir? Algoritmalar Matematiksel ve bilgisayar algoritmaları bilgisayar biliminin (computer science) konusudur Bilgisayar bilimi, matematiğin bir bölümüdür Bu anlamda algoritmalar, bir matematiksel problemin çözümünün talimatı yada planıdır
Algoritmalar nedir? En temel matematiksel algoritma – tamsayıların eklenmesi 127 326 453 + 1
Algoritmalar nedir? Bu anlamda matematiksel algoritmalar, Problem/amaç var Çözümüne/amaca nasıl ulaşabileceğini açıklayan talimat yada detaylı plan
Algoritmalar nedir? Algoritmalar sadece matematiksel problemler değiller
Algoritmalar nedir? Evde çorba pisirmek Sebzeleri hazırlamak Suyu kaynatmak Tavuğu ekleyip pişirmek Sebze kestirip kızartmak Herşeyi tencereye koymak Birkaç (birçok) dakika kaynatmak Ateşi kapatmak ve sakinleşmesini beklemek
Algoritmalar nedir? Okula ders için gelmek Evden çıkmak Evin kapısını kilitlelemek Dolmuşa binmek Dolmuşta para vermek Toros durağını beklemek Durağınızda durağını söyleyip inmek Dersliğe kadar yürümek
Algoritmaların temel temsili Algoritmalar formülleştirmek/belirtmek için çözüm planı/talimatı bir şekilde tanımlanması gerekiyor Önceki şekilde algoritmanın sırayla verilen bir talimat şeklinde tanımlanmasına sözde kod denir
Algoritmaların temel temsili Sözde kod, algoritmanın yazılı ve birazcık biçimsel talimat liste şeklinde yapılmış tanımıdır Sözde kod, normal programlara benzer ve algoritmalar daha temel seviyede belirtmek için çoğunlukla kullanılan alettir
Algoritmaların temel temsili Algoritmanın talimat sırası bir akış şeması şeklinde de belirtilebilir
Çorba algoritması: Sebzeleri hazırlamak Suyu kaynatmak Tavuğu ekleyip pişirmek Sebze kestirip kızartmak Herşeyi tencereye koymak Birkaç (birçok) dakika kaynatmak Ateşi kapatmak ve sakinleşmesini beklemek
Algoritmaların temel temsili Bu şekilde temsil edilmiş algoritmalara akış şeması şeklinde yazılmış olması denir Bu temsil algoritmaların talimatlarının sırasını yada işletme akışını belirtir Böyle algoritmaların temsillerine akış şeması denmektedir
Algoritmaların temel türleri Algoritma, normalde belirli bir soru için geliştirilir ve farklı sorular için farklı algoritmalara gerek vardır; bu anlamda genel bir algoritma olamaz Ancak genel algoritma geliştirme stratejileri veya birçok benzer soruyu çözen algortimalar olabilir Özyineleme (recursion) Böl ve fethet (divide and conquire) Açgözlü/yerel (greedy or local) Dynamik programlama (dynamic programming)
Algoritmaların temel türleri Özyineleme (recursion) Çözüm basamakları aynı şekildedir, sadece giriş bilgileri değişebilir Sonuç aynı hesaplama yinelenen uygulamasıyla sağlanır Factöriyel özyinelemenin klasik örnektir: Faktöriyel – “n!=1*2*3*…*n” Özyineleme adımı: n!=n*(n-1)! Özyineleme uygulaması: F(sayı)=sayı*F(sayı-1) Bunun çıktısı faktöriyeldir, yani F(n)=n*(n-1)*(n-2)*...*1
Algoritmaların temel türleri Böl ve fethet (divide and conquire) Problem, birkaç daha küçük problem şeklinde temsil edilebilir Sorun, ilk önce parçalara bölünür ve parçalar ayrı ayrı çözülür Final sonucu elde etmek için, parçalarının çözümleri birleştirilir Sıralama böl-ve-fethet yaklaşımın klasik örneğidir Bir n-elemenlı dizisi sıralamak için genellikle n2 zaman gerekiyor Diziyi iki eş parçaya bölün ve parçaları ayrı ayrı düzeltin, bunun için 2*(n/2)2 zaman lazım Parçaları geri birleştirip aynı dizi n2/2 zamanda sıralanabilmektedir
Algoritmaların temel türleri Açgözlü/yerel (greedy/local) Genellikle optimizasyon problemler Bir sorunu adım adım çözürken bütün adımları için o adımda optimal (yani en iyi) olarak görünen seçimi yapmak gerekmektedir Açgözlü/yerel algoritmanın yol bulma örneği: Evden çıktığımızda, okulda en yakın yere giden dolmuşu binin O durakta inince tekrar okula en yakın olan yere giden dolmuşu binin vb
Algoritmaların temel türleri Dinamik programlama (dynamic programming) Optimizasyon probleminin çözümü, yani bir soru için optimal (en uygun) cevabı sağlamayı istenmektedir Özyineleme kullanarak bütün mümkün cevaplar için onların maliyet/uygunluk hesaplanır Dinamik programlama yol bulma örneği Fikir: Bütün duraklar için o duraktan okula ulaşmak için gereken zamanı buluyoruz, t(DURAK) Nasıl yapılabilir: Okulda olan A durağında t(A)=0 Bütün diğer duraklar için t(B)=min(t(A)+t(A←B)) A’dan başlayınca adım adım bütün duraklar için yukarıdaki şekilde t(B) hesaplanır
Yol bulma algoritması Okul Ev 5 dk 10 dk 15 dk 10 dk
Yol bulma algoritması Ev Okul 15=min(5+10,10+10) 5=0+5 30 20 25 15 5 Okul Ev 5 dk 10 dk 15 dk 10 dk
En uygun yol, yol zamanı 5+10+10+5=30 dk Yol bulma algoritması En uygun yol, yol zamanı 5+10+10+5=30 dk 30 20 25 15 5 10 Okul Ev 10 dk 5 dk 15 dk 5 dk 10 dk
En “yakın” (açgözlü) yol, zamanı 15+5+5+10=35 dk Yol bulma algoritması En “yakın” (açgözlü) yol, zamanı 15+5+5+10=35 dk 30 20 25 15 5 10 Okul Ev 10 dk 5 dk 15 dk 5 dk 10 dk
Algoritmaların temel türleri Fark edin ki, bu yol bulma algoritması birçok diğer durumda da kullanılabilir Gerçek bir yol bulmak Üretim süreci planlamak Belge işlenme planlamak Benzer grafik şekilde temsil edilebilir herhangi bir problem!
Algoritma temel analizi Herhangi algoritmanın birinin tarafından yapılması düşünülmektedir (bilgisayar, kişi, vb) Bu açıdan herhangi algoritmanın çok önemli olan noktası, algoritmanın talimatları gerçekleştirmek için gereken zaman ve diğer maliyetleri
Algoritma temel analizi Algoritmanın işletme zamanı genellikle kesin durumuna bağlı (mesela, durakların sayısı, dizinin uzunluğu, vb) Bunun gibi algoritmanın durumlara giriş denir Algoritmanın işletme zamanı ve diğer maliyetleri algoritmanın girişine bağlıdır
Algoritma temel analizi Algorıtma analizinin amacı, belirli giriş boyutları için algoritmanın zaman ve bellek gereksinimleri belirtmektedir Girişinin boyut için genellikle “n” sayı ile temsil edilir, bu herhangi şekilde girişin boyutunu belirtilen nicelik olabilir – sıralanacak dizinin uzunluğu, bulunacak yol için toplam durak sayısı, vb
Algoritma temel analizi Bir girişe bağlı algoritmanın zaman gereksinimi belirtmek için genellikle O notasyonu kullanılır O(n), algoritmanın zamanı lineerdir, yani büyük n’ler için yaklaşık olarak const*n formula ile verilir O(n2), algoritmanın zamanı kareseldir, yani büyük n’ler için yaklaşık olarak const*n2 formula ile verilir VB Örneğin, sıralama’nın basit uygulamasının zamanı O(n2) ve en iyi olabilir zamanı O(n log n)’dir
Algoritma temel analizi Veritabanındaki verileri sıralamak için gereken zaman nekadardır? Veritabanında eleman sayısı “n”=1,000,000=106 O(n2) algoritmasının işletme zamanıdır n2=1012 O(n log n) algoritmasının işletme zamanıdır n log n=6*106 Eğer bilgisayar sanyede 10,000 operasyon yapabilirse, O(n2) sıralaması 108 saniye O(n log n) sıralaması sadece 600 saniye gerekecektir!