Algorithm 对已旋转N次的排序数组执行二进制搜索的最佳方法是什么

Algorithm 对已旋转N次的排序数组执行二进制搜索的最佳方法是什么,algorithm,Algorithm,可能重复: 我有一个排序数组,它被右旋转了N次,其中N是未知的。现在我想对它进行二进制搜索。怎样才能做到呢 eg initial array 1 4 5 8 15 now roted N=1 time 15 1 4 5 8 N= 2 8 15 1 4 5 N可以有任何值,并且可以大于元素数。简单的回答是,您不需要(至少,不能同时在整个数组上)。这是因为二进制搜索需要对元素进行排序才能工作 最好是使用二进制搜索分别搜索数组的每一半。例如,

可能重复:

我有一个排序数组,它被右旋转了N次,其中N是未知的。现在我想对它进行二进制搜索。怎样才能做到呢

eg initial array 1 4 5 8 15

now roted N=1 time   15  1  4  5  8
N= 2                  8 15  1  4  5 

N可以有任何值,并且可以大于元素数。

简单的回答是,您不需要(至少,不能同时在整个数组上)。这是因为二进制搜索需要对元素进行排序才能工作

最好是使用二进制搜索分别搜索数组的每一半。例如,要继续上面的示例,如果N=2,则数组将变为
8151445
8 15
1 4 5
仍然被排序,因此您可以对这些子数组中的每一个子数组进行二进制搜索。因此,在一般意义上,算法变为:

Let your array be A, its length be M, and the target value be T.
If (N is 0 or a multiple of M)
    Binary search A for T
Else
    The sub-array A1 is the first (M mod N) elements of A.
    The sub-array A2 is the remaining (M - (M mod N)) elements of A.
    If (the first element of A <= T)
        Binary search A1 for T
    Else
        Binary search A2 for T
让数组为A,长度为M,目标值为T。
如果(N为0或M的倍数)
对T的二进制搜索
其他的
子阵列A1是A的第一个(M mod N)元素。
子阵列A2是A的剩余(M-(M mod N))个元素。
如果(T)是T的第一个元素,那么根据定义,A1的所有元素也将>T,因此T不能在A1中


编辑正如Chris在下面的评论中指出的那样,有一种比这简单得多的方法,实际上允许您继续对整个数组执行二进制搜索。虽然上述方法可行,但他的方法巧妙地执行了类似的功能,但通过使用修改后的比较运算对整个数组执行n、

你到底为什么要做这样的事情?也许这是一个采访问题。一个天真而低效的方法是再次使用数组并执行二进制搜索。如果元素可以重复,你就不能做得比ω(n)更好在最坏的情况下,考虑一个全零的数组,除了一个,这是一个。这不是一个精确的副本。这个链接的可能的问题是关于搜索一个已知的数字;而这是关于寻找最小值的位置是未知的。你可以找到2个转换点,它将数组分成3个排序。d数组。然后对所有3个数组进行二进制搜索,以找到要查找的元素。要查找转换点,只需进行二进制搜索,直到剩下2个元素,其中一个小于或>k。k可以是数组中的任意数字,例如中点。查找转换点需要O(logn)和O(logn)需要在所有3个子数组上执行BS。您的第一段是错误的。关键是,如果您有一个排序数组并旋转它,结果是一个具有不同比较函数的排序数组。具体来说,比较是
x
小于
y
iff
(xa[0]&&y
。然后你可以使用这个比较来进行二进制搜索。@Chris:这是有道理的。我从来没有这样想过——它仍然被排序,只是在不同的定义下。这真是让人大开眼界。如果允许元素重复,Chris的解决方案和这个解决方案都不起作用。根据你上面的评论,二进制搜索将在对于重复的值,它只会导致次优性能。我在上面的回答中的关键见解(Chris也依赖于此)在旋转之后,数组由两个子数组组成,两个子数组都仍然被排序。因此,根据定义,算法仍然有效,尽管性能达到了您所描述的水平。它们肯定不会停止工作。@Mac:它们不起作用。在某些情况下,算法会声称数组不包含这样的元素,而它确实包含。My c这个问题的要点不适用于你或克里斯的算法。它谈论的是正确的算法。任何正确的算法都有Omega(n)最坏情况下界。事实上,这足以证明这些(你和克里斯的)算法是错误的,因为它们是O(logn)在最坏的情况下。顺便说一句,如果你使用@Moron,我会收到你对我的评论的回复的通知(这是本网站的一个功能)。