我有一个已排序的数组,它已经右旋了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可以有任何值,并且可以大于元素数。
答案 0 :(得分:2)
简短的回答是,你没有(至少不是一次在整个阵列上)。这是因为二进制搜索需要要排序的元素才能工作。
关于您可以做的最好的事情是使用二进制搜索分别搜索阵列的每一半。例如,要继续上面的示例,如果N = 2,则数组变为8 15 1 4 5
。 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的第一个元素将搜索限制为A1或A2的原因是因为如果A [0]&gt; T,那么A1的所有元素也将是> T根据定义,因此T不能在A1中。
HTH!
编辑正如克里斯在下面的评论中指出的那样,有一个比这更简单的方法,实际上允许你继续在整个数组上执行二进制搜索。虽然上述方法可行,但他的方法通过使用修改后的比较操作巧妙地执行了类似的功能,但在整个阵列中。