二分搜尋是每個開發人員都應該理解的基本演算法,它提供了一種高效的方法來搜尋排序數組中的元素。該演算法依賴於「分而治之」的方法,允許每一步將搜尋空間減半。在本文中,我們將探索 JavaScript 和 Java 中的二分搜索,涵蓋迭代和遞歸實作。
二分搜尋是一種旨在尋找排序數組中目標值的位置的演算法。透過利用陣列的排序特性,二分搜尋有效地縮小了搜尋空間,實現了 O(log n) 的時間複雜度。這比大型資料集中的線性搜尋快得多。
以下是進階概述:
讓我們深入研究程式碼範例。
在 JavaScript 中,迭代方法使用迴圈來執行二分搜尋。它看起來像這樣:
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
在Java中,迭代實作非常相似,只是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."); } } }
在兩種實作中:
對於遞歸方法,我們定義函數,以便它使用更新的索引來呼叫自身,直到找到目標或搜尋範圍為空。
在 JavaScript 中,這是一個遞歸二分搜尋實作:
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
在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."); } } }
在每次遞迴呼叫中:
二分搜尋在以下情況下是理想的選擇:
如果數組未排序,請考慮先對其進行排序(以 O(n log n) 成本),或者如果資料集較小,則使用線性搜尋。
二分搜尋是一種通用且高效的演算法,用於在排序數組中定位元素。無論您選擇迭代還是遞歸方法,了解二分搜尋對於提高應用程式的效能都很有價值。嘗試 JavaScript 和 Java 中的兩種實現,了解它們的工作原理,並查看哪種最適合您的特定用例。
以上是掌握 JavaScript 和 Java 中的二分搜尋:逐步指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!