数据结构与算法(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 数据结构与算法详解

相关推荐
君义_noip6 小时前
信息学奥赛一本通 1661:有趣的数列 | 洛谷 P3200 [HNOI2009] 有趣的数列
c++·算法·组合数学·信息学奥赛·csp-s
程序员:钧念6 小时前
深度学习与强化学习的区别
人工智能·python·深度学习·算法·transformer·rag
英英_7 小时前
MATLAB数值计算基础教程
数据结构·算法·matlab
一起养小猫7 小时前
LeetCode100天Day14-轮转数组与买卖股票最佳时机
算法·leetcode·职场和发展
hele_two7 小时前
快速幂算法
c++·python·算法
l1t8 小时前
利用DeepSeek将python DLX求解数独程序格式化并改成3.x版本
开发语言·python·算法·数独
jllllyuz8 小时前
基于子集模拟的系统与静态可靠性分析及Matlab优化算法实现
算法·matlab·概率论
程序员-King.8 小时前
day143—递归—对称二叉树(LeetCode-101)
数据结构·算法·leetcode·二叉树·递归
BlockChain8888 小时前
字符串最后一个单词的长度
算法·go
爱吃泡芙的小白白8 小时前
深入解析:2024年AI大模型核心算法与应用全景
人工智能·算法·大模型算法