


Menguasai Carian Binari dalam JavaScript dan Java: Panduan Langkah demi Langkah
Carian binari ialah algoritma asas yang harus difahami oleh setiap pembangun, menawarkan cara yang sangat cekap untuk mencari elemen dalam tatasusunan tersusun. Algoritma ini bergantung pada pendekatan "bahagi dan takluk", membolehkannya mengurangkan separuh ruang carian dengan setiap langkah. Dalam artikel ini, kami akan meneroka carian binari dalam JavaScript dan Java, meliputi pelaksanaan berulang dan rekursif.
Apakah Carian Binari?
Carian binari ialah algoritma yang direka untuk mencari kedudukan nilai sasaran dalam tatasusunan yang diisih. Dengan memanfaatkan sifat disusun tatasusunan, carian binari dengan cekap mengecilkan ruang carian, mencapai kerumitan masa O(log n). Ini jauh lebih pantas daripada carian linear dalam set data yang besar.
Berikut ialah gambaran keseluruhan peringkat tinggi:
- Mulakan dengan dua penunjuk, startIndex dan endIndex, mewakili julat carian semasa.
- Kira indeks tengah (midIndex) antara startIndex dan endIndex.
- Bandingkan elemen tengah dengan sasaran:
- Jika ia sepadan dengan sasaran, kembalikan indeks.
- Jika elemen tengah lebih besar daripada sasaran, sasaran mestilah di bahagian kiri, jadi laraskan endIndex.
- Jika elemen tengah kurang daripada sasaran, sasaran mesti berada di separuh kanan, jadi laraskan startIndex.
- Ulang proses sehingga sasaran ditemui atau startIndex mengatasi endIndex, menunjukkan sasaran tiada dalam tatasusunan.
Mari kita menyelami contoh kod.
Carian Binari Berulang dalam JavaScript dan Java
Pelaksanaan JavaScript
Dalam JavaScript, pendekatan berulang menggunakan gelung untuk melakukan carian binari. Begini rupanya:
const binarySearch = (arr, target) => { let startIndex = 0; let endIndex = arr.length - 1; while (startIndex <= endIndex) { let midIndex = Math.floor((startIndex + endIndex) / 2); if (arr[midIndex] === target) { return midIndex; // Target found } else if (arr[midIndex] < target) { startIndex = midIndex + 1; // Search in the right half } else { endIndex = midIndex - 1; // Search in the left half } } return -1; // Target not found }; let nums = [-1, 0, 3, 5, 9, 12]; console.log(binarySearch(nums, 9)); // Output: 4 console.log(binarySearch(nums, 2)); // Output: -1
Pelaksanaan Java
Di Java, pelaksanaan lelaran agak serupa, dengan pelarasan untuk sintaks Java:
public class BinarySearchExample { public static int binarySearch(int[] arr, int target) { int startIndex = 0; int endIndex = arr.length - 1; while (startIndex <= endIndex) { int midIndex = (startIndex + endIndex) / 2; if (arr[midIndex] == target) { return midIndex; // Target found } else if (arr[midIndex] < target) { startIndex = midIndex + 1; // Search in the right half } else { endIndex = midIndex - 1; // Search in the left half } } return -1; // Target not found } public static void main(String[] args) { int[] nums = {-1, 0, 3, 5, 9, 12}; int target = 9; int result = binarySearch(nums, target); if (result != -1) { System.out.println("Element found at index: " + result); } else { System.out.println("Element not found in the array."); } } }
Penjelasan
Dalam kedua-dua pelaksanaan:
- Kami menetapkan startIndex dan endIndex masing-masing pada permulaan dan akhir tatasusunan.
- Setiap lelaran mencari indeks tengah, midIndex dan membandingkan arr[midIndex] dengan sasaran.
- Jika arr[midIndex] sama dengan sasaran, kami mengembalikan midIndex.
- Jika arr[midIndex] kurang daripada sasaran, kami mengalihkan startIndex ke midIndex 1, mengecilkan carian ke separuh kanan.
- Jika arr[midIndex] lebih besar daripada sasaran, kami mengalihkan endIndex ke midIndex - 1, mengecilkan carian ke separuh kiri.
- Gelung keluar jika startIndex melebihi endIndex, bermakna sasaran tiada dalam tatasusunan.
Carian Binari Rekursif dalam JavaScript dan Java
Untuk pendekatan rekursif, kami mentakrifkan fungsi supaya ia memanggil dirinya sendiri dengan indeks yang dikemas kini sehingga sasaran ditemui atau julat carian kosong.
Pelaksanaan JavaScript
Dalam JavaScript, berikut ialah pelaksanaan carian binari rekursif:
const binarySearch = (arr, target) => { let startIndex = 0; let endIndex = arr.length - 1; while (startIndex <= endIndex) { let midIndex = Math.floor((startIndex + endIndex) / 2); if (arr[midIndex] === target) { return midIndex; // Target found } else if (arr[midIndex] < target) { startIndex = midIndex + 1; // Search in the right half } else { endIndex = midIndex - 1; // Search in the left half } } return -1; // Target not found }; let nums = [-1, 0, 3, 5, 9, 12]; console.log(binarySearch(nums, 9)); // Output: 4 console.log(binarySearch(nums, 2)); // Output: -1
Pelaksanaan Java
Di Java, carian binari rekursif yang serupa boleh dilaksanakan seperti berikut:
public class BinarySearchExample { public static int binarySearch(int[] arr, int target) { int startIndex = 0; int endIndex = arr.length - 1; while (startIndex <= endIndex) { int midIndex = (startIndex + endIndex) / 2; if (arr[midIndex] == target) { return midIndex; // Target found } else if (arr[midIndex] < target) { startIndex = midIndex + 1; // Search in the right half } else { endIndex = midIndex - 1; // Search in the left half } } return -1; // Target not found } public static void main(String[] args) { int[] nums = {-1, 0, 3, 5, 9, 12}; int target = 9; int result = binarySearch(nums, target); if (result != -1) { System.out.println("Element found at index: " + result); } else { System.out.println("Element not found in the array."); } } }
Cara Versi Rekursif Berfungsi
Dalam setiap panggilan rekursif:
- Indeks tengah, midIndex, dikira.
- Jika arr[midIndex] sepadan dengan sasaran, ia mengembalikan indeks.
- Jika arr[midIndex] lebih besar daripada sasaran, carian diteruskan di bahagian kiri (endIndex menjadi midIndex - 1).
- Jika arr[midIndex] kurang daripada sasaran, carian diteruskan pada separuh kanan (startIndex menjadi midIndex 1).
- Kes asas if (startIndex > endIndex) memastikan rekursi berhenti jika sasaran tidak ditemui.
Analisis Kerumitan
- Kerumitan Masa: Kedua-dua versi lelaran dan rekursif mempunyai kerumitan masa O(log n), kerana setiap langkah mengurangkan separuh ruang carian.
- Kerumitan Angkasa: Pendekatan berulang ialah O(1) untuk ruang, manakala pendekatan rekursif mempunyai kerumitan ruang O(log n) disebabkan timbunan panggilan.
Bila Menggunakan Carian Binari
Carian binari sesuai apabila:
- Tatasusunan diisih: Carian binari hanya berfungsi pada tatasusunan yang diisih.
- Kecekapan adalah kritikal: Kerumitan masa O(log n)nya sangat cekap untuk set data yang besar.
Jika tatasusunan tidak diisih, pertimbangkan untuk mengisihnya dahulu (dengan kos O(n log n)) atau menggunakan carian linear jika set data adalah kecil.
Kesimpulan
Carian binari ialah algoritma yang serba boleh dan cekap untuk mencari elemen dalam tatasusunan yang diisih. Sama ada anda memilih pendekatan berulang atau rekursif, memahami carian binari adalah berharga untuk meningkatkan prestasi aplikasi anda. Cuba kedua-dua pelaksanaan dalam JavaScript dan Java untuk merasai cara ia berfungsi dan lihat yang paling sesuai untuk kes penggunaan khusus anda.
? Rujukan
- Carian Binari
- Algoritma Grookking
- Notasi O Besar
? Bercakap dengan saya
- Github
- Portfolio
Atas ialah kandungan terperinci Menguasai Carian Binari dalam JavaScript dan Java: Panduan Langkah demi Langkah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

HashMap melaksanakan penyimpanan pasangan nilai utama melalui jadual hash di Java, dan terasnya terletak di lokasi data yang cepat. 1. Mula -mula gunakan kaedah hashcode () kunci untuk menghasilkan nilai hash dan mengubahnya menjadi indeks array melalui operasi bit; 2 Objek yang berbeza boleh menghasilkan nilai hash yang sama, mengakibatkan konflik. Pada masa ini, nod dipasang dalam bentuk senarai yang dipautkan. Selepas JDK8, senarai yang dipautkan terlalu panjang (panjang lalai 8) dan ia akan ditukar kepada pokok merah dan hitam untuk meningkatkan kecekapan; 3. Apabila menggunakan kelas tersuai sebagai kunci, sama () dan kaedah hashcode () mesti ditulis semula; 4. HashMap secara dinamik mengembangkan kapasiti. Apabila bilangan elemen melebihi kapasiti dan multiplies oleh faktor beban (lalai 0.75), mengembangkan dan mengembalikan; 5. hashmap tidak selamat benang, dan concu harus digunakan dalam multithreaded

Pilihan dapat jelas menyatakan niat dan mengurangkan bunyi kod untuk penghakiman null. 1. Pilihan.Ofnullable adalah cara biasa untuk menangani objek null. Sebagai contoh, apabila mengambil nilai dari peta, Orelse boleh digunakan untuk memberikan nilai lalai, supaya logik lebih jelas dan ringkas; 2. Gunakan panggilan rantaian peta untuk mencapai nilai bersarang untuk menghindari NPE dengan selamat, dan secara automatik menamatkan jika ada pautan adalah null dan mengembalikan nilai lalai; 3. Penapis boleh digunakan untuk penapisan bersyarat, dan operasi seterusnya akan terus dilakukan hanya jika syarat -syarat dipenuhi, jika tidak, ia akan melompat terus ke Orelse, yang sesuai untuk penghakiman perniagaan ringan; 4. Ia tidak disyorkan untuk menggunakan terlalu banyak pilihan, seperti jenis asas atau logik mudah, yang akan meningkatkan kerumitan, dan beberapa senario akan terus kembali ke NU.

Untuk menangani masalah pengekodan watak di Java, kunci adalah dengan jelas menentukan pengekodan yang digunakan pada setiap langkah. 1. Sentiasa tentukan pengekodan apabila membaca dan menulis teks, gunakan InputStreamReader dan OutputStreamWriter dan lulus dalam set aksara yang jelas untuk mengelakkan bergantung pada pengekodan lalai sistem. 2. Pastikan kedua-dua hujungnya konsisten apabila memproses rentetan pada sempadan rangkaian, tetapkan tajuk jenis kandungan yang betul dan secara jelas menentukan pengekodan dengan perpustakaan. 3. Gunakan string.getBytes () dan newstring (byte []) dengan berhati -hati, dan sentiasa secara manual menentukan standardCharsets.utf_8 untuk mengelakkan rasuah data yang disebabkan oleh perbezaan platform. Pendek kata, oleh

Penyelesaian teras untuk menghadapi java.io.notserializableException adalah untuk memastikan bahawa semua kelas yang perlu bersiri melaksanakan antara muka berseri dan periksa sokongan serialisasi objek bersarang. 1. Tambah implementsSerializable ke kelas utama; 2. Pastikan kelas medan tersuai yang sepadan di dalam kelas juga melaksanakan bersiri; 3. Gunakan sementara untuk menandakan medan yang tidak perlu bersiri; 4. Periksa jenis yang tidak berseri dalam koleksi atau objek bersarang; 5. Semak kelas mana yang tidak melaksanakan antara muka; 6. Pertimbangkan reka bentuk pengganti untuk kelas yang tidak dapat diubah suai, seperti menyimpan data utama atau menggunakan struktur pertengahan berseri; 7. Pertimbangkan untuk mengubah suai

Pengaturcaraan JavaSocket adalah asas komunikasi rangkaian, dan pertukaran data antara pelanggan dan pelayan direalisasikan melalui soket. 1. Socket di Java dibahagikan kepada kelas soket yang digunakan oleh klien dan kelas ServerSocket yang digunakan oleh pelayan; 2. Apabila menulis program soket, anda mesti mula memulakan port pendengaran pelayan, dan kemudian memulakan sambungan oleh pelanggan; 3. Proses komunikasi termasuk penubuhan sambungan, bacaan dan penulisan data, dan penutupan aliran; 4. Langkah berjaga -jaga termasuk mengelakkan konflik pelabuhan, dengan betul mengkonfigurasi alamat IP, sumber yang cukup menutup, dan menyokong beberapa pelanggan. Menguasai ini dapat merealisasikan fungsi komunikasi rangkaian asas.

Di Java, setanding digunakan untuk menentukan peraturan penyortiran lalai secara dalaman, dan komparator digunakan untuk menentukan pelbagai logik penyortiran secara luaran. 1.Sampar adalah antara muka yang dilaksanakan oleh kelas itu sendiri. Ia mentakrifkan susunan semula jadi dengan menulis semula kaedah CompareTo (). Ia sesuai untuk kelas dengan kaedah penyortiran tetap dan paling biasa digunakan, seperti rentetan atau integer. 2. Sempadan adalah antara muka fungsional yang ditakrifkan secara luaran, dilaksanakan melalui kaedah membandingkan (), sesuai untuk situasi di mana kaedah penyortiran berganda diperlukan untuk kelas yang sama, kod sumber kelas tidak dapat diubah suai, atau logik penyortiran sering diubah. Perbezaan antara keduanya adalah setanding yang hanya dapat menentukan logik penyortiran dan perlu mengubah suai kelas itu sendiri, sementara perbandingan

Terdapat tiga kaedah umum untuk melintasi Peta di Java: 1. Gunakan entriSet untuk mendapatkan kunci dan nilai pada masa yang sama, yang sesuai untuk kebanyakan senario; 2. Gunakan kekunci atau nilai untuk melintasi kekunci atau nilai masing -masing; 3. Gunakan Foreach Java8 untuk memudahkan struktur kod. EntrySet mengembalikan set set yang mengandungi semua pasangan nilai utama, dan setiap gelung mendapat objek peta.Entry, sesuai untuk akses kerap ke kunci dan nilai; Jika hanya kekunci atau nilai yang diperlukan, anda boleh memanggil kekunci () atau nilai () masing -masing, atau anda boleh mendapatkan nilai melalui map.get (kunci) apabila melintasi kunci; Java 8 boleh menggunakan foreach ((kunci, nilai)-& gt

Injava, thestatickeywordmeansamemberbelongstotheclassitself, nottoinstances.staticvariablesaresharesharedacrossallinstanceAndaccessedWithoutobjectCreation, consuryforglobaltrackingorconstants.staticmethodsoperateoperateTheclasslevel, tidak bolehaccessnonon-staccessnonon-stabil, tidak bolehaccessnonon-staccesslevel, tidak bolehaccessnonon-staccesslevel, tidak bolehaccessnononononononon-staccesslevel, tidak bolehaccessnononononononon-staccesslevel, tidak bolehaccessnononononononononon-staccesslevel, tidak dapat
