Yazar | Cute and Stupid Little Grey
Sorumlu Editör | Hu Weiwei
----- sonraki gün -----
Bu ne anlama geliyor? İki kestaneden bahsedelim:
Sıralı bir dizi verildiğinde
2,5,7,9,12,14,20,26,30
Dava 1:
Durum 2:
Bu neden en verimli?
Çünkü, ister çok büyük ister çok küçük olsun, bir sayı seçtiğiniz her zaman,
Her ikisi de kalan seçenekleri yarı yarıya azaltabilir.
0 ile 1000 arasında bir tam sayı verildiğinde:
İlk kez 500'ü seçtik ve çok büyük olduğunu gördük.
Ardından, seçim aralığı bir sonraki sefer 1 ila 499 arasında olur:
İkinci kez 250'yi seçtiğimizde, hala çok büyük olduğunu gördük.
Ardından, seçim aralığı bir dahaki sefere 1 ila 249 olur:
Üçüncü kez 125'i seçtik ve çok küçük olduğunu gördük.
Ardından bir sonraki seçim aralığı 126 ila 249 olur:
Benzetme yaparak, en kötü durumu tahmin etmek için kaç tahmine ihtiyacınız var?
Cevap log1000 = 10 kere,
Yani, orijinal aralık aralığı 10 kez "yarıya indirilmiştir".
Şimdi analiz ettiğimiz şey sayıları tahmin etme oyunudur.
Senaryoyu ilk görüşme sorusuna dönüştürürsek:
1000 tamsayı eleman içeren sıralı bir dizide belirli bir tamsayı bulun,
Nasıl yapılır?
Aynısı - için de geçerli
Önce indeksi 499 olan elemanı yargılayabiliriz (çünkü dizi indeksi 0'dan başlayıp 999'da biter),
Eleman aradığınız tam sayıdan büyükse,
Alt indisi 249 olan elemanı değerlendirelim,
Sonra alt simge 124'ün elemanını belirleyin ...
Ve böylece, sonunda istediğiniz öğeyi bulana kadar
Veya seçim aralığı 0'a eşittir.
Yukarıdaki süreç,
Sözde ikili arama algoritması,
Aramanın zaman karmaşıklığı log (n) 'dir.
public static int binarySearch (int array, int target) { // Aralığın başlangıç noktasını bulun int başlangıç = 0; // Aralığın sonunu bul int end = dizi.length-1; // Aralığın medyanını bulun int mid; while (başla < = end) { // mid = (başlangıç + bitiş) / 2 taşabilir orta = başlangıç + (bitiş-başlangıç) / 2; eğer (dizi == hedef) { ortasına dönüş; } else if (dizi < hedef){ başlangıç = orta + 1; }Başka{ son = 1 ortası; } } dönüş -1; } public static void main (String args) { int dizi = yeni int; for (int i = 0; i < 1000; i ++) { dizi = i; } System.out.println (binarySearch (dizi, 173)); }Bu makale, CSDN'nin konumunu değil, yalnızca yazarın bakış açısını temsil etmektedir.