二进制搜索不起作用

时间:2013-09-12 22:48:06

标签: scala binary-search-tree

下面是二进制搜索算法,但没有找到值:

我不认为这个算法是正确的吗?

'theArray'初始化为0的数组,位置7的项目等于4。

object various {

  //O(log N)

  def binarySerachForValue(value : Int) = {

    var arraySize = 100
    var theArray = new Array[Int](arraySize)
    theArray(7) = 4
    var timesThrough = 0
    var lowIndex = 0
    var highIndex = arraySize - 1

    while(lowIndex <= highIndex){
        var middleIndex = (highIndex + lowIndex) / 2

        if(theArray(middleIndex) < value)
            lowIndex = middleIndex + 1
        else if(theArray(middleIndex) > value)
            highIndex = middleIndex - 1

        else {
            println("Found match in index " + middleIndex)
            lowIndex = highIndex + 1
        }

        timesThrough = timesThrough + 1

    }

    timesThrough
  }                                               //> binarySerachForValue: (value: Int)Int
    binarySerachForValue(4)                       //> res0: Int = 7
}

3 个答案:

答案 0 :(得分:1)

假设您的数组已经正确排序,您可以使用尾部优化递归在函数上更多地编写搜索函数,如下所示:

def binarySearchForValue(value : Int, theArray:Array[Int]) = {        
  @tailrec
  def doSearch(arr:Array[Int], index:Int = 0):Int = {        
    val middleIndex = arr.size / 2
    val splits = arr.splitAt(middleIndex)
    val totalIndex = middleIndex + index
    arr(middleIndex) match{
      case i if i == value => totalIndex
      case i if i < value => doSearch(splits._2, totalIndex)
      case _ => doSearch(splits._1 dropRight(1), totalIndex)
    }
  }
  doSearch(theArray)
} 

请注意,这也可以通过以下方式略微不同地完成:

def binarySearchForValue(value : Int, theArray:Array[Int]) = {        
  @tailrec
  def doSearch(low:Int, high:Int):Int = {
    val mid = (low + high) / 2
    if(mid >= theArray.size) -1 
    else {
        val currval = theArray(mid)
        if (currval == value) mid
        else if (currval < value) doSearch(mid+1, high)
        else doSearch(low, mid - 1)
    }
  }
  doSearch(0, theArray.size)
}

答案 1 :(得分:0)

循环应该是这样的:

while(lowIndex <= highIndex){
    //note the lowIndex + other
    var middleIndex = lowIndex + ((highIndex + lowIndex) / 2)

    if(theArray(middleIndex) < value)
        lowIndex = middleIndex + 1
    else if(theArray(middleIndex) > value)
        highIndex = middleIndex - 1

    else return middleIndex 

    timesThrough = timesThrough + 1

}
// if loop finished and not returned middleIndex in last else, return -1 (not found)
return -1

答案 2 :(得分:0)

它看起来像是二进制搜索算法的正确实现,但是你提供了一个0的数组,只有一个数字的索引为7.二进制搜索通常需要一个排序值数组(尽管你可以实现排序为第一步)。

以下是您首先需要排序数组的原因示例:

Searchfor(4)

theArray = [0,4,0,0,0]

第一次迭代,看看阵列(2),它等于0. 0&lt; 4,所以使用上半部分(即下部索引= middleindex + 1

newArray = [0,0]

然后我们再次迭代并最终退出循环因为我们从未找到它。使用排序列表,您的技术将运作良好。

通过在0的数组中找到单个值,最好的办法就是遍历数组,直到找到它为止。最好的运气。