Arrays 从2个不同数组中查找第二、第三和第四个最高数之和的算法

Arrays 从2个不同数组中查找第二、第三和第四个最高数之和的算法,arrays,algorithm,data-structures,Arrays,Algorithm,Data Structures,我有两个非常大的整数数组,比如a[]和b[] 我想计算a[]和b[]中第二、第三和第四个最高数字的总和。 i、 e.两个阵列中的第二、第三和第四个最高数字…即只有3个数字的总和。 请为这个问题提出一个好的算法 考虑到算法的时间复杂性,请支持您的答案 注意:编程语言不是一个问题。你可以假设C 下面是我为这个问题开发的内容 算法: 1.考虑数组A[]和B[]。使用最大堆排序对a[]和b[]进行排序。 2.这两个数组现在都以max元素作为两个数组中的根节点进行排序。比较a[]和b[]的根节点,以较大者

我有两个非常大的整数数组,比如a[]和b[] 我想计算a[]和b[]中第二、第三和第四个最高数字的总和。 i、 e.两个阵列中的第二、第三和第四个最高数字…即只有3个数字的总和。 请为这个问题提出一个好的算法

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

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

下面是我为这个问题开发的内容
算法:
1.考虑数组A[]和B[]。使用最大堆排序对a[]和b[]进行排序。
2.这两个数组现在都以max元素作为两个数组中的根节点进行排序。比较a[]和b[]的根节点,以较大者为准,从数组中删除该数字。
3.重新调整包含max元素的数组。
4.现在将a[]和b[]中的根节点添加到变量sum中。
5.重新安置a[]和b[]。
6.比较a[]和b[]的根节点,以较大者为准,将该数字相加。
7.打印变量和

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)

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


推广到3个以上元素的更好解决方案是实现基于选择的排序或快速排序。取决于你想做什么,这些可以接近线性时间。

由于数组没有排序,你必须至少对每个数字进行一次检查,因此你有一个O(n)的下限,其中n是数字的总数。我相信你能在O(n)里做到

时间:O(n)

空格:O(1)

int和=0;
int no1=0;
int no2=0;
int no3=0;
int no4=0;
int n=a.size();
对于(int i=0;i=no1)
{
no4=no3;no3=no2;no2=no1;no1=a[i];
}
如果(a[i]>=no2)为else
{
no4=no3;no3=no2;no2=a[i];
}
如果(a[i]>=no3)为else
{
no4=no3;no3=a[i];
}
如果(a[i]>no4),则为else
{
no4=a[i];
} 
}
//重复n=a[]长度;对于(int i=0;i

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

你对这个问题的想法是什么?这看起来像是典型的“给我一个答案,回答我的作业”问题。你可以创建另一个数组c[],按降序排序,然后返回c[1]+c[2]+c[3]。我不认为你能获得比这更高的效率。你不需要排序来获得最高的4个numbers@TomalakGeretkal和Downvorters:这个问题是否因为在你看来像是家庭作业或其他原因而获得了同样多的反对票?如果是因为它看起来像家庭作业,我应该注意到,这类问题不是什么深奥的问题,只是家庭作业类型的问题。我以前需要在专业环境中执行非常类似的任务。当你说
O(n)
时,所说的
n
是指数组的长度还是实际使用的
n
?从技术上讲,它取决于两者,但在这里应该可以忽略不计,因为OP只指定了3个元素。是的,我指的是数组的长度。它应该是O(mlogn),其中n是我在这里使用的n,m是数组的长度。您需要查看是否应该保留它,因此需要排序(例如,将它与其他数字进行比较)。这相当于@Lucians answer,但可以推广到任何整数。插入排序只有
O(logn)
插入时间,对于n=4,应将其视为
O(1)
。正如我现在所做的那样,可以很容易地将其替换为insert。这取决于您是否要概括为3个以上的选择。如果您只想从中选择3个数字,则无需对数组进行排序。@woliveirajr我不是建议您进行排序;我提到过那种方法是有效的,这是个坏主意。不管怎么说,如果你在3个以上进行概括,那么你需要一个选择算法。这在你需要3个选择的特定情况下有效,但不能概括得很好。此外,如果选择的数量变得不重要,复杂性可能不是n的线性。@Luchian Grigore您没有考虑有2个数组的事实……这只适用于1个数组,只是要加上他有两个数组,我之所以投反对票,是因为我认为这不是一个好的答案,因为存在一个更好、更简单、更明显的答案。你投反对票的原因是我的不能一概而论。但这不是重点,因为对于手头的问题,它比你的解决方案好。对一个比你更好的解决方案进行否决有点苛刻,你说呢?@Luchian选择算法,我提到的可以在O(n+k log k)中完成,其中k个东西被选择。对于k=3,这可以忽略不计。这个问题要求的正是一个选择算法,所以我认为否决一个提到选择算法的答案是很苛刻的。
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;