我有两个元素元素。我怎样才能找出那些带有重复的东西并将它们放入每组中并进行最少量的比较?最好是在C ++中。
例如
数组1 = {1,1,2,2,3,4,5,5,1,1,2,2,4,5,8 ......}
数组2 = {2,1,1,2,2,4,7,7,8,8,2,2,4,4,8 ......}。
首先,我想集群数据。
数组1 = {组1 = {1,1,1,1,...},组2 = {2,2,2,2,...},组3 = {3,...},组4 = { 4,4,...},第5组= {5,5,5,...},第6组= {8,...}}。
数组2 = {组1 = {1,1,...},组2 = {2,2,2,2,2 ...},组3 = {4,4,4,...},组4 = {7,7,...},第5组= {8,8,8 ...}}。
其次,我想要数据匹配。
数组1的组1 =数组2的组1
阵列1的组2 = =阵列2的组2
阵列1的第4组= =阵列2的第3组
阵列1的第6组= =阵列2的第5组
如何在C ++中解决这个问题?请给我你的精彩提示。
另外,我会详细解释我的问题。我有两个数据集,以立体图像计算。阵列1是左摄像机的数据,阵列2是右摄像机的数据。我的最终目标是匹配具有相同值的组,例如array1的第6组和第2组的第5组。数据排序不是我的考虑因素。我只想在两个数组中的组之间找到相同的值。 (你会建议我先使用数据排序来减少比较次数吗?)。
为了解决这个问题,我应该使用'std :: map'进行数据聚类,并比较那些N!次数(N:阵列1或2中的组号)?这是我能做的最佳方式吗?
我想得到你的建议。感谢您分享我的问题。
我的方法是在C ++ STL中使用map容器。
制作2个地图容器(Array1_map,Array2_map)。
将每个数组的值作为键插入到映射容器中,并将每个数组的索引作为值插入到映射中。 (两个数组的两个数据按顺序保存在地图中,不会重复。)
使用map容器的find()成员函数进行数据匹配。
数据匹配后,我能够得到每个数组的索引,这些索引具有匹配的键(对应的键)。
感谢您提供所有有用的答案!
答案 0 :(得分:1)
我能看到的最简单方法是构造每个数组的直方图。然后您可以将这些直方图进行比较。应该是O(NlogN)将每个数组转换为直方图,其中N是数组大小,然后O(N)来比较直方图,当N
是数组中唯一元素的数量(地图的大小) )。那看起来像是
int arr1[] = {...};
int arr2[] = {...};
std::map<int, int> arr1_histogram, arr2_histogram;
for (auto e : arr1)
arr1_histogram[e]++;
for (auto e : arr2)
arr2_histogram[e]++;
if (arr1_histogram == arr2_histogram)
// true case
else
// false case