首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二分搜索

二分搜索
EN

Stack Overflow用户
提问于 2009-10-17 21:07:01
回答 6查看 2K关注 0票数 3

所以,我想了解更多关于二进制搜索的知识,因为我并不是真的理解。二进制搜索需要一个前提条件,即数组是排序的。我没记错吧?似乎一个方法应该检查这个前提条件,如果不满足就抛出一个异常。但是,为什么检查前提条件是一个坏主意?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-10-17 21:08:29

这不是一个好主意,因为检查数据是否排序需要n步骤。整个搜索都是关于log(n)步骤的。

如果你要检查,你最好做一个线性搜索。

票数 8
EN

Stack Overflow用户

发布于 2009-10-17 21:11:28

二进制搜索的全部意义在于,由于数据已经排序,您可以快速找到所需的信息。

拿电话簿来说,电话簿是按姓氏排序的。

你如何在电话簿中找到某人?你打开它,打开一个你认为会接近你想要的页面,然后开始翻页。

但你并不是每次都翻一页,如果你错过了很多,你会翻一堆页,然后开始一次翻一页,直到最后你开始看一页。

这就是二进制搜索所做的事情。由于数据是经过排序的,它知道可以跳过很多次并进行另一次查看,然后它会专注于您想要的信息。

对分搜索对每两倍数量的项目进行1次比较。因此,一个1024元素集合最多需要大约10次比较才能找到您的信息,或者至少找出它不在那里。

如果您在运行实际的二进制搜索之前,进行了一次完整的遍历,以检查数据是否已排序,那么您可能只需扫描一次信息。一个完整的遍历+二进制搜索将需要N+ log2 N个操作,因此对于1024个元素,它将需要大约1034个比较,而简单的信息扫描将平均需要一半,即512。

因此,如果不能保证数据是排序的,就不应该使用二进制搜索,因为它的性能将优于简单的扫描。

编辑:我要说的是,您可以添加一个仅调试的代码步骤来验证这一点,以捕获代码中的bug,该代码应该为二进制搜索准备数据,但要知道,由于我上面写的内容,这将使总运行时间更长,因此根据您想要对此检查做什么,您可能想要添加它,也可能不想添加它。但它不应该出现在发布代码中。

票数 7
EN

Stack Overflow用户

发布于 2009-10-17 21:11:08

是的,二分搜索涉及0(log )个步骤,而验证整个序列是否排序涉及0(n)个步骤。从我的观点来看,最好在调试模式下验证它,而不是在发布期间。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1583211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档