Algoritmalar Arama Problemi ve Analizi Bahar 2016 Doç. Dr. Suat Özdemir 1
Arama Problemi Sıralama algoritmaları gibi arama algoritmaları da gerçek hayat bilgisayar mühendisliği problemlerinin çözümünde sıkça kullanılan algoritmalardır. Arama işlemi tek başına bir problem teşkil edebileceği gibi (örneğin veri tabanlarında kayıt arama işlemi) bir problemin çözümünde ara bir işlem de olabilir (işletim sistemlerin de işlem yapılabilmek için anahtar kelimelerin hafıza üzerinde bulunması). Bilgisayar mühendisliğinin temel bir problemi olması nedeni ile bir çok arama algoritması geliştirilmiştir. Arama işlemi ağaç gibi, çizge (graph) gibi daha gelişmiş veri yapıları üzerinde yapılabilmesine rağmen bu bölümde arama işleminin diziler üzerinde yapıldığı varsayılmıştır. Bahar 2016 Doç. Dr. Suat Özdemir 2
Arama Problemi Bu ders kapsamındaki temel arama problemi Farklı sayısal değerlerden oluşan a 1, a 2, a 3,, a n dizisi içinde herhangi bir x değerinin olup olmadığının ve varsa yerinin öğrenilmesi şeklinde tanımlanabilir. Problemin çözümü içinse x elemanına eşit olan a i elemanın bulunup indeks değerinin döndürülmesi gerekmektedir. Eğer x = a i ise x söz konusu dizinin i. elemandır. Problemin çözümü için akla gelebilecek ilk fikir kaba kuvvet yöntemine dayalı doğrusal veya sıralı arama yöntemidir (Linear/sequential search). Bahar 2016 Doç. Dr. Suat Özdemir 3
Arama Problemi Insertion Sort algoritmasında olduğu gibi çoğu insanın küçük boyutlu dizilerde kullandığı içgüdüsel bir çözümdür. Doğal olarak böyle bir çözümden çok iyi bir çalışma zamanı performansı beklemek mümkün değildir. Geçtiğimiz derslerde öğrendiğimiz problem çözme yaklaşımları kullanılarak performans artışı sağlanabilir. Bu bağlamda böl-ve-yönet problem çözme tekniği uygulanarak arama işleminin performansı artırılabilir. Ancak, doğrusal arama algoritmasının avantajı arama yapılacak dizinin sırasız olduğu durumlarda da çalışabilmesidir. Böl-ve-yönet problem çözme tekniğine dayalı yöntemler ise arama yapılacak olan dizinin sıralı olmasını gerektirir. Bahar 2016 Doç. Dr. Suat Özdemir 4
Doğrusal (Sıralı) Arama Algoritması En basit arama biçimi doğrusal aramadır. En baştan başlayarak teker teker bütün dizi, aranan eleman bulunana kadar taranır. Eğer aranan eleman dizide bulunursa bulunduğu pozisyonun indeks değeri sonuç olarak döndürülür. Aranan değer dizi içinde bulunamazsa buna ait bir mesaj sonuç olarak döndürülür. A 0.. n 1 dizisinde doğrusal arama yapacak algoritmaya ait sözde kod ve bir örnek aşağıda verilmiştir. Bahar 2016 Doç. Dr. Suat Özdemir 5
Doğrusal (Sıralı) Arama Algoritması Bahar 2016 Doç. Dr. Suat Özdemir 6
Örnek: Doğrusal Arama Yukarıda verilen dizide x=22 elemanı aranıyor olsun. Verilen sözde koda göre x değeri sıra ile 7, 12, 5 ve 22 değerleri ile karşılaştırılacaktır. 22 değeri ile olan karşılaştırma eşitlik sağlandığı için algoritma 22 nin indeks değeri olan 3 döndürecektir. Eğer x=40 için bir arama yapılsaydı hiç bir zaman eşleşme olmayacağı için algoritma 40 dizide bulunamadı mesajını döndürürdü. Bahar 2016 Doç. Dr. Suat Özdemir 7
Doğrusal Arama Çalışma Zamanı Analizi Oldukça basit bir algoritma olan Doğrusal Arama algoritması aranan değerin girdi dizisindeki pozisyonuna (veya varlığına) göre çok farklı performans gösterebilir. Bu nedenle en iyi, en kötü ve ortalama çalışma zamanlarına bakılması gerekmektedir. Bahar 2016 Doç. Dr. Suat Özdemir 8
En İyi Çalışma Zamanı Analizi Algoritmadan elde edilebilecek en iyi çalışma zamanı aranan değerin A dizisinin ilk elemanı olması durumunda oluşur. Bu durumda algoritma sadece 1 karşılaştırma yapıp sonlanacaktır, bu nedenle çalışma zamanı Ω 1 olarak ifade edilir. Bahar 2016 Doç. Dr. Suat Özdemir 9
En Kötü Çalışma Zamanı Analizi Benzer şekilde algoritmadan elde edilebilecek en kötü çalışma zamanı aranan değerin A dizisinin son elemanı olması veya dizide olmaması durumunda oluşur. Bu durumda algoritma tüm diziyi aranan x değeri ile karşılaştırmak zorundadır, yani algoritma n karşılaştırma yapıp sonlanacaktır, bu nedenle çalışma zamanı O n olarak ifade edilir. Buradan anlaşılacağı üzere en iyi veya en kötü çalışma zamanı tamamen girdi dizisine ve aranan değere bağlı olup algoritmanın rasgele bir girdi dizisi ve aranan eleman için performansı konusunda fikir vermemektedir. Bu nedenle ortalama çalışma zamanı analizi yapılmadır. Bahar 2016 Doç. Dr. Suat Özdemir 10
Ortalama Çalışma Zamanı Analizi Ortalama çalışma zamanı analizini yapmak için önce aşağıdaki iki kabulün yapılması gerekir. başarılı bir aramanın olma olasılığı p dir (0 p 1) aramada eşleşmenin herhangi bir i indeksinde olma olasılığı her i değeri için eşittir Bu kabuller dahilinde Doğrusal Arama algoritmasının ortalama çalışma zamanı analizi aşağıdaki gibi yapılabilir. Başarılı bir aramanın dizinin herhangi bir i. pozisyonunda olma olasılığı p/n dir. Ayrıca bu işlem için gerekli olan karşılaştırma sayısı da i dir. Bahar 2016 Doç. Dr. Suat Özdemir 11
Ortalama Çalışma Zamanı Analizi Benzer şekilde yapılan aramanın başarısız bir arama olma olasılığı (1 p) dir ve toplam n karşılaştırma gerektirir. Buna göre herhangi bir arama işlemi için gerekli olan toplam karşılaştırma sayısı K aşağıdaki şekilde ifade edilir: Bahar 2016 Doç. Dr. Suat Özdemir 12
Ortalama Çalışma Zamanı Analizi Elde edilen son ifade bize algoritmanın çalışma zamanı hakkında net bilgi vermektedir. Başarılı bir arama için p=1 olacağı için K = (n + 1)/2 yani yaklaşık olarak n/2 dir (ortalama durumda algoritma dizinin yarısı ile aranan değeri karşılaştıracaktır). Aynı şekilde başarısız bir arama olma durumunda ise p=0 olacağı için K=n olacaktır (aranan değer tüm dizi ile karşılaştırılacaktır). Sonuç olarak ortalama durum için de elde edilen çalışma zamanı asimptotik olarak Θ(n) şeklinde ifade edilir ki bu da en kötü çalışma zamanına eşittir. Bahar 2016 Doç. Dr. Suat Özdemir 13
İkili Arama (Binary Search) Algoritması Arama işlemi sırasında arama yapılacak olan dizinin sıralanmış olması arama işlemini oldukça kolaylaştırmaktadır. Gerçek hayat uygulamalarında arama yapılacak olan diziler bir kere oluşturulup üzerlerinde çok defa arama yapıldığı için (örneğin bir telefon rehberi uygulamasındaki isimler dizisi) sıralanmış dizilerin bu özelliğinden faydalanılabilir. Bahar 2016 Doç. Dr. Suat Özdemir 14
İkili Arama (Binary Search) Algoritması Eğer dizi sıralanmışsa küçük bir değeri aramak için dizinin başından başlayarak tüm elemanlara bakmak yersiz olacaktır. Örneğin, sözlükte arama yaparken, m harfi ile başlayan bir kelime için sözlüğün bütün sayfalarını baştan sona doğru aramak zaman kaybı olacaktır. Sözlük alfabetik sıralı olduğunu için, sözlüğü ortaya yakın bir yerden açmak ve aranan sözcüğün ilk harfleri ile açılan sayfadaki sözcüklerin ilk harflerini karşılaştırarak ileri veya geri gitmek çok daha çabuk sonuca ulaşmamızı sağlayacaktır. Bahar 2016 Doç. Dr. Suat Özdemir 15
İkili Arama (Binary Search) Algoritması Bu gibi sıralanmış diziler için ikili arama (binary search) algoritması O(lgn) çalışma zamanı ile doğrusal aramadan çok daha iyi performans göstermektedir. Yukarıda açıklandığı gibi ikili arama algoritması diziyi parçalara bölerek arama bölgesini daraltmaktadır. Algoritmanın çalışma mantığı kısaca şöyle özetlenebilir: Arama yapılacak dizi önce ortadan ikiye bölünür. Bahar 2016 Doç. Dr. Suat Özdemir 16
İkili Arama (Binary Search) Algoritması Ortadaki eleman pivot olarak seçilir (eğer dizi çift sayıda elemandan oluşuyorsa ise ortadaki iki elemandan herhangi biri pivot olabilir). Aranan eleman pivot ile karşılaştırılır. Eğer aranan eleman bu pivot eleman ise işlem bitmiştir. Aranan elemanın pivottan büyük veya küçük olmasına göre dizinin alt veya üst bölümü ile ortadan bölüp arama işlemi yeniden yapılır ve böylece aranan eleman bulunana kadar devam edilir. Bahar 2016 Doç. Dr. Suat Özdemir 17
İkili Arama (Binary Search) Algoritması Bahar 2016 Doç. Dr. Suat Özdemir 18
İkili Arama (Binary Search) Algoritması Örnek: Aşağıda verilen dizide 33 Bahar 2016 Doç. Dr. Suat Özdemir 19
İKİLİ ARAMA 6 0 13 14 25 33 43 51 53 64 72 84 93 95 96 97 1 2 3 4 5 6 7 8 9 10 11 12 13 14 sol sag Bahar 2016 Doç. Dr. Suat Özdemir 20
İKİLİ ARAMA 6 0 13 14 25 33 43 51 53 64 72 84 93 95 96 97 1 2 3 4 5 6 7 8 9 10 11 12 13 14 sol orta sag Bahar 2016 Doç. Dr. Suat Özdemir 21
İKİLİ ARAMA 6 0 13 14 25 33 43 51 53 64 72 84 93 95 96 97 1 2 3 4 5 6 7 8 9 10 11 12 13 14 sol sag Bahar 2016 Doç. Dr. Suat Özdemir 22
İKİLİ ARAMA 6 0 13 14 25 33 43 51 53 64 72 84 93 95 96 97 1 2 3 4 5 6 7 8 9 10 11 12 13 14 sol orta sag Bahar 2016 Doç. Dr. Suat Özdemir 23
İKİLİ ARAMA 6 0 13 14 25 33 43 51 53 64 72 84 93 95 96 97 1 2 3 4 5 6 7 8 9 10 11 12 13 14 sol sag Bahar 2016 Doç. Dr. Suat Özdemir 24
İKİLİ ARAMA 6 0 13 14 25 33 43 51 53 64 72 84 93 95 96 97 1 2 3 4 5 6 7 8 9 10 11 12 13 14 sol orta sag Bahar 2016 Doç. Dr. Suat Özdemir 25
İKİLİ ARAMA 6 0 13 14 25 33 43 51 53 64 72 84 93 95 96 97 1 2 3 4 5 6 7 8 9 10 11 12 13 14 sol sag Bahar 2016 Doç. Dr. Suat Özdemir 26
İKİLİ ARAMA 6 0 13 14 25 33 43 51 53 64 72 84 93 95 96 97 1 2 3 4 5 6 7 8 9 10 11 12 13 14 sol sag orta Bahar 2016 Doç. Dr. Suat Özdemir 27
İKİLİ ARAMA 6 0 13 14 25 33 43 51 53 64 72 84 93 95 96 97 1 2 3 4 5 6 7 8 9 10 11 12 13 14 lo hi mid Bahar 2016 Doç. Dr. Suat Özdemir 28
İkili Arama Algoritması Çalışma Zamanı Analizi İkili aramada da algoritmanın çalışma zamanı performansı aranan değerin girdi dizisindeki pozisyonuna (veya varlığına) göre farklılık gösterebilir. Bu nedenle İkili Arama algoritmasının analizi için en iyi ve en kötü çalışma zamanlarına bakmak gerekir. En iyi çalışma zamanı aranan değerin dizinin tam ortasında olması durumudur ki bu durumda sadece 1 karşılaştırma yaparak algoritma sonlandırılır. Asimptotik olarak çalışma zamanı Ω(1) şeklinde ifade edilir. En kötü çalışma zamanı aranan değerin dizi içerinde bulunamaması durumunda ortaya çıkar. Bu durumda yapılan her karşılaştırma işleminden sonra arama yapılacak dizi boyutu yarıya düşeceğinden, en kötü durum için yapılacak karşılaştırma sayısı Bahar 2016 Doç. Dr. Suat Özdemir 29
İkili Arama Algoritması Çalışma Zamanı Analizi şeklinde tekrarlı olarak ifade edilebilir. T(1) = 1 olduğuna dikkat ediniz. n=2 k olması durumunda n=1 olana kadar toplam k bölünme olur, bu durumda eşitlik T(n) = k + 1 = lgn + 1 olur. Bu ifade 2 nin üssü olmayan herhangi bir n değeri için aşağıdaki gibi yazılabilir: T(n) = floor(lgn) + 1 Bahar 2016 Doç. Dr. Suat Özdemir 30
İkili Arama Algoritması Çalışma Zamanı Analizi Sonuç olarak en kötü durumda algoritmanın çalışma zamanı Θ(lgn) olarak özetlenebilir. İkili arama algoritmasının ortalama durum çalışma zamanı ise en kötü duruma eşittir ve asimptotik olarak Θ(lgn) ifadesi ile gösterilir. Bahar 2016 Doç. Dr. Suat Özdemir 31