C++ 関数のセットがあります。この関数を次のようなハッシュテーブルにマップしたい: unordered_map<function<ReturnType (Args...)> , SomethingElse>
、SomethingElse
この質問には関係ありません。
この一連の関数は以前から知られており、小規模 (たとえば 50 未満) であり、静的 (変更される予定はありません) です。
ルックアップのパフォーマンスが重要であるため ( で実行する必要がありますO(1)
)、完全なハッシュ関数を定義したいと考えています。
このシナリオに最適なハッシュ関数ジェネレーターはありますか?
完全なハッシュ関数ジェネレーター ( GPERFやCMPHなど) が存在することは知っていますが、それらを使用したことがないため、それらが私のケースに適しているかどうかはわかりません。
理由:
F
C++ で記述されたプログラムが与えられた場合、ユーザーがこのプログラムで定義された関数のサブセットを選択できるフレームワークを設計しようとしています。
f
に属するそれぞれについて、フレームワークはメモ化戦略をF
実装します: input で呼び出すと、何らかのデータ構造内に格納されます。したがって、 で AGAIN を呼び出す場合は、(時間のかかる) 計算を再度実行せずに戻ります。f
i
(i,o)
f
i
o
「すでに計算された結果」は、さまざまなユーザー間で (おそらくクラウド上で) 共有されるため、ユーザーu1
が既に計算を行っている場合o
、ユーザーは(以前と同じアノテーションを使用して) を呼び出してu2
計算時間を節約できます。f
i
明らかに、ペアのセットを保存する必要があります(f,inputs_sets)
(inputs_sets
前に説明した計算済みの結果セットはどこにありますか )。
したがって、このシナリオのコメントで提案されている「列挙トリック」を使用することは、すべてのユーザーがまったく同じ列挙を使用すると仮定すると、解決策になる可能性があります。これは問題になる可能性がありf1
ます。と(so )のみ、一方( so )のみをメモしたいですか? プログラムで定義されているすべての関数を列挙するのはやり過ぎの解決策かもしれませんが、これは大量のメモリの浪費を引き起こす可能性があります。f2
f3
u1
f1
f2
F={f1,f2}
u2
f3
F={f3}