这是返回矩阵a中不同行数的最快方法
Which is the fastest way to return the number of different rows in a matrix A?
如果我有以下矩阵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++;
}
即使是单个元素的不等式也会使行不相等,对吧?
相关文章:
- 从父类方法返回子类对象
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 让bool方法返回其他整数
- 不能将方法返回的值用于另一个方法
- 从私有成员变量的成员方法返回unique_ptr
- 我的模板类方法返回错误类型?
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 我无法使用C++指针指向类方法返回的 std::vector
- 对象引用中的字段以不同的方法返回不同的值
- 类方法返回指向具有模板的类成员的指针
- 如何将字符串从 C++/CLI 方法返回到调用它的非托管C++
- 从工厂方法返回的ComPtr的引用计数增加两次
- 如何使用 SFINAE 从 end() 方法返回 (const_) 迭代器
- Arduino trim() 和 replace() 方法返回从 'void' 到非标量类型'String'请求的转换
- 从类方法返回 "const char*" 作为 std::string&
- 如何使用 "get" 方法返回类的私有 std::unique_ptr 成员
- 可能从单个方法返回不同类型的对象
- qml 未知方法返回类型:ArchiveFile*,即使调用了 qmlRegisterUncreatableType
- 如何从方法返回静态常量 int std::array?
- 当从其他方法返回 vector 时,C++无法访问矢量元素