C - 比较整数的数组(集合) - 散列或尝试

时间:2014-06-25 04:45:05

标签: c arrays hash trie

我有一个程序将生成整数数组。我需要能够有效地检查之前是否已生成新生成的数组。以下是我对这些数组性质的了解:

  • 整数介于0到200,000左右
  • 单个数组中的整数数是任意的,但我认为小于200
  • 整数的排序无关紧要。重复也无关紧要。所以数组5 5 7 19应该被认为与7 5 19 7 7相同(基本上它们应该被视为集合而不是数组)
  • 生成的数组数量将达到数十万,因此我需要这样做才能有效

我正在考虑使用一些trie数据结构。为此,我需要对数组进行排序,然后遍历trie,忽略连续的重复项。

但是,尝试通常用于字符,你知道所有节点都有例如26个子节点,因此子节点可以很容易地存储并在26元素数组中查找。在我的情况下,我的整数可能高达200,000 - 显然,一系列的孩子是不可行的。是否有可能为这样的整数创建一个有效的trie?

我的另一个想法是使用哈希表。这将需要一个不关心元素排序的散列函数,并且对于重复是幂等的。是否存在这种散列函数?如果没有,我将再次需要对数组进行排序并将其提供给常规哈希函数。当然还要处理碰撞。

最后,哪一种更有效?或者可能是其他一些我没想过的数据结构?

1 个答案:

答案 0 :(得分:0)

一个好的解决方案是散列列表。理想情况下,数组应保持排序。您可以创建一个标准的累积散列函数,如果已经排序,它将跳过列表中的重复项。我觉得更好的解决方案是分别跟踪重复项。如果您可以控制进入检查的数据结构并且必须跟踪列表的数量,则可以将列表存储为整数与其数量的映射。根据列表的大小,使用简单的排序数组执行此操作可能会更快,其中每个元素都是具有整数和数量的结构,因为迭代比二进制搜索树(例如集合)更快。这增加了构建列表的时间,但如果检查更加关注,则可能是一个不错的选择。在这个庄园中排列东西可以让你找到一个列表在时间上是唯一的,与整数数组中唯一元素的数量成线性关系。