二分查找------代码之美
发布日期:2022-04-04 06:36:26
浏览次数:19
分类:博客文章
本文共 1055 字,大约阅读时间需要 3 分钟。
二分查找的最大问题在于,数据必须放置在内存中且必须是有序的。 假设我们需要更新内存中数据集;你也许会认为这会极大的影响二分 查找:因为我们必须得对内存中一个巨大的、连续的数组进行更新。 但事实比你想象的要简单,实际上,我们程序所使用的内存片段散布 在物理内存中的各个角落,它们被操作系统的页机制所管理并以一个 连续的内存块的形式展现在我们面前。
有关搜索的问题,我采用的解决方案是:
1 首先试着使用语言内建的哈希表;
2 如果性能不能让人满意,那么就尝试采用二分查找;
3 只有在前面两步都不能取得令人满意的结果的前提下,我才会考虑 使用更复杂的方法。
关于循环
为什么我们要将算法中的循环运行到结束处,而不是在检测到了目标 值的时候就退出循环呢?
实际上,我们的代码的行为才是正确的行为;虽说对于该行为的正确 性数学证明已经超出了讨论的范围,但这的却是正确的。 假设我们有一个有着n个元素的数组(n是一个很大的值),那么从该 数组中第一次找到目标的概率是1/n。下一次是2/n,只有当元素的个 数减少到了10到20的时候,一次找到目标的概率才变得有意义,而对 于10到20个元素进行查找需要的只是大概4次循环。当查找失败时(在 大多数的应用中很普遍),那些额外的测试就将变成纯粹的额外开销。
大规模尺度的搜索使用Postings
#includeusing namespace std;int binaryfind(int x[],int target,int n) {//n为x的个数 int high = n; int low = -1; while (high - low > 1) { int probe = (low + high) >> 1; /*以前的版本是probe=(high=low)/2 但不安全,某些情况下会溢出*/ /*另一个方法 prode=(low+(high-low)/2) */ if (x[probe] > target) high = probe; else low = probe; } if (low == -1 || x[low] != target) return -1; else return low;}int main() { int x[10] = { 1,2,6,7,8,9,123,456,789,999}; cout << binaryfind(x, 7, 10) << endl;}
转载地址:https://www.cnblogs.com/l2017/p/9317845.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年03月29日 09时17分43秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
AcWing - 区间和(离散化&前缀和)
2019-04-28
AcWing - 区间合并(贪心)
2019-04-28
AcWing - 单链表(模拟)
2019-04-28
AcWing - 双链表(模拟)
2019-04-28
AcWing - KMP字符串(KMP)
2019-04-28
来一个总结吧
2019-04-28
有趣的句子
2019-04-28
每天一道 python 面试题 - Python中的元类(metaclass) 详细版本
2019-04-28
Scrapy(6)Item loader 加载器详解
2019-04-28
每日一道python面试题 - Python的实例,类和静态方法揭秘
2019-04-28
今日金融词汇---新股新债前面的N,是什么?
2019-04-28
每日一道python面试题 - Python的实例,类和静态方法揭秘
2019-04-28
原创专辑来了
2019-04-28
好好做好你喜欢做的事情,并且把它做好
2019-04-28
反馈不足
2019-04-28
人生永远没有太晚的开始
2019-04-28
python 周日福利来了
2019-04-28
状态模式
2019-04-28
跳表SkipList
2019-04-28
跳跃表(Skip list)原理与java实现
2019-04-28