Destell
@Destell
React, React Native junior developer

Почему двоичный поиск работает только «вверх»?

Пример

Озадачился бинарным поиском. Возникла проблема - он работает только "вверх".
Т.е. если в массиве типа [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ] я буду искать 9, то она найдется, но все предыдущие цифры выдают none.
Пробовал менять цикл, результат все тот же. В чем может быть косяк?

Как это работает:
Используем
min = 0;
max = длина массива - 1 (получаем максимальный индекс);
mid = (min + max) / 2 и округляем в меньшую сторону - получаем индекс центрального элемента в массиве.

Когда вводим число в поиск, сравниваем его с элементом под индексом mid.
Если равенство верно - выводим в консоль результат.

Если элемент под индексом mid больше, чем число, которое мы ищем, то max = mid - 1, далее находим mid для нового интервала и повторяем до результата.

Аналогично, если элемент под индексом mid меньше, чем число, которое мы ищем, то min = mid + 1, далее находим mid для нового интервала и повторяем до результата.
  • Вопрос задан
  • 130 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Vue.js
Косяков и странностей тут навалом.

Значение max вы перед началом поиска устанавливаете равным максимальному индексу - отлично. А как же min - почему не устанавливаете его равным 0? Забыли? Или думаете что 0 там сам собой появится? Не появится.

Кстати, а зачем min и max класть в data? - вне binarySearchInit они не используются. Пусть будут локальными переменными этого метода.

Значения в массиве являются строками, так что у вас 11 будет меньше, чем 2 (или для вас не существует ничего больше девятки?). Надо сделать числами, замените .push(item) на .push(+item) (или .push(Number(item)), или .push(parseInt(item))). Соответственно, надо сделать числом и search - для этого достаточно добавить соответствующий модификатор v-model.

Сортировка введённых данных - по умолчанию элементы массива сортируются как строки. Заменить .sort() на .sort((a, b) => a - b).

Зачем такие сложности с отдельной кнопкой для получения данных? Сделайте array вычисляемым свойством:

computed: {
  array() {
    return this.info
      .split(';')
      .map(n => parseInt(n))
      .filter(n => !Number.isNaN(n))
      .sort((a, b) => a - b);
  },
},

Да и сам результат поиска тоже может быть вычисляемым свойством.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы