【发布时间】:2011-09-18 01:32:49
【问题描述】:
我有一个生成大约 600 万个唯一数组的 C 函数。这些数组每个总是有 17 个元素,每个元素都是从 0 到 16 的整数。我还有一个稍微修改过的函数版本,它也将生成大约 600 万个相同类型的唯一数组。我的问题是第二个产生的结果比第一个少大约 45,000 个,我想看看这些结果是什么。
所以我的方法是简单地存储第二个函数的所有结果(计算器告诉我这不应该超过 400 mb,这可以保存在内存中)然后查找第一个函数的结果,打印出来那些不存在的。
假设通用方法有意义(如果没有,请说明),我正在寻找的是一个合适的数据结构(最好在 C 中具有良好的实现),它可以容纳大约 600 万个独特的排列
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
(或对其进行一些转换),然后对它们执行快速的成员资格测试。正如标题所说,我确实怀疑哪些数据结构可以完成这项工作,但我不确定尝试或哈希图是最好的选择。
这是一种用于检测另一个算法中的缺陷的算法,而不是在生产中使用的东西。我有兴趣以一种可以编码并以人类术语相对快速地返回结果的方式来执行此操作,不一定要减少毫秒,因此存在可以完成大部分工作的易于理解的库绝对是一个加分。
【问题讨论】:
-
所以基本上你需要做
set(A) - set(B)。set实现和compare例程可以完成这项工作。 -
既然它只是一个辅助工具,非生产,它必须用C编写吗?其他语言也包含数据结构。
-
原来的算法是 C 的,所以如果我不必将数据发送出去就可以完成工作。
-
很公平。排序数组是最好的。适合
long long中的每个值的优化可以加快速度,并且“对数组进行排序并通过两者进行线性传递”可能如果它提高缓存性能 - 缓存性能将较大的数组排序可能比将这么多二进制搜索放入较小的数组时的缓存性能要好。
标签: c data-structures hashmap trie