【问题标题】:Implementing binary search in javascript在javascript中实现二分查找
【发布时间】:2017-10-27 18:13:17
【问题描述】:

我正在尝试在 javascript 中实现二进制搜索。我不知道我的脚本出了什么问题。每当我单击搜索按钮时,页面就会变得无响应。提前致谢。

var i,print,arr;
	arr = [1,2,3,4,5,6,7,8,9,10];
	print = document.getElementById("showArray");
	for(i = 0; i < arr.length; i++){
	 print.innerHTML += arr[i] + "&nbsp;"; 
	}
	function binarySearch(searchValue){ 
	  var lowerIndex, higherIndex, middleIndex,writeResult;
	  lowerIndex = 0;
	  higherIndex = arr.length;
	  writeResult = document.getElementById("showResult");
	  while(lowerIndex <= higherIndex){
	    middleIndex = (higherIndex + lowerIndex) / 2;
		if(searchValue == arr[middleIndex]){
		  writeResult.innerHTML = "PRESENT";
		  consol.log('Present');
		  break;
		}
		else if(searchValue > arr[middleIndex]){
		  lowerIndex = middleIndex + 1;
		}
		else if(searchValue < arr[middleIndex]){
		  higherIndex = middleIndex - 1;
		}
	  }
	}
<button onclick = "binarySearch(1)">SEARCH</button>
	<p id = "showArray" style = "font-size: 40px; padding:0px;">       </p>
	<p id = "showResult">Result is:</p>

【问题讨论】:

  • 可能是无限循环。只需将console.log(lowerIndex, higherIndex) 之类的内容放在循环的开头,您就会看到发生了什么。

标签: javascript binary-search


【解决方案1】:

试试类似的东西

Array.prototype.br_search = function (target)   
{  
  var half = parseInt(this.length / 2);  
  if (target === this[half])   
  {  
    return half;  
  }  
  if (target > this[half])   
  {  
    return half + this.slice(half,this.length).br_search(target);  
  }   
  else  
  {  
    return this.slice(0, half).br_search(target);  
  }  
};  

l= [0,1,2,3,4,5,6];  

console.log(l.br_search(5));

【讨论】:

    【解决方案2】:

    您的主要问题是不要使用整数部分来计算middleIndex。这使得无法检查数组的给定索引处的值,因为索引必须是整数。

    var i,
        print = document.getElementById("showArray"),
        arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    
    for (i = 0; i < arr.length; i++) {
        print.innerHTML += arr[i] + "&nbsp;";
    }
    
    function binarySearch(searchValue) {
        var lowerIndex = 0,
            higherIndex = arr.length - 1,
            middleIndex,
            writeResult = document.getElementById("showResult");
    
        while (lowerIndex <= higherIndex) {
            middleIndex = Math.floor((higherIndex + lowerIndex) / 2);
            if (searchValue == arr[middleIndex]) {
                writeResult.innerHTML = "PRESENT " + middleIndex;
                break;
            }
            if (searchValue > arr[middleIndex]) {
                lowerIndex = middleIndex + 1;
            } else {
                higherIndex = middleIndex - 1;
            }
        }
    }
    <button onclick="binarySearch(2)">SEARCH</button>
    <p id="showArray" style="font-size: 40px; padding:0px;">       </p>
    <p id="showResult">Result is:</p>

    【讨论】:

      【解决方案3】:

      没有break的二分搜索的迭代示例。

      运行时间:log2(n)

      function search(array, target) {
        let min = array[0]
        let max = array.length - 1;
        let guess;
        
        while (max >= min) {
          guess = Math.floor((min+max)/2);
          if (array[guess] === target) {
            return guess;
          } else if (array[guess] > target) {
            max = guess - 1;
          } else {
            min = guess + 1;
          }
        }
      
        return -1;
      }
      
      const primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];
      console.log(search(primes, 67));

      【讨论】:

        猜你喜欢
        • 2015-06-10
        • 1970-01-01
        • 2016-02-23
        • 2010-10-28
        • 2018-04-13
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 2014-05-10
        相关资源
        最近更新 更多