Обмен технологиями

[Алгоритм JavaScript] Бинарный поиск: быстро найдите целевой элемент.

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Вставьте сюда описание изображения

🔥 个人主页:пустое стихотворение

Вставьте сюда описание изображения

Вставьте сюда описание изображения

Двоичный поиск — это эффективный алгоритм поиска, подходящий для быстрого поиска целевых элементов в упорядоченных массивах. По сравнению с линейным поиском временная сложность двоичного поиска составляет O(log n), что более эффективно. В этой статье подробно будут представлены принцип, реализация и применение алгоритма бинарного поиска.


1. Принцип алгоритма

Бинарный поиск быстро находит целевой элемент, непрерывно уменьшая вдвое диапазон поиска. Основные шаги заключаются в следующем:

  1. Начальный диапазон поиска — это начальный индекс и конечный индекс массива.
  2. Рассчитайте промежуточный индекс.
  3. Сравнивает элемент со средним индексом с целевым элементом.
    • Если оно равно, целевой элемент найден и возвращается его индекс.
    • Если целевой элемент меньше элемента со средним индексом, сузьте диапазон поиска до левой половины.
    • Если целевой элемент больше элемента со средним индексом, сузьте диапазон поиска до правой половины.
  4. Повторяйте вышеуказанные шаги до тех пор, пока диапазон поиска не станет пустым или пока не будет найден целевой элемент.


2. Реализация алгоритма

Ниже приведена реализация двоичного поиска на языке 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

3. Сценарии применения

  1. Поиск по упорядоченному массиву: быстро находите элементы в упорядоченном массиве.
  2. решать задачи: используется для решения определенных алгоритмических задач, требующих двоичного поиска, например поиска пиковых элементов в массиве.
  3. анализ данных: при анализе данных двоичный поиск используется для быстрого поиска местоположения определенного значения.

4. Оптимизация и расширение

  1. Рекурсивная реализация: Помимо итеративной реализации, двоичный поиск также можно реализовать рекурсивно.
/**
 * 递归实现二分查找算法
 * @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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  1. Найдите первое или последнее вхождение: при двоичном поиске алгоритм можно расширить, чтобы найти позицию первого или последнего целевого элемента в упорядоченном массиве.

5. Резюме

Бинарный поиск — это эффективный алгоритм поиска, который позволяет быстро найти целевой элемент в упорядоченном массиве, непрерывно уменьшая вдвое диапазон поиска. Понимание и освоение алгоритма двоичного поиска имеет большое значение для решения многих практических задач и оптимизации производительности программ. Я надеюсь, что эта статья поможет вам понять и применить бинарный поиск.