二分查找
被定义为一种在排序数组中使用的查找算法
重复将搜索间隔一分为二。二分查找的思想是利用数组已排序的信息,将时间复杂度降低到O(log N)
。
应用二分查找算法:
- 数据结构必须是有序的。
- 访问数据结构的任何元素都需要恒定的时间。
算法步骤:
- 通过查找中间索引
mid
将查找空间分为两半。 - 将查找空间的中间元素与目标元素进行比较。
- 如果在中间元素找到目标元素,则过程终止。
- 如果在中间元素没有找到目标元素,则选择哪一半将用作下一个查找空间。
- 如果键小于中间元素,则使用左侧进行下一步查找。
- 如果键大于中间元素,则使用右侧进行下一步查找。
- 这个过程一直持续到找到目标元素或者总查找空间耗尽为止。
ini
/// 迭代二分查找
int binarySearch(arr, n, x) {
int l = 0;
int r = arr.length - 1;
int mid = 0;
while (r >= l) {
mid = l + (int.tryParse("${(r - l) / 2}") ?? 0);
if (arr[mid] == x) {
return mid;
}
if (arr[mid] > x) {
r = mid - 1;
} else {
l = mid + 1;
}
}
return -1;
}
void main() {
List<int> arr = [2, 3, 8, 10, 90];
int x = 10;
int n = arr.length;
int result = binarySearch(arr, n, x);
(result == -1)
? print("Element is not present in array")
: print("Element is present at index: " + '$result');
}
时间复杂度:
scss
- 最佳情况:O(1)
- 平均情况:O(log N)
- 最坏情况:O(log N)
辅助空间:
O(1),如果考虑递归调用栈则辅助空间为O(logN)。
二分查找的优点:
- 二分查找比线性查找更快,特别是对于大型数组。
- 比具有类似时间复杂度的其他查找算法(例如插值查找或指数查找)更有效。
- 二分查找非常适合查找存储在外部存储器(例如硬盘驱动器或云中)中的大型数据集。
二分查找的缺点:
- 数组应该是排序的。
- 二分查找要求将要查找的数据结构存储在连续的内存位置中。
- 二分查找要求数组的元素是可比较的,这意味着它们必须能够排序。
二分查找的应用:
- 二分查找可以用作机器学习中使用的更复杂算法的构建块,例如训练神经网络或查找模型的最佳超参数的算法。
- 它可用于计算机图形学中的查找,例如光线追踪或纹理映射的算法。
- 它可用于查找数据库。