Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 需要特殊阵列(线性场)的算法_Algorithm_Runtime - Fatal编程技术网

Algorithm 需要特殊阵列(线性场)的算法

Algorithm 需要特殊阵列(线性场)的算法,algorithm,runtime,Algorithm,Runtime,我有一个数组(线性场) 带有预先排序的数字 [1, 2, 3, 4, 5, 6], 但这些数组向右移动(k倍) 现在是 [5,6,1,2,3,4], k = 2 但我不知道k。只有数组A 现在我需要一个算法来找到A中的最大值(使用运行时O(logn)) 我认为这是一种二进制搜索,有人能帮我吗?你说得对,它基本上是一种二进制搜索 选择中间的数字。如果它小于(当前分区)左端的数字,那么最大的数字在左分区。否则,它就在正确的分区中。如果您知道“k”是什么,那么您可以拆分数组并重建它,或者重新实现

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

 [1, 2, 3, 4, 5, 6],
但这些数组向右移动(k倍)

现在是

[5,6,1,2,3,4], k = 2
但我不知道k。只有数组A

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


我认为这是一种二进制搜索,有人能帮我吗?

你说得对,它基本上是一种二进制搜索


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

如果您知道“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;
 }
int-low=0;
int高=数组长度-1;
while(低!=高)
{
int测试=(低+高)/2;
int testIndex=(test+k)%array.length;
if(数组[testIndex]<需要)
低=测试;
else if(需要阵列[testIndex]>
高=测试;
其他的
返回测试索引;
}
或者类似的。 testIndex变量被“k”偏移,但搜索索引(low、high和test)不知道这一点


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

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

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

(低、高)
一分为二。调用中点
mid
。比较
A[low]
A[mid]
A[mid]
A[high]
。如果只有一对排序正确,则调整端点:如果排序的是
low-mid
对,则分配
low=mid
,否则分配
high=mid
。如果两个间隔都是按顺序排列的,则答案是
A[高]


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

您可以在log(k)中执行此操作:)需要更多提示吗?是的,A是数组,我忘记了一些东西,我现在不知道。。。