6

我有一组 C++ 函数。我想将这个函数映射到一个哈希表中,比如:unordered_map<function<ReturnType (Args...)> , SomethingElse>,其中SomethingElse与这个问题无关。

这组函数是以前已知的,小(比如说少于 50 个)和静态(不会改变)。

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

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

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

原因:

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

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

“已经计算的结果”将在不同的用户之间共享(可能在云端),所以如果用户u1已经计算了o,用户u2将节省计算时间调用(使用fi之前相同的注释)。

显然,我们需要存储对的集合(f,inputs_sets)inputs_sets我之前谈到的已经计算好的结果集在哪里),这是最初的问题:我该怎么做

因此,在这种情况下使用评论中提出的“枚举技巧”可能是一个解决方案,假设所有用户都使用完全相同的枚举,这可能是一个问题:假设我们的程序有f1, f2f3如果u1想要记忆怎么办只有f1f2(所以F={f1,f2}),而u2只想记住f3(所以F={f3})?一个矫枉过正的解决方案可能是枚举程序中定义的所有函数,但这可能会产生巨大的内存浪费。

4

1 回答 1

5

好的,也许不是您想听到的,但请考虑一下:由于您谈论的函数少于 50 个,因此哈希查找应该可以忽略不计,即使发生冲突。您是否真正分析并看到查找至关重要?

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

我将更进一步说,我认为对于少于 50 个元素的平面地图(良好的 ol' vector)将具有相似的性能(或者由于缓存局部性甚至可能更好)。但同样,测量是必需的。

于 2016-04-18T08:46:10.163 回答