加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 查找要删除的项目

发布时间:2020-12-16 05:05:38 所属栏目:百科 来源:网络整理
导读:我有一个数据池(X1..XN),我想找到相同值的组.比较非常昂贵,我无法将所有数据保存在内存中. 我需要的结果是,例如: X 1 equals X 3 and X 6 X 2 is unique X 4 equals X 5 (行的顺序或行内的顺序无关紧要). 如何通过成对比较实现这一点? 这是我到目前为止所
我有一个数据池(X1..XN),我想找到相同值的组.比较非常昂贵,我无法将所有数据保存在内存中.

我需要的结果是,例如:

X1 equals X3 and X6
X2 is unique
X4 equals X5

(行的顺序或行内的顺序无关紧要).

如何通过成对比较实现这一点?

这是我到目前为止所拥有的:

比较所有对(Xi,Xk)与i <1. k,并利用传递性:如果我已经找到X1 == X3和X1 == X6,我不需要比较X3和X6. 所以我可以使用以下数据结构:

map: index --> group
  multimap: group --> indices

其中组被任意分配(例如输出中的“行号”).

对于一对(Xi,Xk),其中i <1. k:
>如果i和k已经分配了一个组,请跳过
>如果他们比较平等:

>如果我已经分配了一个组,则将k放入该组
>否则,为i创建一个新组并将k放入其中

>如果他们不相等:

>如果我还没有分配组,请为i分配一个新组
> k相同

如果我对项目的顺序很谨慎,这应该有用,但我想知道这是否是解决这个问题的最佳/最不令人惊讶的方法,因为这个问题似乎有点普遍.

背景/更多信息:目的是重复删除项目的存储.他们已经有一个哈希,如果发生碰撞,我们希望保证完整的比较.所讨论数据的大小具有非常尖锐的长尾分布.

迭代算法(找到任意两个重复项,共享它们,重复直到没有重复项)可能会更容易,但我们需要非修改诊断.
代码库是C,适用于STL / boost容器或算法的东西会很好.

[编辑]关于哈希:为了这个问题的目的,请假设一个无法替换的弱哈希函数.

这需要对现有数据进行一次性重复数据删除,并且需要处理散列冲突.最初的选择是“快速哈希,并在碰撞时进行比较”,所选择的哈希结果有点弱,但改变它会破坏向后兼容性.即便如此,我还是会用一个简单的陈述睡得更好:如果发生碰撞,你就不会得到错误的数据.而不是关于wolf attacks的博客.

解决方法

这是另一种可能更简单的数据结构,用于利用传递性.制作一个需要进行比较的队列.例如,在4项的情况下,它将是[(1,2),(1,3),4),(2,(3,4)] .还有一个阵列用于比较你已经完成的.在每次比较之前,检查之前是否已完成比较,并且每次找到匹配项时,请检查队列并将匹配项目索引替换为其较低的索引等效项.

例如,假设我们弹出(1,比较,它们不相等,推(1,2)到已经访问过的数组并继续.接下来,弹出(1,3)并发现它们是相等的.此时,通过队列并用1替换所有3.队列将是[(1,1),4)],依此类推.当我们到达(2,1)时,它已被访问过,所以我们跳过它,和(1,4)相同.

但我同意以前的答案.由于比较计算成本很高,您可能希望首先计算快速,可靠的哈希表,然后才将此方法应用于冲突.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读