Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 制作一个完美的散列(所有连续的桶都满了)、gperf还是其他选择?_C_Hashtable_Gnu_Lookup Tables - Fatal编程技术网

C 制作一个完美的散列(所有连续的桶都满了)、gperf还是其他选择?

C 制作一个完美的散列(所有连续的桶都满了)、gperf还是其他选择?,c,hashtable,gnu,lookup-tables,C,Hashtable,Gnu,Lookup Tables,假设我想构建一个完美的哈希表,用于查找预定义键为12个月的数组,因此我希望 hash("January")==0 hash("December")==11 我运行了我的月份名称,得到了一个很好的哈希函数,但它似乎给出了16个桶(或者说范围是16) 查看生成的gperf代码,它的哈希函数代码从256大小的表中简单返回len加char值查找。不知怎的,在我的脑海里,我想象了一个看起来很奇特的功能……:) 如果我只想要12个桶(也就是说我不想跳过未使用的桶),该怎么办?对于这样的小集合,这真的不重要

假设我想构建一个完美的哈希表,用于查找预定义键为12个月的数组,因此我希望

hash("January")==0
hash("December")==11
我运行了我的月份名称,得到了一个很好的哈希函数,但它似乎给出了16个桶(或者说范围是16)

查看生成的gperf代码,它的哈希函数代码从256大小的表中简单返回len加char值查找。不知怎的,在我的脑海里,我想象了一个看起来很奇特的功能……:)

如果我只想要12个桶(也就是说我不想跳过未使用的桶),该怎么办?对于这样的小集合,这真的不重要,但是当我有1000个预定义的键,并且希望一行中正好有1000个bucket时


你能找到一个确定的方法来做到这一点吗?

我所知道的gperf的唯一替代方法是cmph:但是,正如Jerome在评论中所说,拥有16个存储桶为你提供了一些速度优势


当我第一次研究最小完美hasihing时,我发现了非常有趣的阅读资料,但我抵制住了自己编写这些解决方案之一的诱惑。我知道我最终会得到比gperf或cmph更差的解决方案,或者,即使假设该解决方案具有可比性,我也将不得不花费大量时间在它上面。

我对这个问题的答案很感兴趣&通过搜索
gperf
找到它。我尝试了gperf,但它在一个大的输入文件上速度非常慢,因此似乎不适合。我试过cmph,但不满意。它需要构建一个文件,然后在运行时将其加载到C程序中。此外,该程序非常脆弱(在任何类型的错误输入上都会因“分段错误”而崩溃),因此我不信任它。进一步的谷歌搜索让我找到了,并继续找到了。我下载了mph,发现它很不错。它有一个可选程序来生成一个名为“emitc”的C文件,并像以前一样使用它

 mph < systemdictionaryfile | emitc > output.c
mphoutput.c

几乎立即工作(几秒钟,一本大约200000字的字典),并创建了一个可以正常工作的C文件,编译起来没有问题。我的测试也表明它是有效的。不过,我还没有测试过哈希算法的性能。

这种哈希算法的目标是拥有一个真正快速的哈希函数,因此具有2的功能(12个月16个桶,1000个预定义键1024个桶)。你为什么要避免这样的漏洞?你同意因为这个要求而进行性能测试吗?谢谢!这就解释了。为了澄清,我问的原因是我想用散列替换strcmp的长“if-then-if”链。如果加速效果显著的话,几个空桶可能是一个很小的代价。空桶的一个稍微令人讨厌的问题是,它意味着必须为每个关键点手动拾取桶(也就是说,我不确定四月的关键点是指向桶3、4、5、6还是7);我本能的怀疑是,你正在解决一个你没有解决的问题,或者你有一个性能问题,并且攻击了错误的原因。当然,我可能是错的,我很想知道实际的问题是什么。作为提供替代方案和附加信息的答案,我被接受。至于自己编写一个解决方案,这总是一条通向疯狂的诱人之路。我尝试了mph 1.2。使用emitc-l时,生成的哈希函数有一个长度参数。这很好,但代码似乎被破坏了。for循环仍在搜索终止的
\0
。我相信代码生成器坏了。这仍然是一个非常整洁的工具!我觉得很遗憾,它似乎没有得到维护。
 mph < systemdictionaryfile | emitc > output.c