我有一个数据池(X 1 ..X N),我想为它找到相等值的组。比较非常昂贵,我无法将所有数据都保存在内存中。
我需要的结果是,例如:
X 1等于 X 3并且 X 6
X 2是唯一的
X 4等于 X 5
(行的顺序或行内的顺序无关紧要)。
如何通过成对比较来实现它?
这是我到目前为止所拥有的:
比较所有对 (X i , X k ) 与 i < k,并利用传递性:如果我已经找到 X 1 ==X 3和 X 1 ==X 6,我不需要比较 X 3和 X 6。
所以我可以使用以下数据结构:
map: index --> group
multimap: group --> indices
其中组是任意分配的(例如输出中的“行号”)。
对于i < k的一对 (X i , X k ):
如果 i 和 k 都已经分配了一个组,则跳过
如果它们比较相等:
- 如果我已经分配了一个组,请将 k 放入该组
- 否则,为 i 创建一个新组并将 k 放入其中
如果它们不相等:
- 如果我还没有分配组,请为我分配一个新组
- k 一样
如果我对项目的顺序很小心,那应该可以,但我想知道这是否是解决这个问题的最好/最不令人惊讶的方法,因为这个问题似乎有点普遍。
背景/更多信息:目的是对项目的存储进行重复数据删除。他们已经有一个哈希值,如果发生冲突,我们希望保证完全比较。相关数据的大小具有非常尖锐的长尾分布。
迭代算法(找到任何两个重复项,共享它们,重复直到没有重复项)可能更容易,但我们需要非修改诊断。代码库是 C++,适用于 STL / boost 容器或算法的东西会很好。
[编辑]关于散列:出于这个问题的目的,请假设一个无法替换的弱散列函数。
这是对现有数据进行一次性重复数据删除的必要条件,并且需要处理哈希冲突。最初的选择是“快速散列,并在碰撞时比较”,选择的散列有点弱,但改变它会破坏向后兼容性。即便如此,我还是用一个简单的陈述睡得更好:万一发生碰撞,您不会得到错误的数据。而不是写关于狼袭击的博客。