从2个不同数组中查找第2,第3和第4最高数之和的算法

时间:2011-09-19 19:07:22

标签: arrays algorithm data-structures

我有2个非常大的整数数组,例如a []和b [] 我想计算[]和b []中第2,第3和第4最高数的总和。 即两个阵列中的第2,第3和第4最高数字......这只是3个数字的总和。 请为此问题建议一个好的算法。

考虑到算法的时间复杂性,请支持您的答案。

注意:编程语言不是问题。你可以假设C

这是我为这个问题开发的内容
算法:
1.考虑数组a []和b []。使用最大堆排序对[]和b []进行排序 2.这两个数组现在都以数组中的最大元素作为根节点进行排序。比较[]和b []的根节点,无论哪个更大,都从数组中删除该数字 3.重新定义具有max元素的数组 4.现在在变量中添加[]和b []的根节点。总和 5.重新合并[]和b []。
6.比较[]和b []的根节点,无论哪个更大,都将该数字加到总和上 7.打印varibale总和。

3 个答案:

答案 0 :(得分:5)

由于数组未排序,您必须至少遍历每个数字一次,因此您有一个O(n)的下限,其中n是数字的总数。我相信你可以在O(n)中做到。

时间:O(n)

空间:O(1)

int sum = 0;
int no1 = 0;
int no2 = 0;
int no3 = 0;
int no4 = 0;

int n =  a.size();

for ( int i = 0 ; i < n ; i++ )
{
   if ( a[i] >= no1 )
   {
      no4 = no3; no3 = no2; no2 = no1; no1 = a[i];
   }
   else if ( a[i] >= no2 )
   {
      no4 = no3; no3 = no2; no2 = a[i];
   }
   else if ( a[i] >= no3 )
   {
      no4 = no3; no3 = a[i];
   }
   else if ( a[i] > no4 )
   {
      no4 = a[i];
   } 
}

// Repeat the n =  a[].lenght; for ( int i = 0 ; i < n ; i++ ){...}
// but using the b[] array instead of the a[]

sum = no2 + no3 + no4;

排序效率低,因为你只需要3个数字,为​​什么额外的工作呢?

答案 1 :(得分:3)

python中的

O(n)

def biggestn(n, array):
   arr=[]
   for x in array:
      arr=insert(arr,x)[0:n] #use insertion sort to insert x into arr here for speed 
   return sum(arr)

对于两个数组biggestn(4, a++b)

答案 2 :(得分:1)

天真的解决方案(我不推荐)是首先排序,然后添加3个元素。假设一个合理的排序算法,这将是O(n*log(n))

一个更好的解决方案,可以推广到3个以上的元素,可以根据选择排序或快速排序实现多个selection algorithms中的一个。根据人们想要做的事情,这些可以接近线性时间。