bam*_*yak 1 c++ string hash perfect-hash
我有4000个字符串,我想用这些字符串创建一个完美的哈希表.字符串是事先知道的,所以我的第一个想法是使用一系列if
语句:
if (name=="aaa")
return 1;
else if (name=="bbb")
return 2;
.
.
.
// 4000th `if' statement
Run Code Online (Sandbox Code Playgroud)
但是,这将是非常低效的.有没有更好的办法?
迟到总比不到好,我相信这现在终于回答了OP的问题:
只需使用https://github.com/serge-sans-paille/frozen —— C++ 的不可变容器的编译时 (constexpr) 库(在底层使用“完美哈希”)。
在我的测试中,它与著名的 GNU 的gperf完美哈希 C 代码生成器配合使用。
根据您的伪代码术语:
#include <frozen/unordered_map.h>
#include <frozen/string.h>
constexpr frozen::unordered_map<frozen::string, int, 2> olaf = {
{"aaa", 1},
{"bbb", 2},
.
.
.
// 4000th element
};
return olaf.at(name);
Run Code Online (Sandbox Code Playgroud)
将在O(1)时间内响应,而不是 OP 的O(n) - O(n) 假设编译器不会优化你的 if 链,它可能会这样做)
由于这个问题仍然没有答案,并且我即将向我的 HFT 平台添加相同的功能,因此我将分享我的C++ 完美哈希算法清单。找到一个开放、灵活且无错误的实现比我想象的要困难,所以我分享了我还没有放弃的实现: