Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

Karmaşıklık Giriş. 2 Algoritma Analizi •Neden algoritmayı analiz ederiz? –Algoritmanın performansını ölçmek için –Farklı algoritmalarla karşılaştırmak.

Benzer bir sunumlar


... konulu sunumlar: "Karmaşıklık Giriş. 2 Algoritma Analizi •Neden algoritmayı analiz ederiz? –Algoritmanın performansını ölçmek için –Farklı algoritmalarla karşılaştırmak."— Sunum transkripti:

1 Karmaşıklık Giriş

2 2 Algoritma Analizi •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

3 •Bir programın performansı genel olarak programın işletimi için gerekli olan bilgisayar zamanı ve belleğidir. Bir programın zaman karmaşıklığı (time complexity) programın işletim süresidir. •Bir programın yer karmaşıklığı (space complexity) programın işletildiği sürece gerekli olan yer miktarıdır. Bir problemin çözümünde, kullanılabilecek olan algoritmalardan en etkin olanı seçilmelidir. En kısa sürede çözüme ulasan veya en az işlem yapan algoritma tercih edilmelidir. Burada bilgisayarın yaptığı iş önemlidir. Bazı durumlarda da en az bellek harcayan algoritmanın tercih edilmesi gerekebilir. •Ayrıca, programcının yaptığı is açısından veya algoritmaların anlaşılırlıkları bakımından da algoritmalar karşılaştırılabilir. Daha kısa sürede biten bir algoritma yazmak için daha çok kod yazmak veya daha çok bellek kullanmak •gerekebilir (trade-off). 3

4 4 Karmaşıklık: Algoritma performansı ölçme yöntemi Bir algoritmanın performansı iç ve dış faktörlere bağlıdır. • Girdi verisinin büyüklüğü • Bilgisayarın hızı • Derleyicinin kalitesi Algoritma verimliliği: • Çalıştırmak için gereken zaman • Çalıştırmak için gereken yer (bellek alanı) Karmaşıklık iç faktörlerle ve daha çok da zamanla ilgilidir.

5 5 Çalışma Zamanı Analizi N giriş verisi Algoritma 1 Çalışma zamanı T 1 (n) N giriş verisi Algoritma 2 Çalışma zamanıT 2 (n) Algoritma 1 T 1 (N)=1000N Algoritma 2 T 2 (N)=N 2

6 6 Çalışma Zamanı Analizi Giriş verisi N Çalışma zamanı T(N) Algoritma 2 Algoritma

7 7 Çalışma Zamanları Özeti NT1T sec10 -4 sec sec10 -2 sec sec sec100 sec sec10000 sec N değerinin 1000’den küçük olduğu durumlarda iki algoritma arasındaki çalışma zamanı ihmal edilebilir büyüklüktedir.

8 8 Büyüme Hızı ve Büyük-O(big-O)notasyonu •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) an 2 + bn + c olan bir algoritmanın performansı O(N 2 )’dir •N değeri arttıkça N 2 terimi baskın olacağı için büyük-O notasyonunda sadece baskın olan terim kullanılır

9 9 O Notasyonu- Asimtotik Üst Limit •Bir algoritmanın çalışma süresi T(N)=O(f(n)) •T(N)  c f(n) ve N  n 0 koşullarını sağlayan c ve n 0 değerleri varsa T(N)  c f(n) ifadesi doğrudur. •f(n), T(N)’in asimtotik üst limiti olarak adlandırılır. •T(N)=O(f(n)) O bir fonksiyon değil, sadece gösterimdir.

10 10 O notasyonu •O notasyonunda yazarken en basit şekilde yazarız. –Örneğin •3n 2 +2n+5 = O(n 2 ) –Aşağıdaki gösterimlerde doğrudur fakat kullanılmaz. •3n 2 +2n+5 = O(3n 2 +2n+5) •3n 2 +2n+5 = O(n 2 +n) •3n 2 +2n+5 = O(3n 2 )

11 11 O notasyonu- Örnek 1 •3n 2 +2n+5 = O(n 2 ) ifadesinin doğru olup olmadığını ispatlayınız. 10 n 2 = 3n 2 + 2n 2 + 5n 2  3n 2 + 2n + 5 for n  1 c = 10, n 0 = 1 Çözüm kümesini sağlayan kaç tane n0 ve c cifti olduğu önemli değildir. Tek bir çift olması notasyonun doğruluğu için yeterlidir.

12 12 O notasyonu- Ö rnek 2 •Fonksiyonların harcadıkları zamanları O notasyonuna göre yazınız. •f1(n) = 10 n + 25 n 2 •f2(n) = 20 n log n + 5 n •f3(n) = 12 n log n n 2 •f4(n) = n 1/2 + 3 n log n •O(n 2 ) •O(n log n) •O(n 2 ) •O(n log n)

13 13 Sık Kullanılan Büyüme hızları Zaman karmaşıklığıÖrnek O(1) sabitBağlı listeye ilk eleman olarak ekleme yapma O(log N) logSıralı bir dizide bir eleman arama O(N) lineerSıralı olmayan bir dizide bir eleman arama O(N log N)n-log-nN elemanı böl-parçala-yut yöntemiyle sıralama O(N 2 ) ikinci derecedenBir grafikte iki düğüm arasındaki en kısa yolu bulma O(N 3 ) üçüncü dereceden Ardarda gerçekleştirilen lineer denklemler O(2 N ) üsselHanoi’nin Kuleleri problemi

14 14 Büyüme Hızları N Zaman O(N 2 ) O(Nlog N) Kısa bir süre için N 2 NlogN’den daha iyi

15 15 Bir programın asıl çalışma zamanını hesaplama (örnek) •Bir işlem için harcanan zaman 10ms olsun(bir veri üzerinde yapılan tek bir işlem) •1000 veriyi işlemek için programın ne kadar çalışması gerekir? Programın çalışma zamanı aşağıdaki gibi verilmişse bu değer nasıl hesaplanır? –log 10 N –N –N log 10 N –N 2 –N 3 • (1 veri için zaman) x (N veri için verilen büyük-O( ) zaman karmaşıklığı)

16 16 büyük-O nasıl hesaplanır? 1Döngüler 2İç içe Döngüler 3Ardışık deyimler 4If-then-else deyimleri 5Logaritmik karmaşıklık Bir program kodunun zaman karmaşıklığını hesaplamak için 5 kural

17 17 Kural 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. for (i=1; i<=n; i++) { m = m + 2; } Sabit zaman n defa çalışır Toplam zaman = sabit c * n = cn = O(N)

18 18 Kural 2:İç iç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 for (i=1; i<=n; i++) { for (j=1; j<=n; j++) { k = k+1; } Sabit zaman Dış döngü n defa çalışır iç döngü n defa çalışır Toplam zaman = c * n * n * = cn 2 = O(N 2 )

19 19 Kural 3: Ardışık deyimler Her deyimin zamanı birbirine eklenir. toplam zaman = c 0 + c 1 n + c 2 n 2 = O(N 2 ) x = x +1; for (i=1; i<=n; i++) { m = m + 2; } for (i=1; i<=n; i++) { for (j=1; j<=n; j++) { k = k+1; } iç döngü n defa çalışır Dış döngü n defa çalışır Sabit zaman n defa çalışır Sabit zaman

20 20 Kural 4: If-then-else deyimleri 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. if (depth( ) != otherStack.depth( ) ) { return false; } else { for (int n = 0; n < depth( ); n++) { if (!list[n].equals(otherStack.list[n])) return false; } then: sabit else: (sabit +sabit) * n test: sabit Diğer if : sabit+sabit (else yok) Toplam zaman = c 0 + c 1 + (c 2 + c 3 ) * n = O(N)

21 21 Kural 5: Logaritmik karmaşıklık 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

22 Örnek // Input: int A[N], array of N integers // Output: Sum of all numbers in array A int Sum(int A[], int N) { int s=0; for (int i=0; i< N; i++) s = s + A[i]; return s; } Nasıl analiz edilebilir?

23 Toplama İşlemi // Input: int A[N], array of N integers // Output: Sum of all numbers in array A int Sum(int A[], int N { int s=0; for (int i=0; i< N; i++) s = s + A[i]; return s; } ,2,8: Bir defa 3,4,5,6,7: Her iterasyonda 1 defa N iterasyonlu işlemde Toplam: 5N + 3 Karmaşıklık: f(N) = 5N +3

24 5N+3 Nasıl Etkiler? Farklı N değerlerine göre işlem adımlarına bakalım: N = 10=> 53 steps N = 100=> 503 steps N = 1,000=> 5003 steps N = 1,000,000=> 5,000,003 steps N büyüdükçe lineer bir yükselme göstermektedir.

25 25 Çalışma zamanı 6N+4=O(N) 1 1 int Sum (int N) { int i, PartialSum; PartialSum=0; for(i=1 ;i<=N ; i++) PartialSum+=i*i*i; return PartialSum; } Algoritma 1 N+N+2N 1+(N+1)+N

26 26 Çalışma zamanı O(N 2 ) for(i=0; i

27 27 •int binary search(A,key,N) •low=0, high=N-1 •while(low  high) •mid=(low+high)/2 •if(A[mid]key) •high=mid-1; •if(A[mid]=key) •return mid •Return not found Algoritma 4 Her bir iterasyondan sonra, arama yapılacak eleman sayısı logaritmik olarak azalmaktadır. Çalışma süresi O(logN)’dir.

28 Algoritma 5 Peki while -döngüsü? bool done = false; int result = 1, n; cin>>n; while (!done){ result = result *n; n--; if (n <= 1) done = true; } Döngüden çıkıldığında done == true, N iterasyon Gerçekleşmiş olmaktadır.. Toplam zaman: O(N)

29 Birden fazla ifade Birden fazla birbirinden bağımsız ifade öbekleri varsa Karmaşıklık ifadelerin zamanlarının toplamıdır. for (j=0; j < N; j++) for (k =0; k < j; k++) sum = sum + j*k; for (l=0; l < N; l++) sum = sum -l; cout<<“Sum is now”<

30 30 Analiz •Strateji:Alt ve üst limitlerin bulunması Üst limit Algoritmanın gerçek fonksiyonu Alt limit

31 31 •Bazı durumlarda en iyi, ortalama, en kötü durum karmaşıklığı gözönüne almak gerekir •Örnek: Liste sıralarken eğer liste zaten sıralıya yakınsa yapılacak iş azdır. •En kötü durum muhtemel bütün girdiler için bir sınır çizer ve genelde ortalamadan daha kolay bulunur En iyi, ortalama, en kötü durum karmaşıklığı – En kötü, O(N) veya o(N):  veya > asıl fonksiyon * – Genel, Θ(N):  asıl fonksiyon * – En iyi, Ω(N):  asıl fonksiyon *

32 32  Notasyonu- Asimtotik Alt Limit f(n)f(n) c g(n)  O notasyonun tam tersidir.  Her durumda T(N)  c f(n) ve N  n0 koşullarını sağlayan pozitif, sabit c ve n0 değerleri bulunabiliyorsa T(N)=  (f(n)) ifadesi doğrudur.  f(n), T(N)’in asimtotik alt limiti olarak adlandırılır. n0n0

33 33  notasyonu- Ö rnek 1 •7n 2 +3n+5 = O(n 4 ) •7n 2 +3n+5 = O(n 3 ) •7n 2 +3n+5 = O(n 2 ) •7n 2 +3n+5 =  (n 2 ) •7n 2 +3n+5 =  (n) •7n 2 +3n+5 =  (1)

34 Resursive-Yinelemeli fonk. 34 •Aşağıdaki ifade: yinelemeli bir fonksiyondur.

35 35 Yineleme çözme metodları •Iterasyon Metodu •Recursion Ağacı metodu •Master Teorem

36 36 İterasyon Yöntemi –Yineleme işlemini açık hale getir –Matematiksel işlemlerle göster –Toplamı hesapla.

37 37 •s(n) =n + s(n-1) =n + n-1 + s(n-2) =n + n-1 + n-2 + s(n-3) =n + n-1 + n-2 + n-3 + s(n-4) =… =n + n-1 + n-2 + n-3 + … + n-(k-1) + s(n-k)

38 38 •So far for n >= k we have •What if k = n? •Thus in general

39 39 Iteration Method – Örnek 2 T(n) = n + 2T(n/2) = n + 2(n/2 + 2T(n/4)) = n + n + 4T(n/4) = n + n + 4(n/4 + 2T(n/8)) = n + n + n + 8T(n/8) … = in + 2 i T(n/2 i ) = kn + 2 k T(1) = nlgn + nT(1) = Θ(nlgn) Kabul: n = 2 k T(n/2) = n/2 + 2T(n/4)

40 L2.40 Master Teorem f (n) ile n log b a karşılaştırma: 1. f (n) = O(n log b a –  ) şartı  > 0 için sağlanıyorsa. •f (n) polinomik olarak büyüyordur. Çözüm: T(n) =  (n log b a ).

41 L2.41 Master teorem 2. f (n) =  (n log b a lg k n) bir k  0 sabitini sağlıyorsa. •f (n) ve n log b a eşit oranda büyüyordur. Çözüm: T(n) =  (n log b a lg k+1 n). f (n) ile n log b a karşılaştırma:

42 L f (n) =  (n log b a +  ) ifadesi  > 0 sabiti sağlıyorsa •f (n) çok hızlı büyüyordur. N log b a e göre. ve f (n) düzenlilik şartını a f (n/b)  c f (n) c < 1gibi bir c değeri için sağlarsa. Çözüm: T(n) =  ( f (n) ). f (n) ile n log b a karşılaştırma: Master teorem

43 L2.43 Örnekler Ex. T(n) = 4T(n/2) + n a = 4, b = 2  n log b a = n 2 ; f (n) = n. C ASE 1: f (n) = O(n 2 –  ) için  = 1.  T(n) =  (n 2 ). Ex. T(n) = 4T(n/2) + n 2 a = 4, b = 2  n log b a = n 2 ; f (n) = n 2. C ASE 2: f (n) =  (n 2 lg 0 n), ise, k = 0.  T(n) =  (n 2 lg n).

44 L2.44 Örnekler Ex. T(n) = 4T(n/2) + n 3 a = 4, b = 2  n log b a = n 2 ; f (n) = n 3. C ASE 3: f (n) =  (n 2 +  ) için  = 1 ve 4(cn/2) 3  cn 3 (reg. cond.) için c = 1/2.  T(n) =  (n 3 ). a f (n/b)  c f (n)

45 45 Performans her şey demek değildir! •Bazen aşağıdaki iki durum birbiriyle çelişebilir: –Anlama, yazma ve hata ayıklama kolaylığı –Zaman ve yerin verimli kullanılması –Bu nedenle maksimum performans her zaman tercih edilmeyebilir •Ancak yine de en uygun algoritmayı kullanmak mümkün olmasa da farklı yöntemleri karşılaştırmak yararlıdır.


"Karmaşıklık Giriş. 2 Algoritma Analizi •Neden algoritmayı analiz ederiz? –Algoritmanın performansını ölçmek için –Farklı algoritmalarla karşılaştırmak." indir ppt

Benzer bir sunumlar


Google Reklamları