【发布时间】:2018-09-26 22:31:45
【问题描述】:
我在两个不同的集合中有成对的数据、键和值。我需要比较两个集合的值,并创建一个包含相等值的键对的集合。
例如,使用以下数据集:
Vals
Key Col1 Col2
1 4 5
2 6 9
4 8 4
6 10 10
常见的值是 4 和 10。所以他的想法是用这些对获得一个新集合,在这种情况下是 (key col1, key col2) {{1, 4}, {6, 6}}
我需要一种最快的方法来做到这一点,每个集合可以有 100k 的数据,并且使用 for 循环进行迭代太慢,我尝试使用向量。
两个集合不一定有相同的键(如 map),数据可能不是 int (我使用二进制数据,通常键是 int(unsinged long)。
这是我的示例代码(非常慢的代码):
struct p {
unsigned long int p1;
unsigned long int p2;
};
vector<int> table1 = tables1(n); /* bigger n -> more samples */
vector<int> table2 = tables2(n); /* n = 10000 generate 150k per table */
vector<p> common;
for (unsigned long int i = 0;i < table1.size(); i++) {
for (unsigned long int j = 0; j < table2.size(); j++) {
if (table1[i] == table2[j]) {common.push_back ({i, j};}
}
}
有没有办法用地图、集合或其他东西更快地做到这一点? (我从 C++ 开始)
【问题讨论】:
-
创建两张地图。 A 从键映射到 col1,B 从键映射到 col2。然后只比较 A[key] == B[key] 如果 key 存在于两者中
-
你的意思是用map而不是vector做同样的事情?,在那种情况下我认为不会更快,这个算法真的很慢......
-
应该是 O(n lgn) 而不是 O(n^2)
-
测试了一下,还是很慢...,比较地图或者矢量图.....
-
那你做得不对。正确的算法将同时遍历两个映射,而不是遍历第一个映射,然后每次都检查第二个映射。这是错误的。您需要同时遍历两个地图。如果你还有问题,你应该向你的老师寻求帮助,也就是给你这个作业的那个人。这就是教师的报酬,帮助学生完成家庭作业。
标签: c++ algorithm key containers matching