哪个是返回矩阵A中不同行数的最快方法?

时间:2012-07-18 10:26:41

标签: c++ matrix

如果我有以下矩阵A:

A = {1,2,3}
    {7,9,1}
    {5,3,2}

我如何轻松返回Matrix中不同行的数量?在这种情况下,输出必须是:“3”

我尝试创建一个“”函数:

void rows (int a[N][N], int row[N], int x){

    for (int i=0;i<N;i++){

        row[i]=a[x][i];


    }

}

然后,使用“检查”功能,我试图检查行是否不同:

int check ( int a[N][N])
{

    int row1[N];
    int row2[N];

    int j=0;

    rows(a,row1,j);
    rows(a,row2,j+1); 


    int count = 0;


    for ( int i=0; i<N; i++){
        for ( int j=0; j<N; j++){


            if ( row1[i] != row2[j]){

                count++;

            }

        }
    }


    return count;

}

但是返回错误的号码,有什么建议吗?

3 个答案:

答案 0 :(得分:6)

你的算法完全错了。添加break时,当所有行不同时,它“起作用”,但当某些行相同时它会中断。它计算行数,以便存在与其不同的另一行。例如,如果您在

上运行它
1 2 3
4 5 6
1 2 3

您将得到答案3,但您应该获得2

算法应该是这样的:

  • 假设所有行都是不同的(result = N
  • 对于每一行i,请查看其下方的行
  • 如果行j下方的任何行i等于row[i],则递减result并突破内循环
  • 在外圈结束时,result包含您的答案。

答案 1 :(得分:1)

尝试将不等式变量添加到:

int count = 0;


for ( int i=0; i<N; i++){
inequalty=0;
    for ( int j=0; j<N; j++){


        if ( row1[i] != row2[j]){

            inequality=1;
            break; //this makes even faster

        }

    }
 if(inequality!=0)count++;
}

即使是单个元素的不等式也会使行不等?

答案 2 :(得分:1)

实现'CompareRows'仿函数作为set的谓词。然后,您需要做的就是 -

typedef vector<int> Rows;
set<Rows, CompareRows> UniqRows;

for ( int i = 0 ; i < N ; ++i )
  UniqRows.insert(Rows(a[i], a[i] + N));

UniqRows.size();