Rumah Java javaTutorial Menguasai Carian Binari dalam JavaScript dan Java: Panduan Langkah demi Langkah

Menguasai Carian Binari dalam JavaScript dan Java: Panduan Langkah demi Langkah

Nov 04, 2024 pm 10:54 PM

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:

  1. Mulakan dengan dua penunjuk, startIndex dan endIndex, mewakili julat carian semasa.
  2. Kira indeks tengah (midIndex) antara startIndex dan endIndex.
  3. 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.
  4. 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

Mastering Binary Search in JavaScript and Java: A Step-by-Step Guide

Untuk anda yang suka gelung.

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.

Mastering Binary Search in JavaScript and Java: A Step-by-Step Guide

Untuk anda yang sukakan permulaan.

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

    • LinkedIn
    • 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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

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

Artikel Panas

Mejiro Ryan Build Guide | Uma Musume Pretty Derby
1 bulan yang lalu By Jack chen
Rimworld Odyssey Cara Ikan
4 minggu yang lalu By Jack chen
Apakah had transaksi untuk pengguna asing di Alipay?
1 bulan yang lalu By 下次还敢

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1505
276
Bagaimanakah hashmap berfungsi secara dalaman di Java? Bagaimanakah hashmap berfungsi secara dalaman di Java? Jul 15, 2025 am 03:10 AM

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

Contoh pilihan Java Contoh pilihan Java Jul 12, 2025 am 02:55 AM

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.

Bagaimana Mengatasi Isu Pengekodan Watak di Java? Bagaimana Mengatasi Isu Pengekodan Watak di Java? Jul 13, 2025 am 02:46 AM

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

Bagaimana untuk memperbaiki java.io.notserializableException? Bagaimana untuk memperbaiki java.io.notserializableException? Jul 12, 2025 am 03:07 AM

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

Asas dan contoh pengaturcaraan soket Java Asas dan contoh pengaturcaraan soket Java Jul 12, 2025 am 02:53 AM

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.

Pembanding vs setanding di java Pembanding vs setanding di java Jul 13, 2025 am 02:31 AM

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

Bagaimana untuk melangkah ke peta di Java? Bagaimana untuk melangkah ke peta di Java? Jul 13, 2025 am 02:54 AM

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

Apakah kata kunci 'statik' di Java? Apakah kata kunci 'statik' di Java? Jul 13, 2025 am 02:51 AM

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

See all articles