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 для нового интервала и повторяем до результата.
  • Вопрос задан
  • 127 просмотров
Решения вопроса 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);
  },
},

Да и сам результат поиска тоже может быть вычисляемым свойством.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
PriestFromRL
@PriestFromRL
Дополни вопрос, немного не понятно то, каким ты способом ищешь девятку. Попробуй использовать функцию считывания длины массива, беря из нее те номера, которые тебе нужны.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы