c ++中的排列

时间:2010-02-09 11:47:24

标签: c++ permutation

我有一个带有一些值的数组,例如

A=[a,b,c];

在c ++中计算以下内容的最简单/最快的方法是什么:

int SUM;
SUM= a*b + a*c + b*a + b*c + c*a + c*b;

在这种情况下a*c != c*a

在实际情况中,我有不同大小的大数组,并将采用a,b和amp;的值。 c来自其他阵列。

/感谢提前

7 个答案:

答案 0 :(得分:4)

也许是这样(假设您实际上想要添加* b和b * a):

for (int i = 0; i < array_size - 1; ++i) {
    for (int j = i + 1; j < array_size; ++j) {
        sum += a[i] * a[j] * 2;
    }
}

甚至可能是一个更聪明的版本,会降低算法的复杂性(O(n)vs O(n * n)):

对于数组中的每个成员a [x],您想要加起来:

a[0] * a[x] + a[1] * a[x] + ... + a[n] * a[x] - a[x] * a[x]

分解出公因子后的

与:

相同

a[x] * (a[0] + a[1] + ... + a[n] - a[x])

现在所有数组项的总和只能计算一次:

int array_sum = std::accumulate(a, a + array_size, 0);  //#include <numeric> or use a simple loop
int sum = 0;
for (int i = 0; i < array_size; ++i) {
    sum += a[i] * (array_sum - a[i]);
}

答案 1 :(得分:2)

试用代码:

int sum = 0;

for(int i=0 ; i < size ; i++)
{
    int tmp = 0;
    for(int j=0 ; j < size ; j++)
    {
          if( i != j )
             tmp += a[i] * a[j];
    }
    sum += tmp;
}

答案 2 :(得分:2)

int SUM = 0;
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (i != j)  {
            SUM += A[i] * A[j];
        }
    }
}

但是,除非A具有可变大小,否则你可能会更好地编写这个公式:

int SUM = A[0] * A[1] + ...;

答案 3 :(得分:2)

除非我遗漏了什么,否则它应该像以下一样简单:

int sum = 0;

for(unsigned int i = 0; i < ARRAYSIZE; i++){
    for(unsigned int j = 0; j < ARRAYSIZE; j++){
        if(i != j){
            sum += A[i] * A[j];
        }
    }
}

答案 4 :(得分:1)

访问者的代码可以进一步简化:

const int array_sum( std::accumulate(a, a + array_size, 0) );
int sum( array_sum * array_sum );
for (int i = 0; i < array_size; ++i) {
    sum -= a[i] * a[i];
}

我猜一个临时的可以使用:

const int array_sum( std::accumulate(a, a + array_size, 0) );
int sum( array_sum * array_sum );
for (int i = 0; i < array_size; ++i) {
    const int tmp( a[i] );
    sum -= tmp * tmp;
}

当然,平方步骤也可以使用STL完成:

const int array_sum( std::accumulate(a, a + array_size, 0) );
std::transform( a, a + array_size, a, a, std::multiplies<int>() );  // store in a
const int sum( array_sum * array_sum - std::accumulate(a, a + array_size, 0) );

编辑:一次通过的简单循环:

int array_sum( 0 ), square_sum( 0 );
for( int i(0) ; i < array_size; ++i )
{
   int tmp(a[i]);
   array_sum += tmp;
   square_sum += tmp * tmp;
}
const int sum(  array_sum * array_sum - square_sum );

答案 5 :(得分:0)

这是一个交易9个ifs进行3次乘法和3次减法的解决方案。

int sum = 0;
for (int i = 0; i < 3; ++i)
{
    for (int j = 0; j < 3; ++j)
    {
        sum += A[i] * A[j];
    }
    sum -= A[i] * A[i];
}

答案 6 :(得分:0)

我会使用更短的循环:

int SUM = 0;
for (int i = 0; i < 2; i++) {
    for (int j = i+1; j < 3; j++) {
        SUM += A[i] * A[j];
        SUM += A[j] * A[i];
    }
}

然后这消除了对if(i!= j)检查的需要,并且做了更少的i ++和j ++以及i&lt; 2和j&lt; 3调用。