需要一个特殊数组的算法(线性场)

时间:2013-01-09 17:56:39

标签: algorithm runtime

我有一个数组(线性字段) 预先排序的数字

 [1, 2, 3, 4, 5, 6],

但是这些arra y向右移动(k次),

现在它的

[5,6,1,2,3,4], k = 2

但我不知道k。只有阵列A。

现在我需要一个算法来查找A中的最大值(使用运行时O(logn))

我认为它有二分搜索功能,任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

可以通过找到“不连续点”,即数组中6, 1点的索引来重新说明这个问题。您可以使用类似于binary search的方法迭代地执行此操作,如下所示:

获取数组A和两个索引lowhigh,最初设置为0A.Length-1。不连续点位于lowhigh之间。

(low, high)分成两半。调用中点mid。将A[low]A[mid]A[mid]A[high]进行比较。如果只有一对正确排序,请调整端点:如果它是订购的low-mid对,请指定low = mid,否则指定high = mid。如果两个区间都是有序的,答案是A[high]

这在O(LogN)中运行,因为每个步骤都会将问题的大小减少一半。

答案 1 :(得分:1)

你是对的,它基本上是二元搜索。

选择中间数字。如果它小于(当前分区的)左端的数字,那么最大的数字在左分区中。否则,它在正确的分区中。

答案 2 :(得分:0)

如果你知道'k'是什么,那么你可以拆分数组并重建它,或者你可以重新实现一个偏移k的二进制搜索算法。

例如,

int low = 0;
int high = array.length - 1;

while(low != high)
{
    int test = (low + high)/2;
    int testIndex = (test + k) % array.length;
    if (array[testIndex] < wanted)
        low = test;
    else if (array[testIndex] > wanted)
       high = test;
    else
       return testIndex;
 }

或类似的东西。 testIndex变量偏移'k',但搜索索引(低,高和测试)不知道。

PS。,您需要为此代码添加更多安全检查(例如,'想要'不在数组中);我只是想显示索引偏移部分。