Как написать кастомный findIndex с бинарным поиском?

Хочу написать кастомный метод массива findIndexBinary, реализующий бинарный поиск элемента с возвратом его индекса. Но не могу понять, как внутри самого метода получить доступ к заданному элементу.

В чистом виде сама функция выглядит так

const searchBinary = (nums, target) => {
  let left = 0
  let right = nums.length - 1
  let middle

  while (left <= right) {
    middle = Math.round((right - left) / 2) + left

    if (target === nums[middle]) {
      return middle
    } else if (target < nums[middle]) {
      right = middle - 1
    } else {
      left = middle + 1
    }
  }

  return -1
}


Я пробовал сделать следующий вариант (см ниже). И если с первым if внутри while все понятно, то что должно быть в else if? Пока хардкодом продублировал внутри while константу target, но ведь от нее нужно как-то избавиться. Иначе говоря, как получить этот target, чтобы сравнить с this[middle] ведь он внутри коллбэк функции?

Array.prototype.findIndexBinary = function(callback) {
  let left = 0
  let right = this.length - 1
  let middle
  
  while (left <= right) {
    middle = Math.round((right - left) / 2) + left
    
    // Этой константы тут, разумеется, быть не должно
    const target = 10
    
    if (callback(this[middle], middle, this)) {
    // вместо if (target === this[middle]) {
      return middle
      // а вот что должно быть в качестве условия else if - непонятно
    } else if (target < this[middle]) {
      right = middle - 1
    } else {
      left = middle + 1
    }
  }

  return -1
}

const elementIndex = nums.findIndexBinary(el => el === 10)
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Есть два варианта. Первый - функция возвращает -1, 0 или 1 сравнивая 2 элемента в зависимости от того, какой меньше или если они равны.

Второй вариант - функция должна возвращать 1, если первый элемент строго меньше второго.

Тогда равнество можно сделать так: !f(a,b) && !f(b,a). А второе условие просто заменяется на один вызов функции.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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