İleri Algoritma Analizi Ders11: Algoritma problemleri Prof. Dr. Şahin EMRAH İleri Algoritma Analizi
Problem1 n>=1 tam sayı, x de 1<=x<=n koşuluna uyan bilinmeyen bir sayıdır. Bu x sayısını 1<=i<=n olmak üzere mümkün oldukça az x<=i türü karşılaştırma yaparak bulmak gerekir. (örneğin, n=10 olsun. Kullanıcıya 1<=x<=10 koşuluna uyan bir x sayısı düşün diyoruz ve kullanıcıya evet veya hayır yanıtı verebileceği sorular soruyoruz. x<=7 mi Evet x<=4 mü Hayır x<=6 mı Evet x<=5 mi Hayır cevap 6). Aşağıdaki 3 durum için en kötü durumda da log2n den daha az karşılaştırma yapan ve ikili arama algoritmasına benzer bir algoritma yazınız ve sonra en kötü durum için karşılaştırma sayısını tam olarak bulunuz. x tek sayıdır. x=y2 ve y tam sayıdır. x=2y ve y pozitif tam sayıdır.
Çözüm
Problem2 n x n boyutlu M matrisi n2 sayıda farklı tam sayılardan oluşmuştur. Bu matrisin her satırı soldan sağa ve her sütunu yukarıdan aşağıya artan sıralıdır. x sayısı M in bir elemanı olsun. M de x in yerini bulmak için verimli bir algoritma tasarlayınız. Algoritmanızın en kötü durumdaki karşılaştırma sayısını bulunuz.
Çözüm
Çözüm (devam)
Problem3 A dizisi sıralı olmayan n (n≥4) tane farklı sayıdan oluşan n elemanlı bir dizidir ve bu dizinin terimleri arasında n den çok büyük pozitif tam sayılar da vardır. Bu dizinin 2 en büyük ve 2 en küçük elemanını bulabilen verimli bir algoritma tasarlayınız. Algoritmanızın en kötü durumdaki karşılaştırma sayısını kesin olarak bulunuz.
Çözüm
Çözüm devam Örnek. Algoritmayı 16 elemanlı 1,2,3,...16 dizisine uygulayalım. İlk turda komşu sayıları karşılaştıralım. Bu durumda 8 karşılaştırma sonucunda “Büyükler”={2,4,6,8,10,12,14,16} ve “küçükler”={1,3,5,7,9,11,13,15} kümelerini belirleriz. “Büyükler” arasında eleme usulü turnuva (2<4, 6<8, 10<12, 14<16 sonra 4<8, 12<16 sonra 8<16) ile 7 karşılaştırma ile “şampiyon” olarak 16 yı buluruz. 16 nın elediği sayılar {15, 14, 12, 8} arasında 3 karşılaştırma ( 14<15, 8<12, 12<15) yaparak 2.büyük sayı olan 15 i buluruz. Benzer olarak “küçükler” arasındaki minimum sayıyı bulmak için eleme usulü turnuva (1<3, 5<7, 9<11, 13<15 sonra 1<5, 9<13 sonra 1<9) ile 7 karşılaştırma ile “şampiyon” olarak 1 i buluruz. 1 in elediği sayılar {2, 3, 5, 9} arasında 3 karşılaştırma ( 2<3, 5<9, 2<5) yaparak 2. Küçük sayı olan 2 yi buluruz. Toplam 28 karşılaştırma oldu.
Problem4
Çözüm Önce SELECT algoritmasının yardımıyla A dizisinin medianını buluruz. (Dizide esas eleman varsa bu eleman median olmalıdır.) Sonra da diziyi baştan sona tarayarak (örneğin, bir for döngüsü ile) bu dizide medianın kaç defa geçtiğini sayarız. Eğer en az defa geçiyorsa median esas elemandır, aksi durumda esas eleman yoktur. Algoritmanın işlem süresi Θ(n)+Θ(n)=Θ(n) dir. (SELECT algoritmasının işlem süresi+döngünün çalışma süresi)
Problem 5 A dizisi artan sıralı n tane farklı tam sayıdan oluşan bir dizidir. A[i]=i koşuluna uyan elemanı bulabilen (eğer böyle bir eleman varsa) verimli bir algoritma tasarlayınız. Algoritmanızın işlem süresini bulunuz.
Çözüm
Problem6 A[1...n] dizisinin elemanları [1, n] aralığından olan farklı tam sayılardır. Eğer A[i1]=i2, A[i2]=i3,...A[ik-1]=ik ve A[ik]=i1 ise (i1,i2, ...ik) indisler dizisine k uzunluklu döngü denir. Bir i için A[i]=i ise (i) 1 uzunluklu döngüdür. Örneğin, 4, 6, 3, 5, 8, 7, 2, 1 dizisinde (1, 4, 5, 8) dizisi 4- uzunluklu döngüdür. Bu dizide (2, 5, 7) dizisi 3 uzunluklu ve (3) ise 1 uzunluklu döngülerdir. Yani bu dizide 3 adet döngü vardır. Verilen bir dizinin döngü sayısını bulabilen verimli bir algoritma tasarlayınız. Algoritmanızın işlem süresini bulunuz.
Çözüm. İlk elemandan başlarız, sonra bu dizinin bu elemanının değeri olan indise gideriz. Başladığımız indise geri döndüğümüzde döngü sayısını tuttuğumuz sayacı bir artırırız ve 2. elemana geçeriz. Eğer bu elemanda daha önceden bulunmadıysak aynı algoritmayı bu elemana uygularız, bulunduysak, gezinmediğimiz elemanı bulana kadar veya tüm indislere gidilene kadar indisi bir artırırız. Gezindiğimiz indislerin bilinmesi için değerleri 1 veya 0 olan n boyutlu bir B dizisi kullanırız. Dizinin her elemanına sadece bir defa bakıldığına göre işlem süresi O(n) olur.
Problem7 A dizisi n (n≥5) tane farklı çok büyük pozitif tam sayıdan oluşan bir dizidir. Aşağıdaki problemlerin her biri için en kötü durumda karşılaştırma sayısının en az olduğu verimli bir algoritma tasarlayınız. Algoritmanızın en kötü durumdaki karşılaştırma sayısını bulunuz. Dizinin en büyük veya en küçük olmayan bir elemanını bulunuz. Dizinin en büyük veya 2. en büyük veya en küçük veya 2. en küçük olmayan bir elemanını bulunuz. 1≤k≤n/2 koşuluna uyan k sayısı için dizinin ilk k en büyük veya ilk k en küçük elemanı arasında olmayan bir elemanını bulunuz.
Çözüm. a) 1. , 2. ve 3. elemanları birbiri ile karşılaştırarak ortanca (birinden büyük, diğerinden küçük olan) elemanı buluruz. Bu eleman istenen koşulu sağlar. Sadece 3 karşılaştırma yaptığımıza göre işlem süresi O(1) olur. b) İlk 5 elemanı bir biriyle karşılaştırarak ortanca (ikisinden büyük, diğer ikisinden küçük olan) elemanı buluruz. Bu eleman istenen koşulu sağlar. Sadece 10 karşılaştırma yaptığımıza göre işlem süresi O(1) olur. c) SELECT algoritmasını kullanarak (k+1). istatistiği buluruz. Bu eleman k elemandan büyüktür, n-k-1 elemandan küçüktür. k<n/2 olduğundan k+1≤n/2, buradan da n-k-1=n-(k+1)≥n-n/2=n/2>k olur. Yani (k+1). istatistik istenen koşulu sağlar. SELECT algoritmasının işlem süresi O(n) dir.
Problem 8 Bir x pozitif tamsayısı ve ikisi de doğal sayılardan oluşan ve artan sıralı n elemanlı A ve B dizileri veriliyor. (x ve dizilerin elemanları çok büyük sayılar olabilirler.) A[i]+B[j]=x koşuluna uyan A[i] ve B[j] sayılarını bulabilen (eğer varsa) verimli bir algoritma tasarlayınız. Algoritmanızın en kötü durumdaki işlem sayısını bulunuz.
Çözüm A yı baştan, B yi sondan başlayarak A[i] +B[j] ile x i karşılaştırırız. (Yani i nin başlangıç değeri 1, j nin başlangıç değeri n dir). Eğer eşit çıkarsa bulundu. Küçük çıkarsa A nın bir sonraki elemanı (yani i yi bir artırırız) ile B[j] nin toplamını x ile karşılaştırırız. Büyük çıkarsa A[i] ile B nin bir önceki elemanının toplamını x ile karşılaştırırız. (yani j yi bir azaltırız.) Karşılaştırma sayısı en fazla 2n-1 olur, yani işlem süresi O(n) dir.