C ++比较向量,更快的方式
Posted
技术标签:
【中文标题】C ++比较向量,更快的方式【英文标题】:C++ to compare vectors, faster way 【发布时间】:2014-03-03 22:12:03 【问题描述】:是否有更快的方法从向量列表中找到特定向量?我做矢量比较,这需要永远做,而且我有数百万条记录。
我正在使用 openmp
这就是我目前所拥有的
#pragma omp parallel for
for(int i=0;i<crossed.size();i++)
#pragma omp flush (exit)
if(!exit && (crossed[i]== vectors))
loop = i;
found = true;
exit = true;
#pragma omp flush (exit)
if(found == false)
crossed.push_back(vectors);
cross.push_back(0);
else
cross[loop] = cross[loop]+1;
【问题讨论】:
你在解决什么问题?也许有一种数据结构或算法比向量向量更适合。也许您可以对数据进行排序,然后进行二分搜索? 如果您必须像这样比较多个向量,您可以考虑存储每个向量的哈希信息并比较哈希。您仍然需要比较两个具有相同哈希值的向量,但您可以立即剔除不同的哈希值 - 这会大大提高速度。 我试图弄清楚一个图是否同构。为了做到这一点,我必须将向量中的每个点乘以 alpha,然后检查我是否可以找到重复一次。然后我计算它们并与其他图进行比较以找到非同构图。如果你们懂数学,那么找出更快的算法会很有帮助 【参考方案1】:是的,如果您愿意稍微改变一下您的数据结构。
加快比较速度的一种简单方法是使用校验和。我的意思是,从字面上检查总和。在构建向量时,请保持每个向量的总和(只要您与数据类型一致,溢出无关紧要)。然后,不是比较整个向量,而是只比较总和 - 如果总和匹配,则只有比较向量。
更进一步,您可以通过校验和对向量进行排序...这可能仅在您有很多向量时才值得,因为它将校验和搜索从 n 减少到 log(n)
【讨论】:
+1 / 散列会比总和更好。而且,不需要“按校验和对向量进行排序”——只需对单个校验和/向量 ID 索引进行排序。 每次将一个元素添加到向量中时,都必须重新计算标准哈希值......如果有数百万个元素,我认为您会浪费很多时间。 对所有元素散列与进行异或的向量散列是该场景的合理方法...散列方面区分总和较弱的情况,例如10, -10 vs 0, 0, 1, 9 vs 10,而总和有助于例如3, 3, 3 与 3。具有 O(1) cpu & mem 方式来生成一个对处理插入/擦除的顺序敏感的值,例如1, 3 vs 3, 1,或 1, 3, 5 vs 5, 1, 3 - 也可能在相邻元素之间差异的哈希中进行异或(例如,对于上述情况 2 vs -2, 2, 2 vs -4, 2) - 虽然容易取消:-(.以上是关于C ++比较向量,更快的方式的主要内容,如果未能解决你的问题,请参考以下文章