私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
二分探索は、順序付けられた配列内のターゲット要素を迅速に見つけるのに適した効率的な検索アルゴリズムです。線形探索と比較すると、二分探索の時間計算量は O(log n) であり、より効率的です。この記事では、二分探索アルゴリズムの原理、実装、応用について詳しく紹介します。
二分探索では、探索範囲を半分に続けて高速に目的の要素を見つけます。基本的な手順は次のとおりです。
以下は、バイナリ検索の JavaScript 実装です。
/**
* 二分查找算法
* @param {number[]} arr - 有序数组
* @param {number} target - 目标元素
* @return {number} - 目标元素的索引,未找到返回 -1
*/
function binarySearch(arr, target) {
let left = 0;
let right = arr.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (arr[mid] === target) {
return mid; // 找到目标元素
} else if (arr[mid] < target) {
left = mid + 1; // 查找右半部分
} else {
right = mid - 1; // 查找左半部分
}
}
return -1; // 未找到目标元素
}
// 示例
const arr = [1, 3, 5, 7, 9, 11, 13];
const target = 7;
const index = binarySearch(arr, target);
console.log(index); // 输出: 3
/**
* 递归实现二分查找算法
* @param {number[]} arr - 有序数组
* @param {number} target - 目标元素
* @param {number} left - 左索引
* @param {number} right - 右索引
* @return {number} - 目标元素的索引,未找到返回 -1
*/
function binarySearchRecursive(arr, target, left = 0, right = arr.length - 1) {
if (left > right) {
return -1; // 未找到目标元素
}
const mid = Math.floor((left + right) / 2);
if (arr[mid] === target) {
return mid; // 找到目标元素
} else if (arr[mid] < target) {
return binarySearchRecursive(arr, target, mid + 1, right); // 查找右半部分
} else {
return binarySearchRecursive(arr, target, left, mid - 1); // 查找左半部分
}
}
// 示例
const indexRecursive = binarySearchRecursive(arr, target);
console.log(indexRecursive); // 输出: 3
二分探索は、探索範囲を継続的に半分にすることで、順序付けられた配列内の目的の要素を迅速に見つけることができる効率的な探索アルゴリズムです。二分探索アルゴリズムを理解して習得することは、多くの実際的な問題を解決し、プログラムのパフォーマンスを最適化するために非常に重要です。この記事が二分探索の理解と応用に役立つことを願っています。