Algoritma analizi, bilgisayar mühendislerine, bir algoritmayı
çalıştırmadan, ne kadar sürede çalışacağını, veya en azından diğer
alternatiflerine göre nasıl davranacağını (daha hızlı, daha yavaş, yakın
hızda, daha az yer kaplayacak şekilde vb.) söyler.
Bu açıdan, algoritma analizi, bilgisayar mühendisliğinin
(bilimlerinin) en önemli matematiksel dayanağını oluşturur. Matematik
bilimindeki karmaşıklık teoreminin (complexity theory) bir uygulama
alanı olan algoritma analizi, matematiksel yöntemlerle, bir algoritmanın
performansı hakkında bilgi verir.
Neden algoritmayı analiz ederiz?
Algoritmanın performansını ölçmek için
Farklı algoritmalarla karşılaştırmak için
Daha iyisi mümkün mü? Olabileceklerin en iyisi mi?
Özelliklerinin analizi
Algoritmanın çalışma zamanı
Hafızada kapladığı alan
Bir algoritmanın performansı iç ve dış faktörlere bağlıdır.
Karmaşıklık iç faktörlerle ve daha çok da zamanla ilgilidir.
Yürütme Zamanı T(n)
Bir yazılım kodunda, toplam kaç birim işlem yapıldığının göstergesidir.
Buradaki her bir birim işlem, her bir dil (örn C# dili) ifadesi olarak ele alınabilir.
n olarak ifade edilen birim işlemlerin toplamı T(n) yürütme zamanı fonksiyonunu verecektir.
Ancak birçok algoritma veri işlediğinden dolayı, n’i belirleyen en büyük faktör veri sayısı olacaktır.
ÖRNEK
Aşağıda
bir dizinin aritmetik ortalamasını bulan ve sonucu kullanıcıya geri
döndüren bulortalama() adlı fonksiyonun kodu verilmiştir. Bu fonksiyonun
yürütme zamanını gösteren T(n) bağıntısını elde ediniz.
ÇALIŞMA ZAMANI ANALİZİ
Bir algoritmanın performansı iç ve dış faktörlere bağlıdır.
Algoritma 1 T1(N)=1000N
Algoritma 2 T2(N)=N2
N değerinin 1000’den küçük olduğu durumlarda iki algoritma arasındaki çalışma zamanı ihmal edilebilir büyüklüktedir.
BÜYÜME HIZI VE BÜYÜK O (BIG O) NOTASYONU (Karmaşıklık)
Büyüme hızı bir algoritmanın performansını yansıtan en iyi göstergedir.
Büyük-O
notasyonu büyüme hızını gösterir. Bir algoritmanın performansını en iyi
tanımlayan matematiksel bir formüldür ve algoritmanın iç detaylarına
bakılarak elde edilir.
Büyük-O girdi verisinin büyüklüğünü gösteren bir N parametresine dayanan bir fonksiyondur.
Örneğin
n değerine bağlı olarak performansı (sabit a, b, c değerleri için) an2 +
bn + c olan bir algoritmanın performansı O(N2)’dir
N değeri arttıkça N2 terimi baskın olacağı için büyük-O notasyonunda sadece baskın olan terim kullanılır.
Bir algoritmanın çalışma zamanı bulunduktan sonra, ne tür bir karmaşıklığa sahip algoritma olduğunu belirlemek için;
T(n)
bulunduktan sonra, tüm değişkenler tek tip değişkene dönüştürülür,
sabitler ve düşük dereceli terimler atılar ve en yüksek dereceli terim,
O(n) karmaşıklık foksiyonunu ifade eder.
Örn: T(n) = 3n + 4 O(n) olur.
O notasyonunda yazarken en basit şekilde yazarız.
Örneğin
3n2+2n+5 = O(n2)
Aşağıdaki gösterimlerde doğrudur fakat kullanılmaz.
3n2+2n+5 = O(3n2+2n+5)
3n2+2n+5 = O(n2+n)
3n2+2n+5 = O(3n2)
BÜYÜK O (BIG O) NASIL HESAPLANIR?
Bir program kodunun zaman karmaşıklığını hesaplamak için 5 Kural;
1 Döngüler
2 İç içe Döngüler
3 Ardışık deyimler
4 If-then-else deyimleri
5 Logaritmik karmaşıklık
1. DÖNGÜLER
Bir döngünün çalışma zamanı en çok döngü içindeki deyimlerin çalışma zamanının iterasyon sayısıyla çarpılması kadardır.
Toplam zaman = sabit c * n = cn = O(N)
2. İÇ İÇE DÖNGÜLER
İçteki analiz yapılır. Toplam zaman bütün döngülerin çalışma sayılarının çarpımına eşittir.
Toplam zaman = c * n * n * = cn2 = O(N2)
3. ARDIŞIK DEYİMLER
Her deyimin zamanı birbirini etkiler.
toplam zaman = c0 + c1n + c2n2 = O(N2)
4. IF-THEN-ELSE DEYİMLERİ
En kötü çalışma zamanı:test zamanına then veya else kısmındaki çalışma zamanının hangisi büyükse o kısım eklenir.
Toplam zaman = c0 + c1 + (c2 + c3) * n = O(N)
5. LOGARİTMİK KARMAŞIKLIK
Problemin büyüklüğünü belli oranda(genelde ½) azaltmak için sabit bir zaman harcanıyorsa bu algoritma O(log N)’dir.
Örnek algoritma (binary search):
N sayfalı bir sözlükten bir sözcük arama
Sözlüğün orta kısmına bakılır
Sözcük ortaya göre sağda mı solda mı kaldığı bulunur?
Bu işlem sağ veya solda sözcük bulunana kadar tekrarlanır.
ÖRNEK
Fonksiyonların harcadıkları zamanları O notasyonuna göre yazınız.
f1(n) = 10 n + 25 n2
f2(n) = 20 n log n + 5 n
f3(n) = 12 n log n + 0.05 n2
f4(n) = n1/2 + 3 n log n
SIK KULLANILAN BÜYÜME HIZLARI
Hiç yorum yok:
Yorum Gönder