Algorithm 编程珍珠问题:在二进制搜索中检查排序数组

Algorithm 编程珍珠问题:在二进制搜索中检查排序数组,algorithm,Algorithm,在(第二版)第5列的问题5中,问题是关于在未排序的数组上实现二进制搜索 如何将部分检查添加到 这项功能在很大程度上降低了 比O(n-1)成本低 我知道你可以检查每一次迭代并实现O(logn),但是后面的提示表明有一个O(1)解决方案 这是什么解决方案?总结 正如OP所说,可以在O(logn)和O(1)中部分检查数组是否已排序以使二进制搜索适用。O(logn)方法是对照前一个探测器检查每个探测器,以确保其比较正确(小于、大于)。O(1)方法只是检查通过二进制搜索找到的最后一个元素和它旁边的一个元素

在(第二版)第5列的问题5中,问题是关于在未排序的数组上实现二进制搜索

如何将部分检查添加到 这项功能在很大程度上降低了 比O(n-1)成本低

我知道你可以检查每一次迭代并实现O(logn),但是后面的提示表明有一个O(1)解决方案


这是什么解决方案?

总结

正如OP所说,可以在O(logn)和O(1)中部分检查数组是否已排序以使二进制搜索适用。O(logn)方法是对照前一个探测器检查每个探测器,以确保其比较正确(小于、大于)。O(1)方法只是检查通过二进制搜索找到的最后一个元素和它旁边的一个元素,这样,如果找不到所需的元素,至少可以找到正确的插入位置。如果找到了追求的元素,那么这是一个很好的O(1)部分检查

更详细的解释

代码块之前的问题部分指出,一个常见的问题是在未排序的数组上使用二进制搜索。基本上,如何使用部分检查来检查数组的排序成本是否小于O(n-1)

O(logn)解决方案是相对于前一个探测检查每个二进制搜索探测网格(小于或大于预期值)。这并不能保证数组被排序,但这是一个很好的局部检查


我能想到的唯一O(1)检查是检查搜索的最终位置,使其值和相邻值与搜索的元素应该在哪里的想法相匹配,即使没有找到元素。这是一个很好的局部检查:如果找到元素,那么事情可能正常工作。如果不是,那么检查应该在哪里的元素,以便有一个比搜索到的元素小,然后有一个比搜索到的元素大。然而,我意识到以这种方式检查意味着二进制搜索,即O(logn),已经完成了,所以我不知道这是否真的是O(1)。但是,它只在整体搜索中添加了O(1),因此我认为它是适用的。

写得很好。我想知道这是否是解决方案,但我觉得有点奇怪,只需检查最终结果就可以检查数组是否已排序。这实际上是检查完成后是否处于微有效状态。仍然有可能在一个山谷中找到你自己,在那里局部元素被排序,但你正在搜索的元素在其他地方没有排序:[1,2,4,5,6,7,3,10]如果你搜索3,你会认为这是排序的,不会找到[3]是的,这就是为什么它被称为部分检查。它不能保证数组被排序,但可能是这样。全面检查的唯一方法是线性检查,但部分检查也可以。