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是数组,我忘记了一些东西,我现在不知道。。。