我有一套C ++函数。我想在哈希表中映射这些函数,例如:unordered_map<function<ReturnType (Args...)> , SomethingElse>
,其中SomethingElse
与此问题无关。
这套功能以前是已知的,小的(比方说小于50)和静态(不会改变)。
由于查找性能至关重要(应该在O(1)
中执行),我想定义一个完美的散列函数。
这种情况是否存在完美的哈希函数生成器?
我知道存在完美的散列函数生成器(如GPERF或CMPH),但由于我从未使用它们,我不知道它们是否适合我的情况。 / p>
原因:
我正在尝试设计一个框架,在给定用C ++编写的程序的情况下,用户可以选择此程序中定义的函数的子集F
。
对于属于f
的每个F
,该框架实施了memoization策略:当我们使用输入f
调用i
时,我们会存储{{1}在一些数据结构中。因此,如果我们要使用(i,o)
调用AGAIN f
,我们将返回i
而不再执行(时间昂贵的)计算。
“已计算的结果”将在不同用户之间共享(可能在云端),因此如果用户o
已计算u1
,则用户o
将节省计算时间u2
f
{使用与之前相同的注释。
显然,我们需要存储一组对i
(其中(f,inputs_sets)
是我之前谈过的已计算结果集),这是原始问题:我该怎么做它?
因此,使用本场景中的评论中提出的“枚举技巧”可能是一种解决方案,假设所有用户都使用完全相同的枚举,这可能是一个问题:假设我们的计划有inputs_sets
,f1
,f2
如果f3
只想记住u1
和f1
(所以f2
)会怎么样? ,F={f1,f2}
只想记住u2
(所以f3
)?一个过度的解决方案可能是枚举程序中定义的所有函数,但这可能会产生巨大的内存浪费。
答案 0 :(得分:5)
好吧,也许不是你想听的但是考虑一下:既然你谈到了一些小于50的函数,那么哈希查找应该可以忽略不计,即使是碰撞也是如此。您是否真的进行过分析并发现查找很重要?
所以我的建议是将精力集中在其他方面,很可能一个完美的哈希函数不会在你的情况下带来任何改进的性能。
我将更进一步说,我认为对于少于50个元素的平面地图(好的&#39; vector
)将具有相似的性能(或者由于缓存局部性可能更好)。但同样需要进行测量。