VERİ YAPILARI VE PROGRAMLAMA (BIP116) Yazar: Doç.Dr.İ.Hakkı.Cedimoğlu
SAKARYA ÜNİVERSİTESİ Adapazarı Meslek Yüksekokulu Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak hazırlanan bu ders içeriğinin bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri mekanik, elektronik, fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz. Copyright 2004 by Sakarya University All rights reserved No part of this course contenet may be reproduced or stored in a retrieval system, or transmitted in any form or by any means mechanical, electronic, photocopy, magnetic, tape or otherwise, without permission in writing from the University. Sürüm 1 Sakarya... 2004 S 1
TEMEL ARAMA YÖNTEMLERİ Bu Haftanın Hedefi: Bilgisayar dünyasında çok sık kullanılan bir başka temel işlemi, belirli bir veri parçasının daha önceden oluşturulmuş geniş bir veri kümesi içerisinde aranarak bulunması oluşturmaktadır. Sıralama işlemi için olduğu gibi arama işlemi için de yıllardan beri kullanılan bazı arama veri yapıları ve bu yapılar üzerinde çalışan arama algoritmaları bulunmaktadır. Genellikle Sıralı Arama ve İkili Arama Algoritmaları tercih edilir. Bu haftaki dersimizde sıralı arama ve ikili arama algoritmaları ile ilgili bilgiler verilecektir. Bu Haftanın Materyalleri Bu haftaki dersimizde kullanacağımız bir materyal bulunmamaktadır. Kullanılan semboller Animasyon Soru Veritabanı Bağlantılı Soru Simülasyon Püf Noktası 1
Giriş Bilgi kümesi içerisinde belirli bir anahtar sözcüğe dayanarak ilgili diğer bilgilere erişme işlemine Arama denir. Belirli bir veri parçasının daha önceden oluşturulmuş geniş bir veri kümesi içerisinde aranarak bulunması bilgisayar ortamında çok sık kullanılmaktadır. Sıralama işlemi için olduğu gibi arama işlemi için de yıllardan beri kullanılan arama algoritmaları bulunmaktadır. Arama işlemlerinin yapılış biçimi, bilgiye ait verilerin düzenlenmesi ve bellekte tutulmasına göre farklılık gösterir. En basit arama şekli, bilgiye ait verilere baştan sona kadar tek tek bakılarak aranmasıdır; sıralı arama (sequential search) olarak adlandırılan bu yöntemde, arama programının yazılması kolay ancak çalışma hızı düşüktür. Daha hızlı yöntemlerden çoğunlukla, ikili arama (binary search) olarak adlandırılan algoritma tercih edilir. Arama algoritmalarından herhangi birini seçmek için genelde iki tercih kullanılır. Bunlar; bellek yada okunurluk olabilmektedir. Hangisinin en uygun olduğunu, uygulamada seçilen veri modeli ve uygulamadaki verinin boyutu belirler. Eğer veri kümesi içerisindeki eleman sayısı 50, 100 gibi onlar, yüzler mertebesinde ise, arama işleminde seçilecek algoritmanın ne olduğu o kadar önemli değildir; genellikle kodlama açısından en kolayı seçilir. Ancak, eleman sayısı onbinler, yüzbinler veya milyonlar mertebesinde ise, seçilecek arama algoritması programın performansı açısından oldukça önem kazanır. Seçilen arama algoritması veri modeline de çok bağlıdır. Bağlantılı liste üzerinde yalnızca doğrusal arama, ikili ağaç üzerinde ikili arama, bilgilerin sıralı tutulduğu dizi üzerinde ise hem doğrusal hem de ikili arama algoritmaları kullanılabilir. Bu derste, bir dizi içerisinde istenen elemanı aramak için kullanılabilecek aşağıdaki algoritmalar anlatılacaktır: 1. Sıralı arama (Sequential Search) 2. İkili arama (Binary Search) Sıralı Arama (Sequential Search) Arama yöntemleri içinde en basit yöntem olan sıralı arama yöntemi, bir dizi veya bağlantılı liste içinde yer alan elemanların içinde belirli bir verinin, elemanların sırayla kontrol edilerek aranması olarak tanımlanabilir. Herhangi bir eleman bulunacağı zaman veri yapısı ilk elemandan son elemana kadar tek tek kontrol edilecektir. Eğer arama işlemi birinci anahtar sözcüğe dayanarak yapılıyorsa aranan bulununca işlem sonlandırılır, ikinciye göre yapılıyorsa birden fazla sonuç olabileceğinden 2
son kayıta kadar gidilir. Eleman ekleme işleminde ise elemanlar dizinin veya bağlantılı listenin sonuna yerleştirilebilirler. Sıralı aramanın zaman karmaşıklığı O(N)'dir; N kayıt sayısı olmak üzere en kötü durumda N çevrim yapılması, ortalama olarak N/2 çevrim yapılması gerekir. Bu nedenle kayıt sayısı yüzler seviyesinden yüksek olan ve sık sık arama yapılan programlarda seçilmemelidir. Fakat, arama işleminin seyrek yapıldığı, kayıt sayısının az olduğu uygulamalarda sıralı arama algoritması kullanılabilir. Sıralı Aramada Bulma Hızını Arttırmak Sıralı aramanın kayıt arayıp bulma hızı arttırılabilir. Bunun için kullanılan yöntemlerden öne taşı yöntemi; en son aranıp da bulunan kayıtları bilgi kümesinin başına taşımak mantığına dayanır. Böylece yakın zamanda tekrar aranması olası kayıtlar başa getirilmiş olur ve sonraki aramalarda bu kayıda hızlı bir şekilde erişilir. Bu yaklaşımla ortalama arama zamanı azaltılmıştır. Fakat, aranan kayıdın başa getirilmesi ek işlem maliyeti getirir. Eğer bağlantılı liste kullanılıyorsa bu ek işlem maliyeti fazla olmaz; kayıt yerinden koparılır ve başa eklenir. Ancak, kayıt dizi veya disk üzerindeyse bu ek işlem ciddi bir işlem maliyeti doğmasına neden olur. İkili Arama (Binary Search) Aramada kullanılan kayıt sayısının çok fazla olduğu durumlarda sıralı arama işlem yükünü oldukça fazlalaştıracaktır. Bu yüzden ikili arama işlem yükünü azaltan bir yöntem olarak tercih edilir. İkili aramanın yapılabilmesi için veri yapımızda yer alan elemanların daha önceden sıralanmış olması gerekmektedir. Elemanlar sıralı olduğu durumda ikili arama metodu önce aranan elemanın anahtarını veri yapısının tam ortasında yer alan elemanla karşılaştırmakta ve bu elemandan büyük veya küçük olma durumuna göre aramaya aynı yöntemle veri yapısının alt veya üst bölümünde devam etmektedir. Bu yöntemle her bir adımla aramanın gerçekleştirildiği veri kümesinin büyüklüğü yarıya düşürülmüş olur. İkili aramada zaman karmaşıklığı O(log 2 N)'dir. Bu yüzden kayıt sayısı çok fazla olan uygulamalar için uygundur. Örneğin 1 milyon tane kayıtın bulunduğu bir veri kümesinde, arama işlemi, log 2 10000000 ~ 20'den yaklaşık 20 çevrimde bulunabilir. Aynı işlemi sıralı arama ile yapılmış olsaydı ortalama 500 bin çevrim, en kötü durumda ise 1 milyon çevrim gerekirdi. İkili arama yöntemi, sıralı olsa bile, bağlantılı listeler üzerinde uygulanamaz. Çünkü bağlantılı listelerde herhangi bir düğüme, ilk düğüm hariç erişilemez. 3