Binary Search. (Yarılama) Bölüm Dizide Bir Öğe Arama

Benzer belgeler
Merge Sort Bireşen Sıralama

Merge (Bireşim) Algoritmayı önce bir örnek üzerinde açıklayalım.

Quick Sort Algoritması (Hızlı Sıralama Algoritması)

Ders 4: Diziler (Arrays( Arrays) barisgokce.com

İST 264 VERİ YAPILARI Bitirme Sınavı A Grubu

I Java Veri Yapıları 1

ArrayList Uygulamaları

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

YZM 2116 Veri Yapıları

Insertion Sort. (Sokuşturma Sıralaması)

Algoritmalar. Arama Problemi ve Analizi. Bahar 2016 Doç. Dr. Suat Özdemir 1

Interface Comparator. Kılgılayan sınıf: Collator. Bildirimi: public interface Comparator

Programlama Dilleri 3

Alıştırma 1: Yineleme

Yığıtın en üstündeki öğeyi değer olarak alır; ama onu yığıttan almaz, yerinde bırakır.

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

Java String İşlemleri

JAVADA DİZİ İŞLEMLERİ

Bölüm 8. Ayrık Küme. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 16

Class LinkedList java.lang.object java.util.abstractcollection java.util.abstractlist java.util.abstractsequentiallist java.util.

2 ALGORİTMA VE AKIŞ DİYAGRAMLARI

// hataları işaret eden referans

ArrayList(int initialcapacity) Sığası (capacity) parametrenin belirlediği sayıda olan bir dizi oluşturur.

Standard Template Library

Yrd. Doç. Dr. Ümit ATİLA

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

Đlgili konular: Collection, Set, HashSet, Comparable, Comparator, TreeMap, Collections.synchronizedSortedSet(SortedSet), Serialized Form

Görsel Programlama DERS 04. Görsel Programlama - Ders04/ 1

Kılgılayan Sınıflar: AbstractMap, Attributes, HashMap, Hashtable, IdentityHashMap, RenderingHints, TreeMap, WeakHashMap

VERİ YAPILARI DATA STRUCTURE GİRİŞ

ALGORİTMA VE PROGRAMLAMA I

BİL1001 Bilgisayar Bilimlerine Giriş 1

KUYRUKLAR QUEUES. Doç. Dr. Aybars UĞUR

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

YMT219 VERİ YAPILARI ÖDEV-1

DOSYA ORGANİZASYONU. Sıralı erişimli dosya organizasyonu yöntemleri ÖZLEM AYDIN TRAKYA ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Arama Algoritmaları. Doğrusal Arama ve Binary Arama

Nesneler için torbalar (Collections) Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 12 1

Bölüm 6. Karma. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 31

Java Programlama Dilinde Veri Tipleri. Yrd. Doç. Dr. Aybars UĞUR

Bir c sınıfının doğal sıralaması ile tutarlı olması (be consistent with equals) demek, c sınıfı içindeki her e1 ve e2 nesnesi için

Arasınav Örnek Soruları Bahar 2018

D İ Z İ L E R A R R A Y S

BLM-112 PROGRAMLAMA DİLLERİ II. Ders-7 Sıralama Algoritmaları

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

YZM 2116 Veri Yapıları

Veri Yapıları ve Algoritmalar dönem

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

BİL-341 ALGORİTMALAR BÜYÜK O NOTASYONU AHMET ATAKAN atakanahmet@hotmail.com KIRGIZİSTAN-TÜRKİYE MANAS ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ

CharArrayReader. Kılgıladığı Arayüzler: Bildirimi: Değişkenleri (fields): java.io.reader Sınıfından Kalıtsal Gelen Değişken:

NESNEYE YÖNELİK PROGRAMLAMA

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

Class PriorityQueue. Class PriorityQueue<E> java.lang.object java.util.abstractcollection<e> java.util.abstractqueue<e> java.util.

Mantıksal İşlemler. 7.1 true, false, nil

Programın Akışının Denetimi. Bir arada yürütülmesi istenen deyimleri içeren bir yapıdır. Söz dizimi şöyledir:

BMÜ-101 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ LABORATUARI

EMT2226 Nesne Yönelimli Programlamaya Giriş

NESNEYE DAYALI PROGRAMLAMA 11. HAFTA UYGULAMA DERSİ

elemanlarının gezilmesine yönelik bir örnek sunulmuştur, inceleyiniz.

Class LinkedHashMap. Class LinkedHashMap java.lang.object java.util.abstractmap java.util.hashmap java.util.linkedhashmap. Kılgıladığı arayüzler:

Nesne Tabanlı Programlama

Javada Diziler. Javada diziler

2 PYTHON A GIRIŞ 13 PyCharm İle Python Projesi Oluşturma 15 Projenin Çalıştırılması 18 İlk Python Programımız 19 Açıklama Satırları 21

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

Şablon Türler (Generics)

Sınav Dağılım & IMKB Endeks

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Java. Mustafa OF. Kocaeli Üniversitesi Kocaeli Meslek Yüksekokulu (Mart 2007)

String (Dizgi) İşlemleri

ALGORİTMA VE PROGRAMLAMA I

Temel Bilgisayar Programlama Final Sınavı Çalışma Notları

BM102 BİLGİSAYAR PROGRAMLAMA II LABORATUVAR UYGULAMALARI. 3Hafta

Güz Yarıyılı Balıkesir Üniversitesi Bilgisayar Mühendisliği Bölümü

Güz Yarıyılı Balıkesir Üniversitesi Bilgisayar Mühendisliği Bölümü

YZM 2116 Veri Yapıları

Aynı tipten çok sayıda değişken topluluğudur. X Y Score1 Score2 (0) (1) (2)...

Dizi ( Array ) ve Dizgi ( String )

BIP116-H14-1 BTP104-H014-1

Dizi türündeki referanslar, dizi nesnelerine bağlanmaktadır. Dizi referansları tanımlamak bu dizinin hemen kullanılacağı anlamına gelmez...

1. Her marka için 3 aylık satış toplamı nedir? (Tablodaki satır toplamları)

Özyineleme (Recursion)

String ve Karakter Dizileri. Yrd. Doç. Dr. Fehim KÖYLÜ Erciyes Üniversitesi Bilgisayar Mühendisliği Bölümü

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

static void dizi_24() { Random rnd = new Random(); int [] tutulan=new int[10]; int dogru;

Döngüler. Tablo 15.1: Ruby de Başlıca Döngü Yapıları

BİL132 Bilgisayar Programlama II

VERİ YAPILARI VE PROGRAMLAMA

Görsel Programlama (Visual Programming)

ArrayList ve List yapıları. Bilgisayar Programlama 2 Erciyes Üniversitesi Bahriye Akay

Kıyametin Kopacağı Gün (Hanoi Bilmecesi)

Algoritmalar. Doğrusal Zamanda Sıralama. Bahar 2017 Doç. Dr. Suat Özdemir 1

Nesneye Dayalı Programlama

Kılgıladığı arayüzler: Serializable, Cloneable, Map<K,V>, NavigableMap<K,V>, SortedMap<K,V>

BAĞLAÇLI LİSTELER LINKED LISTS

while(), do-while(), for() M.İLKUÇAR 2010 MAKU-MYO

İNÖNÜ ÜNİVERSİTESİ MÜH. FAK. BİLGİSAYAR MÜH. BÖL. ALGORİTMA VE PROGRAMLAMA 2 DERSİ LAB. ÖDEVİ

Java Programlama. Diziler, Döngüler ve Karakter Katarları (String Sınıfı)

Bilgisayar Programcılığı. Ögr. Gör. Cansu AYVAZ GÜVEN

VERİ YAPILARI DERS NOTLARI BÖLÜM 1 GİRİŞ. Yard. Doç. Dr. Deniz KILINÇ

Transkript:

Bölüm 39 Binary Search (Yarılama) 39.1 Dizide Bir Öğe Arama İkil aramayı (yarılama yöntemi) sıralı veri kümelerinde sık sık kullanırız. Örneğin, sözlükte bir sözcüğü ararken, sözlüğün bütün sayfalarını baştan sona doğru aramayız. Alfabetik sıralı olduğunu bildiğimiz için, sözlüğü rasgele açarız. Aradığımız sözcüğün ilk harfleri ile açtığımız sayfadaki sözcüklerin ilk harflerini karşılaştırırız. Aradığımız sözcük o sayfada değilse, sayfaları ileriye ya da geriye doğru çevirerek, aradığımız sözcüğü içeren sayfayı buluruz. Bu algoritma O(logn) grubuna aittir. İkil arama algoritması, sözlükte arama yaparken izlenen yöntemi izleyen basit bir algoritmadır. İkil (binary) Arama Algoritması aranan veriyi, sıralı dizinin ortanca terimi ile karşılaştırır. Üç durumdan ancak birisi ortaya çıkabilir: 519

520 39. binary search Sıralı dizinin terimleri a[0] < a[1] < a[2] <... < a[n/2] <... < a[n] olsun. Basitliği sağlamak için, diziyi a[sol...sağ] simgesiyle gösterelim. Aranan değer x olsun. Ortanca terimin indisini ort= (sol+sağ)/2 ile gösterelim. İkil arama algoritması şöyle çalışır. x öğesi ile a[ort] ortanca terimini karşılaştırır. 1. x= a[ort] ise, aranan terim bulunmuş olur. 2. x < a[ort] ise, algoritma a[sol...ort-1] altdizisinde aramaya başlar. 3. x > a[ort] ise, algoritma a[ort+1...sağ] altdizisinde aramaya başlar. 4. Her adımda, yukarıdaki üç işlemden yalnızca birisi yapılarak, altdizi tek öğeli olana kadar devam edilebilir. 5. Bu adımlardan her hangi birisinde x= ortanca olursa, aranan bulunmuş olur; değilse aranan öğenin a[] dizisi içinde olmadığı sonucuna varılır. Şimdi bu algoritmanın sankikodlarını (pseudo code) yazabiliriz. a[sol...sağ] sıralı dizisi içinde bir x öğesinin olup olmadığı aranacaktır. 1. sol <= sağ için tekrarla: (a) ort= (sol+sağ)/2 //ortancanın indisi (b) x= a[ort] ise, aranan terimin indisi ort dur. 520

39.1. Dizide Bir Öğe Arama 521 (c) x < a[ort] ise, algoritmayı a[sol...ort-1] altdizisine uygula. (d) x > a[ort] ise, algoritmayı a[sol+1...sağ] altdizisine uygula. 2. Aranan değer dizide yok; -1 değeri ver. Bu yalancı kodların dediği işi yapan bir java metodu yazalım: 39.1.1 While döngüsü ile Binary Search Algoritması İkil arama yapan bir metodu, while döngüsü kullanarak yazabiliriz: public s t a t i c i n t BinarySearch ( Comparable [ ] a, i n t sol, i n t sağ, Comparable aranan ) { i n t t = sol, r = sağ ; 4 while ( sol <= sağ ){ i n t ort = ( sol+sağ ) /2 ; i n t comp = aranan. compareto(a [ ort ] ) ; i f (comp == 0) return ort ; // aranan bulundu, return index. e l s e i f (comp < 0) sağ = ort 1 ; 9 e l s e // comp > 0 sol = ort + 1 return 1; // aranan bulunamadı Tabii, burada Comparable yerine java da mukayese edilebilen veri tipleri alınabilir. Şimdi yukarıdaki metodu bir java uygulama programı içine koyalım. Örneğimizde Object[] yerine int[] alınmıştır. Program 39.1.1. 521

522 39. binary search public c l a s s Demo { 2 public s t a t i c f i n a l i n t BULUNAMADI = 1; / standard binary arama i ç i n her adımda i k i mukayese yapar BULUNAMADI i s e 1 yazar. 7 Bulunduysa, o terimin i n d i s i n i yazar / public s t a t i c i n t binarysearch ( Comparable [ ] a, Comparable x) { i n t sol = 0; i n t sağ = a. length 1; 12 i n t mid ; while ( sol <= sağ ) { mid = ( sol + sağ ) / 2; 17 i f (a [ mid ]. compareto(x) < 0) sol = mid + 1; e l s e i f (a [ mid ]. compareto(x) > 0) sağ = mid 1; e l s e 22 return mid ; 27 return BULUNAMADI; // BULUNAMADI = 1 // Test program public s t a t i c void main( String [ ] args ) { i n t UZUNLUK = 8; 32 Comparable [ ] a = new Integer [UZUNLUK] ; for ( i n t i = 0; i < UZUNLUK; i++) a [ i ] = new Integer ( i 2) ; for ( i n t i = 0; i < UZUNLUK 2; i++) 37 System. out. println ("Bulunan : " + i + " i n d i s i : " + binarysearch (a, new Integer ( i ) ) ) ; 522

39.1. Dizide Bir Öğe Arama 523 /* Bulunan : 0 indisi : 0 Bulunan : 1 indisi : -1 Bulunan : 2 indisi : 1 Bulunan : 3 indisi : -1 Bulunan : 4 indisi : 2 Bulunan : 5 indisi : -1 Bulunan : 6 indisi : 3 Bulunan : 7 indisi : -1 Bulunan : 8 indisi : 4 Bulunan : 9 indisi : -1 Bulunan : 10 indisi : 5 Bulunan : 11 indisi : -1 Bulunan : 12 indisi : 6 Bulunan : 13 indisi : -1 Bulunan : 14 indisi : 7 Bulunan : 15 indisi : -1 */ 39.1.2 Recursive metot ile Binary Search algoritması Yukarıda while döngüsü ile ikil arama yapan bir metot yazmıştık. Aynı işi recursive (özyineli, kendi kendini çağıran) bir metot ile de yapabiliriz: i n t rbinarysearch ( i n t [ ] arr, i n t alt, i n t üst, i n t aranan ) { i f ( alt <= üst ) { i n t ort = ( alt + üst ) / 2; // ortanca terimin i n d i s i. 4 i f ( aranan == arr [ ort ] ) return ort ; // aranan bulundu e l s e i f ( aranan < arr [ ort ] ) // dizinin sol yarısına uygula return rbinarysearch ( arr, alt, ort 1, aranan ) ; 523

524 39. binary search 9 e l s e // dizinin sağ yarısına uygula return rbinarysearch ( arr, ort + 1, üst, aranan ) ; return ( alt + 1) ; // aranan bulunamadı 14 Bunu bir java uygulama programı içine alalım: Program 39.1.2. 1 public c l a s s Demo { i n t [ ] a = { 1, 11, 22, 33, 44, 55, 66, 77, 88, 99 ; i n t x = 44; i n t binarysearch ( i n t [ ] arr, i n t alt, i n t üst, i n t aranan ) { 6 i f ( alt <= üst ) { i n t ort = ( alt + üst ) / 2; // ortanca terimin i n d i s i. i f ( aranan == arr [ ort ] ) return ort ; // aranan bulundu e l s e i f ( aranan < arr [ ort ] ) 11 // dizinin sol yarısına uygula return binarysearch ( arr, alt, ort 1, aranan ) ; e l s e // dizinin sağ yarısına uygula return binarysearch ( arr, ort + 1, üst, aranan ) ; 16 return ( alt + 1) ; // aranan bulunamadı public s t a t i c void main( String [ ] args ) { 21 Demo bs = new Demo() ; // bs. alt = 0; bs. üst = 9; i n t s = bs. binarysearch ( bs. a, 0, bs. a. length, bs. x) ; System. out. println ( s ) ; 26 /* 524

39.2. Örnekler 525 */ 4 4 39.2 Örnekler Program 39.2.1. public c l a s s Demo { String [ ] a = { "Yüce", "Ulusoy", "Aygün", "Volkan", " Çelik ", "Can", "Alp","Baydar", "Kazan", "Demir" ; String x = "Demir" ; i n t rbinarysearch ( String [ ] str, i n t alt, i n t üst, String aranan ) { i f ( alt <= üst ) { i n t ort = ( alt + üst ) / 2; // ortanca terimin i n d i s i. i f ( aranan. compareto( str [ ort ] ) == 0) 9 return ort ; // aranan bulundu e l s e i f ( aranan. compareto( str [ ort ] ) < 0) // dizinin sol yarısına uygula return rbinarysearch ( str, alt, ort 1, aranan ) ; e l s e 14 // dizinin sağ yarısına uygula return rbinarysearch ( str, ort + 1, üst, aranan ) ; return 1; // aranan bulunamadı 19 public s t a t i c void main( String [ ] args ) { Demo bs = new Demo() ; i n t s = bs. rbinarysearch ( bs. a, 0, bs. a. length, bs. x) ; System. out. println ( s ) ; 24 1 / / 1 525

526 39. binary search Program 39.2.2. 1 import java. u t i l. ArrayList ; public c l a s s Demo { public s t a t i c void main( String [ ] args ) { 6 ArrayList arraylist = new ArrayList () ; arraylist. add("1") ; arraylist. add("2") ; arraylist. add("3") ; 11 arraylist. add("4") ; arraylist. add("5") ; arraylist. add("1") ; arraylist. add("2") ; 16 boolean bulundu = arraylist. contains ("4") ; System. out. println ("4 ambarda mı? " + bulundu ) ; i n t index = arraylist. indexof ("4") ; i f ( index == 1) 21 System. out. println ("4 ambarda değil. ") ; e l s e System. out. println ("4 ün i n d i s i : " + index ) ; i n t lastindex = arraylist. lastindexof ("1") ; 26 i f ( lastindex == 1) System. out. println ("1 ambarda değil ") ; e l s e System. out. println ("1 in sonuncu i n d i s i : " + lastindex ) ; 31 / 4 ambarda mı? true 3 ün i n d i s i :3 4 1 in sonuncu i n d i s i :5 / Program 39.2.3, bağlı bir liste yaratıp, harfleri ambara koyuyor. Sonra shuffle() metodu ile onları karıyor. Karma içinden bir harfi 526

39.2. Örnekler 527 binarysearch() metodu ile arıyor. Program 39.2.3. import java. u t i l. Collections ; import java. u t i l. LinkedList ; import java. u t i l. List ; 5 public c l a s s Demo { public s t a t i c void main( String args [ ] ) { List<Character> linkedlist = new LinkedList<Character >() ; 10 for ( char n = A ; n <= Z ; n++) linkedlist. add(n) ; Collections. s h u f f l e ( linkedlist ) ; 15 for ( Character x : linkedlist ) System. out. print (x + " ") ; System. out. println () ; 20 Collections. sort ( linkedlist ) ; for ( Character x : linkedlist ) System. out. print (x + " ") ; System. out. println ("\nk harfini ara") ; 25 i n t i = Collections. binarysearch ( linkedlist, F ) ; i f ( i >= 0) { System. out. println ("K nın i n d i s i : " + i ) ; System. out. println ("Bulunan Nesne : " + linkedlist. get ( i ) ) ; 30 / L X B H W P I J F M S Y U Z O C K D A V T E R Q N G 3 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 527

528 39. binary search / K harfini ara K nın i n d i s i : 5 Bulunan Nesne : F Özet Terimleri büyüklük sırasına dizilmiş bir dizide bir verinin olup olmadığını aramak için yarılama yöntemi (binary search) kullanılır. Bu yöntem doğrusal arama yöntemine göre daha hızlıdır; performansı, n bileşeni olan bir dizi için O(logn) dir. Yarılama yönteminde, dizinin ortanca terimi ile aranan veri karşılaştırılır. Aranan veri dizinin ortanca teriminden küçükse alt yarı dizide, büyükse üst yarı dizide aramaya devam edilir. Aranan veri ortanca terime eşitse, aranan bulunmuştur. Algoritma, bulduğu o terimin indisini verir. Terim bulunamamışsa, alt ya da üst yarı dizide aynı yöntem özyineli (recursive) olarak uygulanır. Yarı dizinin uzunluğu tek terime indiği halde, aranan veriye raslanmamışsa, arananın dizide olmadığı sonucu çıkar; algoritma -1 verir. 528