我有一组C++函数。我想将这些函数映射到哈希表中,类似于:
这组函数是预先知道的,很小(不到50个)且静态(不会改变)。
由于查找性能至关重要(应该在
存在适用于此场景的完美哈希函数生成器吗?
我知道存在完美哈希函数生成器(如GPERF或CMPH),但由于我从未使用过它们,我不知道它们是否适合我的情况。
原因:
我正在尝试设计一个框架,在这个框架中,给定用C++编写的程序,用户可以选择该程序中定义的函数子集
对于每个属于F的f,该框架实现了一种记忆化策略:当我们使用输入i调用f时,我们将(i,o)存储在某些数据结构中。因此,如果我们要再次使用i调用f,则会返回o,而不会再次执行(时间昂贵的)计算。
“已经计算出的结果”将在不同用户之间共享(可能在云端),因此如果用户u1已经计算出o,则用户u2将节省计算时间,使用与之前相同的注释使用i调用f。
显然,我们需要存储配对集合(f,inputs_sets)(其中inputs_sets是我之前提到的已计算出的结果集),这就是原始问题:我该如何做到这一点?
因此,在这种情况下,使用评论中提出的“枚举技巧”可能是一种解决方法,假设所有用户都使用完全相同的枚举,这可能是一个问题:假设我们的程序有
unordered_map<function<ReturnType (Args...)> , SomethingElse>
,其中SomethingElse
与此问题无关。这组函数是预先知道的,很小(不到50个)且静态(不会改变)。
由于查找性能至关重要(应该在
O(1)
中执行),我想定义一个完美的哈希函数。存在适用于此场景的完美哈希函数生成器吗?
我知道存在完美哈希函数生成器(如GPERF或CMPH),但由于我从未使用过它们,我不知道它们是否适合我的情况。
原因:
我正在尝试设计一个框架,在这个框架中,给定用C++编写的程序,用户可以选择该程序中定义的函数子集
F
。对于每个属于F的f,该框架实现了一种记忆化策略:当我们使用输入i调用f时,我们将(i,o)存储在某些数据结构中。因此,如果我们要再次使用i调用f,则会返回o,而不会再次执行(时间昂贵的)计算。
“已经计算出的结果”将在不同用户之间共享(可能在云端),因此如果用户u1已经计算出o,则用户u2将节省计算时间,使用与之前相同的注释使用i调用f。
显然,我们需要存储配对集合(f,inputs_sets)(其中inputs_sets是我之前提到的已计算出的结果集),这就是原始问题:我该如何做到这一点?
因此,在这种情况下,使用评论中提出的“枚举技巧”可能是一种解决方法,假设所有用户都使用完全相同的枚举,这可能是一个问题:假设我们的程序有
f1
,f2
,f3
,如果u1
只想记忆f1
和f2
(所以F={f1,f2}
),而u2
只想记忆f3
(所以F={f3}
)怎么办?一个过度解决方案可能是枚举程序中定义的所有函数,但这可能会浪费大量内存。
map.lookup(foo)
,其中foo
是实际函数名,还是有一些运行时函数指针传递为参数?如果是前者,你可能希望哈希也在编译时执行,这样它就不再是时间关键性任务了。 - CygnusX1std::function
没有实现(正如@Tony所建议的)。@hvd 我从未谈论过字符串。 - justHelloWorldstd::function
应该更安全、更高效。 - justHelloWorld