バックグラウンド
整数のシーケンスの大規模なコレクション (〜数千) があります。各シーケンスには次のプロパティがあります。
- 長さは 12 です。
- シーケンス要素の順序は重要ではありません。
- 同じ順序で要素が 2 回出現することはありません。
- すべての要素が約 300 未満です。
プロパティ 2. と 3. は、シーケンスが実際には setであることを暗示していますが、アクセス速度を最大化するために C 配列として格納されていることに注意してください。
新しいシーケンスがコレクションに既に存在するかどうかを確認するための適切な C++ アルゴリズムを探しています。そうでない場合は、新しいシーケンスがコレクションに追加されます。ハッシュ テーブルを使用することを考えました (ただし、C++11 コンストラクトや Boost などの外部ライブラリは使用できないことに注意してください)。シーケンスをハッシュし、値を a に保存することstd::set
もオプションです。衝突が十分にまれである場合、衝突は無視できるからです。他の提案も大歓迎です。
質問
可換ハッシュ関数、つまりシーケンス内の要素の順序に依存しない関数が必要です。最初にシーケンスを正規の形式 (並べ替えなど) に縮小し、次に標準のハッシュ関数を使用することを考えました (以下の参考文献を参照)。並べ替え。私が知る限り、以下で参照されている関数はどれも可換ではありません。理想的には、ハッシュ関数は、要素が繰り返されないという事実も利用する必要があります。スピードは非常に重要です。
助言がありますか?