数据结构与算法(Dart)之二分查找(十七)

二分查找被定义为一种在排序数组中使用的查找算法重复将搜索间隔一分为二。二分查找的思想是利用数组已排序的信息,将时间复杂度降低到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)。

二分查找的优点:

  • 二分查找比线性查找更快,特别是对于大型数组。
  • 比具有类似时间复杂度的其他查找算法(例如插值查找或指数查找)更有效。
  • 二分查找非常适合查找存储在外部存储器(例如硬盘驱动器或云中)中的大型数据集。

二分查找的缺点:

  • 数组应该是排序的。
  • 二分查找要求将要查找的数据结构存储在连续的内存位置中。
  • 二分查找要求数组的元素是可比较的,这意味着它们必须能够排序。

二分查找的应用:

  • 二分查找可以用作机器学习中使用的更复杂算法的构建块,例如训练神经网络或查找模型的最佳超参数的算法。
  • 它可用于计算机图形学中的查找,例如光线追踪或纹理映射的算法。
  • 它可用于查找数据库。

参考资料

Binary Search -- Data Structure and Algorithm Tutorials

Python 数据结构与算法详解

相关推荐
qq_433554543 小时前
C++数位DP
c++·算法·图论
AshinGau3 小时前
Softmax 与 交叉熵损失
神经网络·算法
似水এ᭄往昔3 小时前
【C++】--AVL树的认识和实现
开发语言·数据结构·c++·算法·stl
栀秋6663 小时前
“无重复字符的最长子串”:从O(n²)哈希优化到滑动窗口封神,再到DP降维打击!
前端·javascript·算法
xhxxx3 小时前
不用 Set,只用两个布尔值:如何用标志位将矩阵置零的空间复杂度压到 O(1)
javascript·算法·面试
有意义3 小时前
斐波那契数列:从递归到优化的完整指南
javascript·算法·面试
charlie1145141914 小时前
编写INI Parser 测试完整指南 - 从零开始
开发语言·c++·笔记·学习·算法·单元测试·测试
mmz12074 小时前
前缀和问题2(c++)
c++·算法
TL滕4 小时前
从0开始学算法——第十六天(双指针算法)
数据结构·笔记·学习·算法
蒲小英5 小时前
算法-贪心算法
算法·贪心算法