📅  最后修改于: 2023-12-03 14:47:17.550000             🧑  作者: Mango
二分搜索(Binary Search)是一种快速查找有序集合中特定值的算法。在Scala中,我们可以使用递归或迭代的方式实现二分搜索。
递归实现的思路是将要查找的数组划分成两部分,然后递归地查找目标值所处的那一部分,直到找到或者数组为空。
以下是基于递归实现的代码:
def binarySearchRecursive(arr: Array[Int], low: Int, high: Int, target: Int): Int = {
if (low > high) {
-1
} else {
val mid = (low + high) / 2
if (target == arr(mid)) {
mid
} else if (target < arr(mid)) {
binarySearchRecursive(arr, low, mid - 1, target)
} else {
binarySearchRecursive(arr, mid + 1, high, target)
}
}
}
其中,arr
是要查找的数组,low
和high
是要查找的数组的下标范围,target
是要查找的目标值。在函数内部,我们首先判断了数组是否为空,如果是,则返回-1
。否则,我们求出了数组的中间位置mid
。然后,我们比较target
和arr(mid)
的大小关系,如果相等,则返回mid
。如果target
比arr(mid)
小,则递归查找arr
的左半部分,也就是下标范围为low
到mid-1
的部分。否则,我们递归查找arr
的右半部分,也就是下标范围为mid+1
到high
的部分。
使用递归方式实现的二分搜索在理解上比较容易,但是在实现上比较耗费时间和空间。因此,我们通常会使用迭代的方式来实现二分搜索。
迭代实现的思路是使用一个循环不断地将要查找的数组缩小一半,直到找到目标值或者数组为空。
以下是基于迭代实现的代码:
def binarySearchIterative(arr: Array[Int], target: Int): Int = {
var low = 0
var high = arr.length - 1
while (low <= high) {
val mid = (low + high) / 2
if (target == arr(mid)) {
return mid
} else if (target < arr(mid)) {
high = mid - 1
} else {
low = mid + 1
}
}
-1
}
在函数内部,我们首先对low
和high
进行初始化,分别设置为0和数组的长度减1。然后,我们进入了一个循环,判断条件为low <= high
。在循环中,我们求出了数组的中间位置mid
。然后,我们比较target
和arr(mid)
的大小关系,如果相等,则直接返回mid
。如果target
比arr(mid)
小,则将high
的值更新为mid-1
。否则,我们将low
的值更新为mid+1
。最终,如果数组中没有目标值,则返回-1
。
使用迭代方式实现的二分搜索在实现上比较简洁,也比较快速和节省空间。因此,我们通常使用迭代的方式来实现二分搜索。
二分搜索是一种快速查找有序集合中特定值的算法,在Scala中既可以使用递归方式实现,也可以使用迭代方式实现。使用递归方式实现的代码比较易于理解,但是运行效率较低,占用的空间也比较大。而使用迭代方式实现的代码比较简洁,速度也比较快,且占用的空间比较小。因此,我们通常使用迭代方式实现二分搜索。