Anotasyon

Temel java Dersleri – Dizilerde Arama (Array Search)

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

Taha Kırca

iOS & Android & Apple Watch Developer, Mobilhanem.com yazarı, Karadeniz Uşağu, Ordu Sevdalısı

8 Yorum

  • package Package1;
    
    public class Deneme33 {
    
    
        public static int binary_search(int dizi[], int a) {
    
    
            boolean bulundu = false;
    
            int low = 0;
            int high =dizi.length-1;
            int mid =0;
            boolean buldu = false;
            int mid2 = -1;
    
            while(mid!=mid2) {
                mid2=mid;
                mid = (low + high) / 2;
    
                if (dizi[mid] == a) {
                    System.out.println("Aradığınız sayı " + a + " bulundu indeks değeri " + mid);
                    buldu = true;
                    break;
                } else if (dizi[mid] > a) high = mid;
    
                else low = mid;
            }
    
    
            if(buldu==false) System.out.println("Aradığınız sayı dizi içerisinde bulunamadı.");
            return a;
        }
    
    
    
        public static void main(String[] args)
            {
    
                int[] dizi={3,45,56,89,145,345,564,789,8887,14567,34556};
    
    
    
    
    
            System.out.println(binary_search(dizi,564));
    
    
    
            }
    
    
    
    
    
    }
  • Kolay Gelsin

    Linear Search uygulamınızı biraz değiştirerek yazdım büyük boyutlu dizilerde aranan sayıyı buluyor ancak dizide aynı sayıdan birden fazla olduğunda bulunan ilk sayının indexin yazdırabilyorum.diğerlerininkini de bulmak istiyorum.Nasıl yapabilirim.
    Örneğin: Dizide 8 sayısını aradığımda 13.,128.,300.,1000. indexte aranan sayılar bulunmuştur şeklinde yapabilir miyim?

    package P1;
    import java.util.Random;
    import java.util.Scanner;

    public class Dizilinearsearch {

    public static void main(String args[]){

    Scanner a= new Scanner(System.in);
    Scanner b=new Scanner((System.in));
    System.out.println(“Dizi Boyutu:”);
    int x=a.nextInt();
    System.out.println(“Aranan Sayı:”);
    int y=b.nextInt();

    Random rndm= new Random();

    int[] liste = new int[x]; //{1, 4, 99, 2, 5, -3, 6, 2,-49,52};//Dizi’mizi oluşturuyoruz
    int c=0;
    while (c<x){

    liste[c]=rndm.nextInt(100);
    c++;
    }

    for (int i=0; i<x;i++) {
    System.out.println("Sıra:"+i+" "+liste[i]); //0. elemanın değerini yazdırıyoruz. Yani ilk eleman

    }

    int sayiIndex = linearSearch(liste,y); //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
    }
    }

    • direkt degeri return etmek yerine fonksiyon icinde bir dizi olusturup buldugun indexleri o arraye yazabilir daha sonra return olarak o diziyi cevirebilirsin

  • bu eşsiz çalışma için çok teşekkürler. çalışmalarınızın devamını dilerim. umarım daha çok yazı paylaşır ve bizi aydınlatmaya devam edersiniz.

  • linearSearch hata veriyor üstelik import java.util.*; ekliyken galiba metodu tanımıyor ne yapmam lazım

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?