Artikel ini berbagi dengan Anda varian Java yang menerapkan pencarian biner untuk referensi. Konten spesifiknya adalah sebagai berikut
Pencarian biner normal:
Tinjau pertama pencarian biner biasa
Catatan: Ada masalah dengan pencarian biner: ketika ada duplikasi dalam array, seperti {3, 3, 3, 3}, ketika pencarian biner 3, pengembalian adalah arr [1], yang berarti pencarian biner tidak akan mengembalikan posisi 0 dari kejadian pertama 3.
BinarySearch kelas publik {public static <t meluas sebanding <? super t >> int pencarian (t arr [], nilai t) {int left = 0; int right = arr.length - 1; while (kiri <= kanan) {int mid = (kiri & kanan) + ((kiri ^ kanan) >> 1); if (arr [mid] .compareto (value) == 0) {return mid; } else if (arr [mid] .compareto (value)> 0) {right = mid - 1; } else {left = mid + 1; }} return -1; } public static void main (string [] args) {integer [] arr = new integer [] {1, 3, 3, 6, 7, 9}; //-1 System.out.println (cari (arr, 0)); // 0 System.out.println (Search (arr, 1)); // 5 System.out.println (Search (arr, 9)); //-1 System.out.println (Search (arr, 10)); // 2 System.out.println (Search (arr, 3)); }}Varian Bipartit: Fungsi FindFirst
Dalam pencarian biner normal, cari di interval [kiri ...... kanan] tertutup dan kanan tertutup. Jika elemen dengan nilai ditemukan, itu dianggap ditemukan. Ini tidak terjadi dalam fungsi FindFirst ini. Di [kiri ...... kanan] interval tertutup kanan tertutup, ketika elemen dengan nilai sama dengan nilai, bukan kanan = pertengahan-1, biarkan kanan = pertengahan, terus cari di interval tertutup kanan tertutup [kanan ...... kanan]. Loop keluar saat kiri == kanan akhirnya keluar.
Setelah keluar dari loop, nilainya dapat ditemukan, atau mungkin loop tidak menemukan nilainya setelah melintasi array lengkap, dan keluar dari loop.
Jadi setelah keluar dari loop, Anda harus menilai situasi mana.
BinarySearch kelas publik {public static <t meluas sebanding <? super t >> int findFirst (t arr [], nilai t) {int left = 0; int right = arr.length - 1; // Keluar saat kiri> = kanan, situasi "=" di sini berbeda dari biner sementara (kiri <kanan) {int mid = (kiri + kanan) >> 1; if (arr [mid] .compareto (value) <0) {left = mid + 1; } else {right = mid; }} // Setelah loop di atas dilalui. Apakah nilainya telah ditemukan? Masih belum ada nilai yang ditemukan? Buat saja penilaian. if (arr [kiri] == nilai) {return kiri; } else {return -1; }} public static void main (string [] args) {integer [] arr = new integer [] {1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 7, 9}; //-1 System.out.println (findFirst (arr, 0)); // 0 System.out.println (findFirst (arr, 1)); // 12 System.out.println (findFirst (arr, 9)); //-1 System.out.println (findFirst (arr, 10)); // 1 System.out.println (findFirst (arr, 3)); }}Varian bipartit: fungsi lebih sedikit
memperkenalkan
Diberikan array dan nilai variabel, temukan angka dari array yang paling dekat dengan nilai nilai dan lebih kecil dari nilai. Misalnya ARR = {11, 22, 22, 33, 33, 33, 44, 54} nilai = 33. 22 adalah yang paling dekat dengan nilai, dan lebih kecil dari nilai.
Jadi jawabannya adalah 2 (22 di penanda sudut bawah di array arr).
Jika tidak ada angka yang lebih kecil dari nilai yang ditemukan, maka output -1.
Larutan
Gunakan metode pencarian biner. Setiap kali, gunakan ARR [mid] untuk membandingkan dengan nilainya. Kecil, setara, pergi ke kiri untuk mencarinya; Besar, pergi ke kanan untuk mencarinya. Anda mungkin tidak memahami situasi "setara" dalam kalimat sebelumnya. Pencarian biner biasa adalah untuk menemukan ARR [mid] == nilai, sementara lebih sedikit fungsi untuk menemukan angka lebih kecil dari nilai, jadi meskipun ARR [mid] == Nilai, Anda harus terus mencari nilai yang lebih kecil di sebelah kiri.
contoh
Kode
BinarySearch kelas publik {public static <t meluas sebanding <? super t >> int lebih sedikit (t arr [], nilai t) {int left = 0; int right = arr.length - 1; // Keluar saat ketika kiri> kanan (kiri <= kanan) {int mid = (kiri & kanan) + ((kiri ^ kanan) >> 1); if (value.compareto (arr [mid]) <= 0) {right = mid - 1; } else {left = mid + 1; }} kembali ke kanan; } public static void main (string [] args) {integer [] arrf = new integer [] {21, 23, 25, 25, 31, 34, 37, 39, 52, 63}; // 3 System.out.println (lebih sedikit (ARRF, 30)); }}Varian bipartit: fungsi yang lebih besar
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.