我有一个最初按降序排列的数组。 现在我遍历我的数组中的随机索引,在那之后我翻转列表,以便列表的其余部分变为升序。
现在给出一个数字,并且需要找到它的索引。 什么是找到给定数字索引的有效算法?
例如:
初始列表:50 48 21 15 9 8 7 5 3 2 1
翻到第9位: 50 48 21 15 1 2 3 5 7 8 9
提供的号码: 21
索引21 :?
编辑1:值得注意的是,desc顺序中列表的最小值元素将始终大于列表的最大值元素,因为它最初是升序的一部分。以desc顺序列出。
答案 0 :(得分:4)
这是this question and answer的倒数,其中序列向上然后再向下。在你的,它下降,然后备份。
关键是首先找到最小元素的索引。完成后,您可以在左侧(递减)部分进行二进制搜索,在右侧(递增)部分进行二进制搜索。由于二进制搜索可以在日志时间内完成,因此您可以在日志时间内完成整个操作,前提是您可以在日志时间中找到最小元素。
幸运的是,你也可以通过二分搜索来做到这一点。对于您考虑的数组中的任何位置,如果以下元素更大,那么您处于右手(增加)部分;如果它更小,那么你就在左手(递减)部分。这足以让您执行二进制搜索以找到最小值。
答案 1 :(得分:0)
在您的情况下,让阵列的长度为 n 13
在你的情况下,随机指数(翻转点) m 4
在你的案例21
x> = 索引值 m-1 //在您的情况下21> = 15正确
然后使用二进制搜索从索引 0 到 m-1 的数组部分
的否则强>
使用二进制搜索从索引 m 到 n-1
注意:翻转后,您将使数组从0下降到翻转点,从翻转点一半上升到数组末尾。
答案 2 :(得分:0)
让 i = 0, n 为长度, m = n / 2 , x 为要搜索的数字和数组是 myArray []
IF x> Array[n-1]
{
LABEL 1
IF myArray[m] < myArray[m+1]
{
Here we are in the ascendind order and x is not here since x> myArray[n-1]
Set n=m and m=n/2 and GOTO LABEL 1.
}
ELSE
{
Means we are in the descending order.
IF x>myArray[m]
{
Means x is b/n myArray[0] and myArray[m] therefore, perform binary search in
}
ELSE
{
Means x is b/n myArray[m] and myArray[n-1]
therefore, set i=m, m=(n-i)/2 and GOTO LABEL 1.
}
}
ELSE
LABEL 2
{
IF myArray[m] < myArray[m+1]
{
IF
{
x < myArray[m] set n=m, m=n/2 and GOTO label 2
}
ELSE
{
perform binary search b/n myArray[m] and myArray[n-1]
}
}
ELSE
{
set i=m, m=n-i/2 and GOTO LABEL 2
}
}
答案 3 :(得分:-2)
你去..
var source = Enumerable.Range(1, 100).Cast<int?>().ToArray();
var destination = new int?[source.Length];
var s = new Stopwatch();
s.Start();
for (int i = 0; i < 1000000;i++)
{
Array.Copy(source, 1, destination, 0, source.Length - 1);
}
s.Stop();
Console.WriteLine(s.Elapsed);
以下是每个解决方案100万次迭代的性能结果(8 Core Intel Xeon E5450 @ 3.00GHz)
100 elements 10000 elements
For Loop 0.390s 31.839s
Array.Copy() 0.177s 12.496s
Aaron 1 3.789s 84.082s
Array.ConstrainedCopy() 0.197s 17.658s