Не уверен, что я делаю неправильно в бинарном поиске - PullRequest
0 голосов
/ 31 марта 2020

У меня есть бинарный поиск, и я попытался отследить его, в моем аккаунте он должен вернуть значение как true во второй итерации, в то время как l oop, в console.log выполняется только базовый случай. Понятия не имею, что я делаю здесь не так, хотелось бы несколько указателей


const binarySearch = (sortedArray,value ) =>{

let left =0 
let right = sortedArray.length-1
let middle =left+Math.floor((right-left ) /2)
// console.log(`
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// left ==${left}

// right ==${right}

// middle==${middle}

// is value === middle??? ${value === sortedArray[middle]}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// `)
while(left<right){
  if(sortedArray[middle] === value){
    return middle
  }

  if(sortedArray[middle] < value){
    left = middle+1
  }

   if(sortedArray[middle] > value){
    right = middle-1
  }

}

  return -1


}


binarySearch([1,2,3,4,5], 4)

edit: я нашел ошибку! По какой-то странной причине я думал, что в то время как l oop будет использовать обновленное среднее значение, но для этого нет никаких оснований, поскольку javascript просто продолжает работать в стеке вызовов, если только я специально не изменю какое-либо значение. Тогда у меня была другая проблема, когда я не учитывал, могло ли значение «влево» или «вправо», похоже, работает сейчас, хотелось бы получить несколько советов по улучшению или совет, спасибо.

const binarySearch = (sortedArray,value ) =>{

let left =0 
let right = sortedArray.length-1

while(left<=right){

let middle =left+Math.floor((right-left ) /2)


  if(sortedArray[middle] === value){
    return middle
  }

  if(sortedArray[middle] < value){
    left = middle+1
  }

   if(sortedArray[middle] > value){
    right = middle-1
  }

}

  return -1


}


binarySearch([1,2,3,4,5], 1)

1 Ответ

0 голосов
/ 31 марта 2020

Итак, главная проблема, которую я вижу здесь, заключается в том, что вы не обновляете свой средний указатель каждый раз, когда обновляете левый и правый указатели ... Вы должны выяснить, каков новый средний указатель любого из подпрограмм массивы:

const binarySearch = (sortedArray, value) => {
  let left = 0;
  let right = sortedArray.length - 1;
  let middle = left + Math.floor((right - left) / 2);
  while (left <= right) {
    // The part you're missing
    middle = left + Math.floor((right - left) / 2);
    if (sortedArray[middle] === value) {
      return middle;
    }

    if (sortedArray[middle] < value) {
      left = middle + 1;
    }

    if (sortedArray[middle] > value) {
      right = middle - 1;
    }
  }

  return -1;
};

console.log(binarySearch([1, 2, 3, 4, 5], 4));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...