【发布时间】:2012-02-12 19:04:27
【问题描述】:
我正在处理一些二进制数据,这些数据存储在任意长的无符号整数数组中。我发现我有一些重复的数据,并且希望在短期内忽略重复数据,并从长远来看消除导致它们的任何错误。
我正在考虑在存储之前将每个数据集插入到地图中,但前提是在开始时在地图中找不到它。我最初的想法是拥有一个字符串映射并使用 memcpy 作为锤子将整数强制转换为字符数组,然后将其复制到字符串中并存储字符串。这失败了,因为我的大量数据在相关数据的前面包含多个字节的0(又名NULL),所以大部分非常真实的数据都被丢弃了。
我的下一次尝试计划是std::map<std::vector<unsigned char>,int>,但我意识到我不知道地图插入功能是否会起作用。
这是可行的,即使是不明智的,还是有更好的方法来解决这个问题?
编辑
所以有人说我没有说清楚我在做什么,所以这里有一个更好的描述。
我正在生成一个最小生成树,因为我有许多包含我正在使用的实际端节点的树。目标是选择长度最短且覆盖所有末端节点的树,其中所选择的树最多彼此共享一个节点并且全部连接。我的方法基于二叉决策树,但进行了一些更改以希望实现更大的并行性。
我没有采用二叉树方法,而是选择为每个数据集从无符号整数中创建一个位向量,其中位位置的 1 表示包含相应的树。
例如,如果只有树 0 包含在 5 棵树的数据集中,我会开始
00001
从这里我可以生成:
00011
00101
01001
10001
然后可以并行处理其中的每一个,因为它们都不相互依赖。我对所有单棵树(00010、00100 等)执行此操作,并且应该,我没有花时间正式证明它,能够生成范围 (0,2^n) 内的所有值一次而且只有一次。
我开始注意到许多数据集的完成时间比我想象的要长得多,并启用了一个调试输出来查看所有生成的结果,然后一个快速的 Perl 脚本确认我有多个进程产生相同的输出。从那以后,我一直在尝试解决重复项的来源,但收效甚微,我希望这能很好地让我验证生成的结果,而无需等待 3 天。计算。
【问题讨论】:
-
是什么阻止你尝试这个?
-
如果您只需要独特性,您可以考虑
std::set。