c - 字典查找——为什么要对固定数据使用哈希表?

标签 c dictionary hashtable lookup

在一些(可怕的第 3 方)代码中,我们正在使用一个字典查找例程,该例程扫描填充有“'name-string' -> function_pointer”对的表,基本上是复制- 从 K&R 第 6.6 节粘贴。

我不得不对此进行扩展,在阅读代码时,似乎包含了遍历源数据结构并创建哈希表的哈希例程,这让我感到震惊。

鉴于源数据结构在编译时是固定的(因此在运行时永远不会添加或更改),在其中使用哈希例程是否有意义?

我只是有这样的时刻之一,我无法判断作者是否在做一些我错过的聪明的事情,或者是懒惰而不思考(到目前为止,后者的情况比不是)。

是否有理由为永远不会更改的数据创建哈希表?

最佳答案

Is there a reason to have a hash table for data that will never change?

可能哈希表代码已经存在并且工作正常,而程序员只是想完成工作(例如,从字符串中查找函数指针)。如果此函数不是性能关键,我认为没有理由更改它。

如果要改,那我建议看一下完美哈希表。

这些是哈希表,哈希函数是从一组固定的预定义键创建的。它们的优点:它们通常比树数据结构更快。

GPERF 就是一个可以做到这一点的工具。它从一组字符串创建 C 代码:https://www.gnu.org/software/gperf/

关于c - 字典查找——为什么要对固定数据使用哈希表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21410009/

相关文章:

c++ - 如何在 C++ 中创建哈希表?

c - "struct foo*"和 "foo*"之间的区别,其中 foo 是一个结构?

无法计算 C 中插槽的回合数

python - 无法从 django 中的 GET 字典获取所有值

python - 属性错误: 'list' object has no attribute 'item' Ask

Python 2.7 程序(带搁置字典)为特定的键和值组合返回致命的 "dbrunrecoveryerror",但不是其他

c - 带有代码块的段错误 11

c - 暴力破解幻方时出现堆栈溢出错误。有什么可能的解决办法吗?

java - 实现固定大小的 HashMap

arrays - 使用键数组遍历嵌套的 Ruby 哈希