最坏情况下二元搜索是否最佳?我的导师已经这么说了,但我找不到一本支持它的书。我们从有序数组开始,在最坏的情况下(对于该算法最坏的情况),任何算法总是会比二进制搜索采用更多成对比较。
很多人说这个问题不清楚。抱歉!所以输入是任何通用排序数组。我正在寻找一个证据,证明任何搜索算法在最坏的情况下至少会进行log2(N)比较(考虑到算法的最坏情况)。
答案 0 :(得分:12)
是的,二分搜索是最佳的。
通过吸引信息理论可以很容易地看出这一点。 log N
位只需识别 N
元素中的唯一元素。但每次比较只给你一点信息。因此,您必须执行log N
比较以识别唯一元素。
更详细地说......考虑一个在最坏的情况下优于二分搜索的假设算法X.对于数组的特定元素,运行算法并记录它要求的问题;即,它执行的比较序列。或者更确切地说,将答案记录到这些问题中(例如“true,false,false,true”)。
将该序列转换为二进制字符串(1,0,0,1)。将此二进制字符串称为“与算法X相关的元素的签名”。对数组的每个元素执行此操作,为每个元素分配“签名”。
现在这是关键。如果两个元素具有相同的签名,则算法X无法区分它们!所有算法都知道数组是从它提出的问题中得到的答案;即,它执行的比较。如果算法不能区分两个元素,那么它就不正确。 (换句话说,如果两个元素具有相同的签名,意味着它们会导致算法进行相同的比较序列,算法会返回哪个算法?矛盾。)
最后,证明如果每个签名都少于log N
位,则必须存在两个具有相同签名的元素(归类原理)。完成。
[更新]
快速补充一条评论。以上假设该算法除了从执行比较中学到的内容外,对该数组一无所知。当然,在现实生活中,有时你会对阵列先验有所了解。作为一个玩具示例,如果我知道数组有(比方说)10个元素都在1到100之间,并且它们是不同的,并且数字92到100都存在于数组中......那么显然我不知道即使在最坏的情况下也需要进行四次比较。
更现实的是,如果我知道元素在它们的最小值和最大值之间均匀分布(或大致均匀分布),那么我可以做得比二分搜索更好。
但在一般情况下,二分搜索仍然是最佳的。
答案 1 :(得分:6)
哪种算法最坏的情况?没有一个普遍的“最坏情况”。如果你的问题是......
“是否存在二元搜索比另一种算法更多比较的情况?”
然后,是的,当然。如果元素恰好是列表中的第一个元素,那么简单的线性搜索会花费更少的时间。
“甚至算法的最坏情况下运行时间比二进制搜索更好?”
是的,如果您对数据有更多了解。例如,基数树或特里结构在条目数方面是最差的恒定时间(但是密钥的长度是线性的)。
“是否存在一种通用搜索算法,其运行时间比二进制搜索更好?”
如果你只能假设你在键上有比较功能,不,最好的最坏情况是O(log n)。但是有些算法速度更快,而且没有太大的意义。
...所以我想你真的必须首先定义问题!
答案 2 :(得分:1)
二进制搜索具有O(log(N))
比较的最差情况复杂性 - 这对于基于比较的搜索排序数组是最佳的。
在某些情况下,除了纯粹的基于比较的搜索之外,做一些其他事情可能是有意义的 - 在这种情况下,您可能能够击败O(log(N))
障碍 - 即查看interpolation搜索。
答案 3 :(得分:0)
这取决于数据的性质。例如英语和字典。您可以编写一种算法,通过利用某些字母在英语中以不同频率出现的事实来实现比二分搜索更好的效果。
但一般情况下,二元搜索是一种安全的选择。
答案 4 :(得分:0)
我认为这个问题有点不清楚,但仍然是我的想法。
二进制搜索的最坏情况是在所有log n比较之后找到您要搜索的元素。但是相同的数据可能是线性搜索的最佳情况。这取决于数据安排和您要搜索的内容,但二进制搜索的最坏情况最终将是log n。现在,这不能与相同的数据进行比较并搜索线性搜索,因为最坏的情况会有所不同。线性搜索的最坏情况可能是找到恰好位于数组末尾的元素。
例如:数组A = 1,2,3,4,5,6和A上的二进制搜索为1将是最坏的情况。对于相同的数组,线性搜索6将是最坏的情况,而不是搜索1.