我在C中实现了一个像这样的逻辑(对于解释器):
if <input string> in <list of pre-defined constant strings>
do_a_predefined_action()
else
do_something_else(<input string>)
我的第一个想法是哈希表,但是如果在编译时知道常量字符串,那么在运行时手动初始化哈希表似乎有点浪费。
其他想法我已经包括静态初始化具有已知哈希(ick ...)的哈希表结构,然后像普通一样简单地使用它。另一个是一个庞大的嵌套switch
块,可以提供O(log n)
查找时间(不像哈希表那么快)。
实现预定义字符串集的查找的最佳方法是什么?我还没有看到什么解决方案?优雅优于速度。
答案 0 :(得分:3)
我不会太担心在程序启动时初始化哈希表的成本。这种过早优化的臭味。那说,......
由于您确实知道所有字符串,因此您可以考虑为这些字符串构建完美哈希。您可以使用一些工具来尝试许多可能的散列算法,并选择最适合数据的算法。这将导致静态初始化路由。虽然您已评论过#34; ick&#34;关于这个策略。如果速度问题非常重要,我建议你重新考虑一下。
我实际上在我的postscript解释器的上下文中考虑了这个问题,它在启动时初始化systemdict
哈希表。另一个需要考虑的方法是将表缓存在一个文件中。用于初始化的伪代码将是这样的:
check for cached file
if file exists,
load it.
if file does not exist,
initialize table manually.
save table to file.
答案 1 :(得分:2)
您可以使用gperf或Bob Jenkin's Minimal Perfect Hash代码生成一个(可能是最小的)Perfect Hash Function,它会将字符串映射到值,您可以稍后switch