Bu Eğitim, Java'da İkili Arama ve Özyinelemeli İkili Aramayı Algoritması, Uygulaması ve Java İkili Arama Kod Örnekleri ile birlikte açıklayacaktır:
Java'da ikili arama, bir koleksiyonda hedeflenen bir değeri veya anahtarı aramak için kullanılan bir tekniktir. Bir anahtarı aramak için "böl ve fethet" tekniğini kullanan bir tekniktir.
Bir anahtarı aramak için İkili aramanın uygulanacağı koleksiyonun artan sırada sıralanması gerekir.
Genellikle, programlama dillerinin çoğu, koleksiyonda veri aramak için kullanılan Doğrusal arama, İkili arama ve Hashing tekniklerini destekler. Hashing'i sonraki eğitimlerimizde öğreneceğiz.
Java'da İkili Arama
Doğrusal arama temel bir tekniktir. Bu teknikte, dizi sırayla dolaştırılır ve anahtar bulunana veya dizinin sonuna ulaşılana kadar her bir eleman anahtarla karşılaştırılır.
Doğrusal arama pratik uygulamalarda nadiren kullanılır. İkili arama, doğrusal aramadan çok daha hızlı olduğu için en sık kullanılan tekniktir.
Java, ikili arama yapmak için üç yol sunar:
- Yinelemeli yaklaşımın kullanılması
- Özyinelemeli bir yaklaşım kullanma
- Arrays.binarySearch () yöntemini kullanma.
Bu eğitimde, tüm bu 3 yöntemi uygulayacak ve tartışacağız.
Java'da İkili Arama Algoritması
İkili arama yönteminde, koleksiyon tekrar tekrar ikiye bölünür ve anahtar elemanın koleksiyonun orta elemanından küçük veya büyük olmasına bağlı olarak koleksiyonun sol veya sağ yarısında aranır.
Basit bir İkili Arama Algoritması aşağıdaki gibidir:
- Koleksiyonun orta elemanını hesaplayın.
- Anahtar öğeleri orta öğe ile karşılaştırın.
- Eğer anahtar = orta eleman ise, bulunan anahtar için orta indeks konumunu döndürürüz.
- Else Eğer anahtar> orta eleman ise, anahtar koleksiyonun sağ yarısında yer alır. Bu nedenle koleksiyonun alt (sağ) yarısında 1'den 3'e kadar olan adımları tekrarlayın.
- Else key <mid element, o zaman anahtar koleksiyonun üst yarısındadır. Bu nedenle üst yarıda ikili aramayı tekrarlamanız gerekir.
Yukarıdaki adımlardan da görebileceğiniz gibi, İkili aramada, ilk karşılaştırmadan hemen sonra koleksiyondaki öğelerin yarısı yok sayılır.
Aynı adım dizisinin yinelemeli ve özyinelemeli ikili arama için de geçerli olduğunu unutmayın.
İkili arama algoritmasını bir örnekle açıklayalım.
Örneğin, aşağıdaki 10 elemanlı sıralanmış diziyi ele alalım.
Dizinin orta konumunu hesaplayalım.
Orta = 0+9/2 = 4
#1) Anahtar = 21
İlk olarak, anahtar değerini [mid] öğesiyle karşılaştıracağız ve mid = 21'deki öğe değerini bulacağız.
Böylece anahtar = [mid] olarak bulunur. Dolayısıyla anahtar dizide 4. konumda bulunur.
#2) Anahtar = 25
Önce anahtar değerini mid ile karşılaştırıyoruz. (21 <25) gibi, doğrudan dizinin üst yarısındaki anahtarı arayacağız.
Şimdi yine dizinin üst yarısı için ortayı bulacağız.
Orta = 4+9/2 = 6
mid] konumundaki değer = 25
Şimdi anahtar elemanı orta elemanla karşılaştırıyoruz. Yani (25 == 25), dolayısıyla anahtarı [orta] = 6 konumunda bulduk.
Böylece diziyi tekrar tekrar böleriz ve anahtar elemanı orta ile karşılaştırarak anahtarı hangi yarıda arayacağımıza karar veririz. İkili arama zaman ve doğruluk açısından daha verimlidir ve çok daha hızlıdır.
İkili Arama Uygulaması Java
Yukarıdaki algoritmayı kullanarak, yinelemeli yaklaşımı kullanarak Java'da bir İkili arama programı uygulayalım. Bu programda örnek bir dizi alıyoruz ve bu dizi üzerinde ikili arama gerçekleştiriyoruz.
import java.util.*; class Main{ public static void main(String args[]){ int numArray[] = {5,10,15,20,25,30,35}; System.out.println("Giriş dizisi: " + Arrays.toString(numArray)); //aranacak anahtar int key = 20; System.out.println("\nAranacak anahtar=" + key); //ilk dizini ilk dizine ayarla int first = 0; //dizideki son öğeyi son öğeye ayarla int last=numArray.length-1; //dizinin ortasını hesapladizi int mid = (ilk + son)/2; //ilk ve son çakışmazken while( ilk <= son ){ //ortadaki <anahtar ise, aranacak anahtar dizinin ilk yarısındadır if ( numArray[mid] son ){ System.out.println("Eleman bulunamadı!"); } } }
Çıktı:
Giriş dizisi: [5, 10, 15, 20, 25, 30, 35]
Aranacak anahtar=20
Öğe dizin: 3'te bulundu
Yukarıdaki program, İkili aramanın yinelemeli bir yaklaşımını göstermektedir. Başlangıçta bir dizi bildirilir, ardından aranacak bir anahtar tanımlanır.
Dizinin ortası hesaplandıktan sonra, anahtar orta elemanla karşılaştırılır. Daha sonra anahtarın anahtardan küçük veya büyük olmasına bağlı olarak, anahtar sırasıyla dizinin alt veya üst yarısında aranır.
Java'da Özyinelemeli İkili Arama
Özyineleme tekniğini kullanarak ikili arama da gerçekleştirebilirsiniz. Burada, ikili arama yöntemi anahtar bulunana veya tüm liste tükenene kadar özyinelemeli olarak çağrılır.
Özyinelemeli ikili aramayı uygulayan program aşağıda verilmiştir:
import java.util.*; class Main{ //ikili arama için özyinelemeli yöntem public static int binary_Search(int intArray[], int low, int high, int key){ //dizi sıralıysa dizi üzerinde ikili arama gerçekleştir if (high>=low){ //ortayı hesapla int mid = low + (high - low)/2; //if key =intArray[mid] return mid if (intArray[mid] == key){ return mid; } //if intArray[mid]> key then key is in leftdizinin yarısı if (intArray[mid]> key){ return binary_Search(intArray, low, mid-1, key);//recursively search for key }else //key is in right half of array { return binary_Search(intArray, mid+1, high, key);//recursively search for key } } return -1; } public static void main(String args[]){ //define array and key int intArray[] = {1,11,21,31,41,51,61,71,81,91}; System.out.println("InputListe: " + Arrays.toString(intArray)); int key = 31; System.out.println("\nAranacak anahtar:" + key); int high=intArray.length-1; //call binary search method int result = binary_Search(intArray,0,high,key); //print the result if (result == -1) System.out.println("\nKey not found in given list!"); else System.out.println("\nKey is found at location: "+result + " in the list"); } }
Çıktı:
Girdi Listesi: [1, 11, 21, 31, 41, 51, 61, 71, 81, 91
Aranacak anahtar:
Anahtar listede konum: 3'te bulunur
Arrays.binarySearch () yöntemini kullanma.
Java'daki Arrays sınıfı, verilen Array üzerinde ikili arama gerçekleştiren bir 'binarySearch ()' yöntemi sağlar. Bu yöntem, diziyi ve aranacak anahtarı argüman olarak alır ve anahtarın dizideki konumunu döndürür. Anahtar bulunamazsa, yöntem -1 döndürür.
Aşağıdaki örnek Arrays.binarySearch () yöntemini uygular.
import java.util.Arrays; class Main{ public static void main(String args[]){ //bir dizi tanımlayın intArray[] = {10,20,30,40,50,60,70,80,90}; System.out.println("Girdi Dizisi : " + Arrays.toString(intArray)); //aranacak anahtarı tanımlayın int key = 50; System.out.println("\nAranacak anahtar:" + key); //aranacak anahtar ile verilen dizi üzerinde binarySearch yöntemini çağırın int result =Arrays.binarySearch(intArray,key); //print the return result if (result <0) System.out.println("\nKey is not found in the array!"); else System.out.println("\nKey is found at index: "+result + " in the array."); } }
Çıktı:
Giriş Dizisi: [10, 20, 30, 40, 50, 60, 70, 80, 90]
Aranacak anahtar:50
Anahtar dizide dizin: 4'te bulunur.
Sıkça Sorulan Sorular
S #1) Bir ikili aramayı nasıl yazarsınız?
Cevap ver: İkili arama genellikle diziyi ikiye bölerek gerçekleştirilir. Aranacak anahtar orta elemandan büyükse, anahtar bulunana kadar alt dizi daha da bölünerek ve aranarak dizinin üst yarısı aranır.
Benzer şekilde, anahtar orta elemandan küçükse, anahtar dizinin alt yarısında aranır.
S #2) İkili arama nerede kullanılır?
Cevap ver: İkili arama, özellikle bellek alanının küçük ve sınırlı olduğu durumlarda yazılım uygulamalarında sıralanmış bir veriyi aramak için kullanılır.
S #3) İkili aramanın büyük O'su nedir?
Cevap ver: İkili aramanın zaman karmaşıklığı O (logn)'dir, burada n dizideki eleman sayısıdır. İkili aramanın uzay karmaşıklığı ise O (1)'dir.
S #4) İkili arama özyinelemeli midir?
Cevap ver: Evet. İkili arama böl ve yönet stratejisinin bir örneği olduğundan ve özyineleme kullanılarak uygulanabildiğinden, diziyi yarıya bölebilir ve ikili aramayı tekrar tekrar gerçekleştirmek için aynı yöntemi çağırabiliriz.
S #5) Neden ikili arama olarak adlandırılır?
Cevap ver: İkili arama algoritması, diziyi tekrar tekrar yarıya veya iki parçaya bölen bir böl ve fethet stratejisi kullanır. Bu nedenle ikili arama olarak adlandırılır.
Sonuç
İkili arama Java'da sıkça kullanılan bir arama tekniğidir. İkili aramanın gerçekleştirilebilmesi için verilerin artan sırada sıralanmış olması gerekir.
İkili arama, yinelemeli veya özyinelemeli bir yaklaşım kullanılarak uygulanabilir. Java'daki Arrays sınıfı, bir Array üzerinde ikili arama gerçekleştiren 'binarySearch' yöntemini de sağlar.
Sonraki eğitimlerimizde Java'da çeşitli Sıralama Tekniklerini keşfedeceğiz.