在首先减少然后增加的数组中搜索

时间:2014-11-05 10:29:24

标签: arrays algorithm sorting

我有一个最初按降序排列的数组。 现在我遍历我的数组中的随机索引,在那之后我翻转列表,以便列表的其余部分变为升序。

现在给出一个数字,并且需要找到它的索引。 什么是找到给定数字索引的有效算法?

例如:

初始列表: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顺序列出。

4 个答案:

答案 0 :(得分:4)

这是this question and answer的倒数,其中序列向上然后再向下。在你的,它下降,然后备份。

关键是首先找到最小元素的索引。完成后,您可以在左侧(递减)部分进行二进制搜索,在右侧(递增)部分进行二进制搜索。由于二进制搜索可以在日志时间内完成,因此您可以在日志时间内完成整个操作,前提是您可以在日志时间中找到最小元素。

幸运的是,你也可以通过二分搜索来做到这一点。对于您考虑的数组中的任何位置,如果以下元素更大,那么您处于右手(增加)部分;如果它更小,那么你就在左手(递减)部分。这足以让您执行二进制搜索以找到最小值。

答案 1 :(得分:0)

在您的情况下,让阵列的长度为 n 13 在你的情况下,随机指数(翻转点) m 4
在你的案例21

中,要搜索的数字为 x

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