在Programming Pearls(第二版)第5列,问题5中,问题是关于在未排序的数组上实现二进制搜索。
如何添加部分检查 功能明显减少 比O(n-1)成本?
我知道您可以检查每次迭代并获得O(log n),但后面的提示表明存在O(1)解决方案。
那是什么解决方案?
答案 0 :(得分:4)
<强>摘要强>
部分检查数组是否已排序以便二进制搜索适用可以在O(log n)中完成,如OP所述,并在O(1)中完成。 O(log n)方法是针对先前的探针检查每个探针,以确保它正确比较(小于,大于)。 O(1)方法只是检查二进制搜索找到的最终元素和旁边的一个元素,这样如果找不到所追求的元素,至少找到正确的插入位置。如果找到了所追求的元素,那么这是一个很好的O(1)部分检查。
更长的解释
代码块之前的问题部分表示常见问题是在未排序的数组上使用二进制搜索。基本上,如何使用部分检查来检查数组是否以低于O(n-1)的成本排序?
O(log n)解决方案是检查每个二进制搜索探针网格相对于先前的探针(小于或大于预期的)。这并不保证数组已排序,但这是一个很好的部分检查。
我能想到的唯一O(1)检查是检查搜索到的最终位置,使其值和相邻值与搜索元素应该在哪里相匹配,即使元素不是找不到。这是一个非常好的部分检查:如果找到元素,那么事情可能正常工作。如果不是,那么检查它应该在哪里的元素,使得有一个小于搜索的元素,然后一个大于搜索的元素。但是,我确实意识到以这种方式检查意味着二进制搜索,即O(log n),已经完成,所以我不知道这是否真的是O(1)。但是,它只在整体搜索中添加O(1),所以我认为它是适用的。