下面是二进制搜索算法,但没有找到值:
我不认为这个算法是正确的吗?
'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
}
答案 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的数组中找到单个值,最好的办法就是遍历数组,直到找到它为止。最好的运气。