15.二分查找(上)

本文介绍了二分查找算法,适用于有序数据集合,时间复杂度为O(logn)。讨论了二分查找的递归与非递归实现,强调了其局限性——依赖数组、需要数据有序,以及在动态数据集和数据量过大时的不适用性。针对1000万个整数数据的查找问题,提出排序后使用二分查找的解决方案,满足内存不超过100MB的限制。
摘要由CSDN通过智能技术生成

15.二分查找(上):如何用最省内存的方式实现快速查找功能?

markdown文件已上传至github

假设我们有 1000 万个整数数据,每个数据占 8 个字节,如何设计数据结构和算法,快速判断某个整数是否出现在这 1000 万数据中? 我们希望这个功能不要占用太多的内存空间,最多不要超过 100MB,你会怎么做呢?

1.二分查找

二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。

二分查找的时间复杂度为 O ( l o g n ) O(logn) O(logn)

** O ( l o g n ) O(logn) O(logn)这种对数时间复杂度,有时候比 O ( 1 ) O(1) O(1)的算法还要高效。**因为 logn 是一个非常“恐怖”的数量级,即便 n 非常非常大,对应的 logn 也很小。比如 n 等于 2 的 32 次方,这个数很大了吧?大约是 42 亿。也就是说,如果我们在 42 亿个数据中用二分查找一个数据,最多需要比较 32 次。我们前面讲过,用大 O 标记法表示时间复杂度的时候,会省略掉常数、系数和低阶。对于常量级时间复杂度的算法来说,O(1) 有可能表示的是一个非常大的常量值,比如 O(1000)、O(10000)。所以,常量级时间复杂度的算法有时候可能还没有 O(logn) 的算法执行效率高。同理,指数时间复杂度的算法在大规模数据面前是无效的。

2.二分查找的递归与非递归实现

用循环实现二分查找代码:


public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值