C++ C++;:删除矩阵中的重复数字
我想从一个矩阵中删除数字,该矩阵表示格式为“x y z”的坐标。一个例子:C++ C++;:删除矩阵中的重复数字,c++,coordinates,C++,Coordinates,我想从一个矩阵中删除数字,该矩阵表示格式为“x y z”的坐标。一个例子: 1.211 1.647 1.041 2.144 2.684 1.548 1.657 2.245 1.021 1.657 0.984 2.347 2.154 0.347 2.472 1.211 1.647 1.041 在本例中,坐标1和6是相同的(x、y和z是相同的),我想删除它们,但我不想删除只有一个值等于坐标3和4的情况(对于x坐标) 这些值在一个文本文件中,我希望打印坐标而不在另一个文件中,甚至在同一个文
1.211 1.647 1.041
2.144 2.684 1.548
1.657 2.245 1.021
1.657 0.984 2.347
2.154 0.347 2.472
1.211 1.647 1.041
在本例中,坐标1和6是相同的(x、y和z是相同的),我想删除它们,但我不想删除只有一个值等于坐标3和4的情况(对于x坐标)
这些值在一个文本文件中,我希望打印坐标而不在另一个文件中,甚至在同一个文件中重复。一个非常简单的解决方案是将每一行视为一个字符串,并使用一组字符串。在逐行遍历文件时,检查集合中是否存在当前行,如果不存在,则插入并打印该行。 复杂性:O(nlogn),需要额外的内存:在最坏的情况下几乎与输入文件相同 使用与上一个解决方案相同的复杂性和最坏情况下的内存消耗,您可以在内存中加载文件,按行排序,然后在打印时轻松跳过重复项。如果允许您对文件进行重新排序,也可以在文件内部执行同样的操作,这样您只需要很少的额外内存,但速度要慢得多
如果内存和存储是一个问题(我假设您无法复制该文件),那么可以使用一种简单的方法,在打印之前将当前行与之前的所有行进行比较,复杂度为O(n^2),但没有额外的内存。但是,这是一个相当糟糕的解决方案,因为您必须从文件中读取多次,这与主内存相比可能非常慢。如果您想保留顺序,如何执行此操作
struct Coord
{
double x,y,z;
int pos;
bool deleted;
};
pos是行号,deleted设置为falsefor(int i=1;i<count;i++)
{
if(fabs(arr[i].x-arr[i-1].x)<0.001)
if(fabs(arr[i].y-arr[i-1].y)<0.001)
if(fabs(arr[i].z-arr[i-1].z)<0.001)
arr[i].deleted=true;
}
<代码> >(int i=1;i C++),可以使用STL的电源来解决这个问题。使用并存储三个坐标x,y和z作为键在地图中。映射到密钥的值将存储该密钥的计数。< /p>
Key_type = pair<pair<float,float>,float>
mapped_type = int
Key\u type=pair
映射类型=int
创建一个具有上述给定键类型和映射类型的映射m,并将所有行插入映射中,更新每行的计数。假设n是总行数
for(i = 0; i < n; i++) {
m[make_pair(make_pair(x,y),z)]++;
}
(i=0;i{
m[make_pair(make_pair(x,y,z)]++;
}
每次插入都需要O(logn),您必须插入n次。因此,总体时间复杂度将为O(nlogn).现在,再次循环遍历矩阵的所有行,如果该行的映射_值为1,则该行是唯一的。请小心浮点数和相等性测试…除了@Jubobs comment之外,我建议删除在L^2范数中距该点给定距离内的点。允许您操纵坐标的顺序吗nates,例如,通过对它们进行排序?它们是否保证始终是10以下的三个数字,小数点后有三位数字?我给Erik和Jubobs一个+1。作为输出,您希望只有前五行?您只想删除重复的坐标?