Merhaba Arkadaşlar,
Mobilhanem.com sitemiz üzerinden anlattığımız/yayınladığımız Temel Java Dersleri yazı serimize Dizilerde Arama (Array Search) ile devam edeceğiz. Diziler dersimizin 3.sü olan bu dersimizde dizi içinde arama işlemini anlatacağız.
Dizilerde genel olarak 2 şekilde arama yapabiliriz. 1.si Linear Search, ikincisi ise Binary Search‘tür. Öncelikle şunu bildirelim ki Binary Search yapabilmemiz için dizimiz sıralı olmalıdır. Ya büyükten küçüğe ya da küçükten büyüğe sıralanmış olmalıdır. Gelelim nasıl yapacağımıza. Ben direk kod üzerinden anlatmaya çalışacağım.
1- Linear Search
Linear Search , sıralı olmayan dizilerde ve küçük olan sıralı dizilerde arama yaparken kullanılır. Sıralı olup büyük olan dizilerde ise Binary Search kullanmak daha etkilidir.
Gelelim Linear Search kullanımına. Direk örnek üzerinden anlatacağım.
public class LinearSearch { public static void main(String args[]){ int[] liste = {1, 4, 99, 2, 5, -3, 6, 2,-49,52};//Dizi'mizi oluşturuyoruz int sayiIndex = linearSearch(liste,52); //linearSearch methoduna dizimizi ve aradığımız sayıyı gönderiyoruz if(sayiIndex != -1){ //method -1 dönmediyse sayı bulunmuştur System.out.println("Aranan sayının index'i :"+sayiIndex); }else{ //-1 döndüğünde -1 dönecek ve else düşecek System.out.println("Aranan sayı bulunamadı"); } } private static int linearSearch(int[] liste, int arananSayi) { //linearSearch metotumuz for (int i = 0; i <liste.length; i++) { //döngümüz dizimizin uzunluğu kadar dönüyor if(liste[i] == arananSayi){ //sırası ile tüm elemanlara bakıyourz return i; //eğer aradığımız elemanı bulduysak index'ini geri gönderiyoruz } } return -1; //Herhangi bir değer bulunamadıysa -1 dönderiyoruz } }
Yukarıda da gördüğünüz gibi Linear yani doğrusal arama yaptık. Sırası ile tüm elemanlara baktık.
2- Binary Search
Yukarıda da belirttiğim gibi sıralı olan büyük dizilerde Binary Search yapmak daha etkili bir yöntemdir. Binary Search için dizimiz sıralı olmak zorundadır.
Binary Search çalışma mantığını kısaca anlatmaya çalışayım. Öncelikle dizinin ortanca elementinin değeri alınır. Dizimiz sıralı olduğu için ortanca değer , aranan değerden büyük mü , küçük mü ve ya eşit mi diye bakılır. Eğer ortanca değer aranan değerden büyükse dizinin ortanca değerden sonraki değerlerine artık bakılmaz. Çünkü değerimiz başlangıç değeri ile ortanca değer arasındadır. Tam tersi olarak ortanca değer aranan değerden küçük ise dizinin ortanca değerinden önceki değerlerine bakılmaz. Bu işlem ortanca değer aranan değere eşit olana kadar devam eder.
Kod üzerinden anlatım yapacağım.
public class BinarySearch { public static void main(String args[]){ int[] liste = {2, 4, 7, 10, 11, 45, 50, 52, 59, 60, 66, 69, 70, 79}; //Arrayimizi Sıralı biçimde oluşturduk int sayiIndex = binarySearch(liste,52); //binarySearch methoduna dizimizi ve aradığımız sayıyı gönderiyoruz if(sayiIndex != -1){ //method -1 dönmediyse sayı bulunmuştur System.out.println("Aranan sayının index'i :"+sayiIndex); }else{ //-1 döndüğünde -1 dönecek ve else düşecek System.out.println("Aranan sayı bulunamadı"); } } private static int binarySearch(int[] list, int key) { int baslangic = 0; //dizinin başlangıç index'i int son = list.length-1; //dizinin bitiş index'i int orta; //dizinin ortanca index'i while (baslangic<=son){ //baslangic sondan büyük olana kadar devam edecek , zaten başlangıç değeri sondan büyğk olursa aradığımız eleman dizide yok demektir orta = (int)(baslangic+son)/2; //her seferinde ortanca değer bulunucak if(list[orta]>key) { //ortanca değer aranan değerden büyükse array ikiye bölünecek son = orta - 1; //son değer, ortanca değerden 1 önceki değer olacak } else if(list[orta]==key) { //aranan bulundu return orta;//indexi dön } else {//ortanca değer aranan değerden küçükse baslangic = orta + 1; //baslangıç değeri, ortanca değerden 1 sonraki değer olacak } } return -1;//sonuç bulunamazsa -1 dönecek } }
Binary search ile ilgili ufak bir animasyon paylaşıyorum.
Ayrıca anlamanıza yardımcı olacabileceğini düşündüğüm internetten bulduğum iki imajıda paylaşıyorum.
6 ‘yı bulmak için
19’u bulmak için
Yukarıda bizim yazmış olduğumuz binarySearch methodunu kendimiz yazmadan da Java’da yazılmış olanı kullanabiliriz. Bunun için java.util.Arrays kütüphanesini projemize import ediyoruz. Örnek kullanım kodlarını paylaşıyorum.
import java.util.Arrays;//Arrays class'ını kullanabilmek için import ediyoruz public class BinarySearch { public static void main(String args[]){ int[] liste = {2, 4, 7, 10, 11, 45, 50, 52, 59, 60, 66, 69, 70, 79}; //Arrayimizi Sıralı biçimde oluşturduk int sayiIndex = Arrays.binarySearch(liste,52); //Arrays.binarySearch methoduna dizimizi ve aradığımız sayıyı gönderiyoruz if(sayiIndex >= 0){ //method 0 dan küçük dönmüyorsa aradığımız sayıyı bulmuşuz demektir System.out.println("Aranan sayının index'i :"+sayiIndex); }else{ //sayı 0 dan küçük döndüğünde aradığımız sayı dizi içinde değildir. System.out.println("Aranan sayı bulunamadı."); } } }
Gördüğünüz gibi arama işlemini biz yapmadan , ğArrays Classındaki binarySearch methodunu kullanarak aradığımız değeri bulabiliriz.
Diziler dersinin başında derslerin en az 4 5 ders süreceğini söylemiştim. Bir sonraki dersimde Dizilerde sıralama (Array Sort) işlemini anlatacağım. Sonrasında ise 2 ders dizilerde örnekler vererek hem diziler bilgilerimizi pekiştireceğiz hemde algoritma yeteneğimizi geliştirmeye devam edeceğiz.
Konuyla ilgili yorumlarınızı konu altından yapabilirsiniz, ayrıca sorularınızı yine konu altından ve Mobilhanem Soru&Cevap bölümünden sorabilirsiniz.
Tüm Temel Java Dersleri için tıklayınız..
30