这是返回矩阵a中不同行数的最快方法

Which is the fastest way to return the number of different rows in a matrix A?

本文关键字:方法 返回      更新时间:2023-10-16

如果我有以下矩阵A:

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

如何轻松地返回矩阵中不同行的数量?在这种情况下,输出必须为:"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;
}

但是回错号码了,有什么建议吗?

您的算法完全错误。添加break后,当所有行不同时,它"工作",但当某些行相同时,它会中断。它计算行数,这样就存在与它不同的另一行。例如,如果你在上运行它

1 2 3
4 5 6
1 2 3

你会得到一个答案3,但你应该得到一个2

算法应该是这样的:

  • 假设所有行都是不同的(result = N
  • 对于每一行i,查看其下方的行
  • 如果行i下方的任何一行j等于row[i],则递减result并中断内部循环
  • 在外循环的末尾,result包含您的答案

实现一个"CompareRows"函子作为集合的谓词。那么,你所需要做的就是——

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();

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

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++;
}

即使是单个元素的不等式也会使行不相等,对吧?