在矩阵 A 中返回不同行数的最快方法是什么?

3
如果我有以下矩阵A:
A = {1,2,3}
    {7,9,1}
    {5,3,2}

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

我尝试编写一个名为 "rows" 的函数:

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

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

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


    }

}

然后,使用函数"check"尝试检查行是否不同:

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大吗?比如说9? - huseyin tugrul buyukisik
3个回答

6

你的算法完全错误。添加一个 break 后,当所有行都不同时它可以“工作”,但是如果有一些行相同时,它会出错。这个算法计算了存在另一行与它不同的行的行数。例如,如果你在以下数据上运行它:

1 2 3
4 5 6
1 2 3

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

算法应该按照以下步骤进行:

  • 假设所有行都不同(result = N)
  • 对于每一行i,查看它下面的行
  • 如果任何行j在行i下面等于row[i],则减少result并跳出内部循环
  • 在外部循环结束时,result包含您的答案。

是的,这是正确的方式,我之前认为只有第一个例子可以工作,谢谢! - Gabriele Salvatori

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

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


@osiris_0100 但这仍然只查看了前两行。你尝试过其他的例子吗? - Henrik
@Henrik 没错,如果我把第一行和第三行改成相等的话,它就不能工作 :| - Gabriele Salvatori
@tuğrulbüyükışık 这并没有真正解决问题。你应该删除这个答案。 - Henrik
因为它提供了编辑的“相同行”数目,以使之成为“不同行”。只是在最后一部分将“==”更改为“!=”。 - huseyin tugrul buyukisik

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接