函数

时间:2016-04-18 04:28:15

标签: c++ hash perfect-hash

我有一套C ++函数。我想在哈希表中映射这些函数,例如:unordered_map<function<ReturnType (Args...)> , SomethingElse>,其中SomethingElse与此问题无关。

这套功能以前是已知的,小的(比方说小于50)和静态(不会改变)。

由于查找性能至关重要(应该在O(1)中执行),我想定义一个完美的散列函数。

这种情况是否存在完美的哈希函数生成器?

我知道存在完美的散列函数生成器(如GPERFCMPH),但由于我从未使用它们,我不知道它们是否适合我的情况。 / p>

原因:

我正在尝试设计一个框架,在给定用C ++编写的程序的情况下,用户可以选择此程序中定义的函数的子集F

对于属于f的每个F,该框架实施了memoization策略:当我们使用输入f调用i时,我们会存储{{1}在一些数据结构中。因此,如果我们要使用(i,o)调用AGAIN f,我们将返回i而不再执行(时间昂贵的)计算。

“已计算的结果”将在不同用户之间共享(可能在云端),因此如果用户o已计算u1,则用户o将节省计算时间u2 f {使用与之前相同的注释。

显然,我们需要存储一组对i(其中(f,inputs_sets)是我之前谈过的已计算结果集),这是原始问题:我该怎么做它

因此,使用本场景中的评论中提出的“枚举技巧”可能是一种解决方案,假设所有用户都使用完全相同的枚举,这可能是一个问题:假设我们的计划有inputs_setsf1f2如果f3只想记住u1f1(所以f2)会怎么样? ,F={f1,f2}只想记住u2(所以f3)?一个过度的解决方案可能是枚举程序中定义的所有函数,但这可能会产生巨大的内存浪费。

1 个答案:

答案 0 :(得分:5)

好吧,也许不是你想听的但是考虑一下:既然你谈到了一些小于50的函数,那么哈希查找应该可以忽略不计,即使是碰撞也是如此。您是否真的进行过分析并发现查找很重要?

所以我的建议是将精力集中在其他方面,很可能一个完美的哈希函数不会在你的情况下带来任何改进的性能。

我将更进一步说,我认为对于少于50个元素的平面地图(好的&#39; vector)将具有相似的性能(或者由于缓存局部性可能更好)。但同样需要进行测量。