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

相关推荐
南境十里·墨染春水3 小时前
C++传记(面向对象)虚析构函数 纯虚函数 抽象类 final、override关键字
开发语言·c++·笔记·算法
2301_797172754 小时前
基于C++的游戏引擎开发
开发语言·c++·算法
有为少年5 小时前
告别“唯语料论”:用合成抽象数据为大模型开智
人工智能·深度学习·神经网络·算法·机器学习·大模型·预训练
比昨天多敲两行5 小时前
C++ 二叉搜索树
开发语言·c++·算法
Season4505 小时前
C++11之正则表达式使用指南--[正则表达式介绍]|[regex的常用函数等介绍]
c++·算法·正则表达式
Tisfy5 小时前
LeetCode 2839.判断通过操作能否让字符串相等 I:if-else(两两判断)
算法·leetcode·字符串·题解
问好眼5 小时前
《算法竞赛进阶指南》0x04 二分-1.最佳牛围栏
数据结构·c++·算法·二分·信息学奥赛
会编程的土豆5 小时前
【数据结构与算法】优先队列
数据结构·算法
minji...7 小时前
Linux 进程信号(二)信号的保存,sigset_t,sigprocmask,sigpending
linux·运维·服务器·网络·数据结构·c++·算法
罗湖老棍子7 小时前
最大数(信息学奥赛一本通- P1549)(洛谷-P1198)
数据结构·算法·线段树·单点修改 区间求最大值