高效的数据结构,用find&和整数到整数映射insert,no allocation和fixed upper bound

时间:2014-11-21 21:31:02

标签: c++ optimization dictionary data-structures hashtable

我正在寻找可能利用我的用例的特定标准的关联数据结构的输入。

目前我正在使用红/黑树来实现将键映射到值的字典(在我的情况下是整数到地址)。

在我的用例中,最大数量的元素是预先知道的(1024),我只会插入和搜索。搜索频率比插入频率高20倍。在过程结束时,我清除结构并再次重复。在使用过程中不能进行分配 - 只有初始预先分配。不幸的是,STL和最新版本的C ++不可用。

有什么见解?

1 个答案:

答案 0 :(得分:0)

我最终从示例here实现了一个简单的线性探测器HashTable。我使用MurmurHash3哈希函数,因为我的数据是随机的。

我通过以下方式修改了哈希表:

  1. 大小是模板参数。在内部,尺寸加倍。实施需要2种尺寸的功率,传统上调整为75%的占用。因为我知道我将填写哈希表,所以我先发制人地将其容量加倍以保持其足够稀疏。添加少量对象时效率可能较低,但一旦容量开始填满就会更有效。由于我无法调整大小,所以我选择将它的大小加倍。
  2. 我不允许存储值为零的键。这对我的应用程序没问题,它使代码简单。
  3. 删除所有调整大小和删除,替换为执行memset的单个清除操作。
  4. 我选择内联插入和查找功能,因为它们非常小。
  5. 它比我之前的红/黑树实现更快。我可能做的唯一改变是重新审视散列方案,看看源代码中是否有某些内容可以帮助制作更便宜的哈希。

    Billy ONeal建议,给定少量元素(1024),固定数组中的简单线性搜索会更快。我遵循了他的建议并实施了一个并排比较。在我的目标硬件(大约第一代iPhone)上,哈希表的性能比线性搜索的性能高出两比一。在较小的尺寸(256个元素)下,哈希表仍然优越。当然,这些值取决于硬件。在我的环境中,缓存行大小和内存访问速度非常糟糕。但是,寻找这个问题解决方案的其他人会很聪明地听从他的建议并尝试先对其进行分析。