比较两个数组之和的快速算法?

时间:2013-11-21 09:01:27

标签: c++ c algorithm sorting

假设我有2个整数数组,它们可能长度不同,任何索引上的值都是有效整数(min~max)。如:

int data1[] = {1227210749, 382745290, 567552295, 1910060611,
           577735884, 75518037, 742485551, 1202127013, 
           386030509, 308032134};

int data2[] = {1729472635, 1258098863, 259427472, 1664987257, 
           994376913, 1581883691, 1728724734, 2034013490};

我怎样才能快速比较它们,知道哪一个有更大的数额?

int compare(int a[], int len_a, int b[], int len_b)
{
    // compares if the sum of data1 is bigger than sum of data2
} 

4 个答案:

答案 0 :(得分:1)

直观地(在我的情况下这是非常弱的,我猜,我不是算法专家)这种感觉就好像如果不看一次每个数字就不可能,并且只是计算和。这是因为整数是有符号的,当添加任何元素时,数组的总和可以变为0(或负数),因此你必须查看它们的所有元素。

所以,尝试实现这样的函数:

int int_array_sum(const int *array, size_t num_elements);

然后只需在两个数组中的每个数组上调用它,然后进行比较。

编辑:正如Tristan's answer中指出的那样,添加潜在的大整数时存在溢出的风险。如果这是一个问题(这确实是应用程序特定的,也许溢出结果是“有更大的总和”的一部分),你可以切换到更宽的整数类型,或者与double一起使用。

答案 1 :(得分:1)

显而易见的方法是获取两个数组的总和,看看哪个更大。像这样:

int compare(int a[], int len_a, int b[], int len_b)
{
    return (std::accumulate(a, a+len_a, 0) - std::accumulate(b, b+len_b, 0);
} 

然而,这引入了整数溢出的可能性。将accumulate的最后一个参数更改为0LL0.0可以避免这种情况。

答案 2 :(得分:0)

int compare( int a[], int len_a, int b[], int len_b )
{
    long long sum_a = std::accumulate( a, a + len_a, 0ll );
    long long sum_b = std::accumulate( b, b + len_b, 0ll );

    return ( sum_a < sum_b ? -1 : ( sum_a == sum_b ? 0 : 1 ) );
}

答案 3 :(得分:0)

int compare(int a[], int len_a, int b[], int len_b)
{
  double sum1=0;
double sum2=0;

for(int i=0;i<len_a;i++)
sum1=sum1+a[i];

for(int i=0;i<len_b;i++)
sum2=sum2+b[i];

if( sum1>sum2)
return 1;
else 
return 0;

}