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

相关推荐
熬夜学编程的小王10 分钟前
C++类与对象深度解析(一):从抽象到实践的全面入门指南
c++·git·算法
CV工程师小林12 分钟前
【算法】DFS 系列之 穷举/暴搜/深搜/回溯/剪枝(下篇)
数据结构·c++·算法·leetcode·深度优先·剪枝
Dylanioucn16 分钟前
【分布式微服务云原生】掌握 Redis Cluster架构解析、动态扩展原理以及哈希槽分片算法
算法·云原生·架构
繁依Fanyi25 分钟前
旅游心动盲盒:开启个性化旅行新体验
java·服务器·python·算法·eclipse·tomcat·旅游
罔闻_spider35 分钟前
爬虫prc技术----小红书爬取解决xs
爬虫·python·算法·机器学习·自然语言处理·中文分词
Themberfue1 小时前
基础算法之双指针--Java实现(下)--LeetCode题解:有效三角形的个数-查找总价格为目标值的两个商品-三数之和-四数之和
java·开发语言·学习·算法·leetcode·双指针
陈序缘2 小时前
LeetCode讲解篇之322. 零钱兑换
算法·leetcode·职场和发展
-$_$-2 小时前
【LeetCode HOT 100】详细题解之二叉树篇
数据结构·算法·leetcode
大白飞飞2 小时前
力扣203.移除链表元素
算法·leetcode·链表
学无止境\n2 小时前
[C语言]指针和数组
c语言·数据结构·算法