6

私はいくつかの金融取引の仕事をしています。私は株式記号のセットを持っていますが、それらは非常に明確なパターンを持っています.2つの文字ABで構成され、AC AD現在の月は4桁の数字1503です: いくつかの例は次のとおりです。15041505

AB1504
AB1505
AC1504
AC1505
AD1504
AD1505
....

これらの文字列は非常にうまく設計されており、パターン化されているため、各文字列を一意の整数にマップ (ハッシュ) して、高速アクセス用の配列インデックスとして整数を使用できるようにしたいと考えています。std::unordered_mapまたは他のハッシュマップは十分に高速ではありません. 一般的なハッシュ マップは 100 ナノ秒のレイテンシ レベルであり、配列のインデックス作成は常に 100 ナノ秒未満であることを示すテストがあります。私の理想的なケースは、たとえば、AB1504maps to integer 1AB1505 maps to 2.... であり、内部に配列を作成して、これらのシンボルに関連する情報にはるかに高速にアクセスできます。私の目標を達成できるいくつかのハッシュアルゴリズムまたはその他の方法を見つけようとしていますが、見つけることができませんでした。この問題について何か提案はありますか?

4

4 に答える 4

1

文字列を可変基数表現と見なし、それを整数に変換できます。例えば:

AC1504:
A (range: A-Z)
C (range: A-Z)
15 (range: 0-99)
04 (range: 1-12)

パーツを抽出します。ハッシュ関数は次のようになります

int part1, part2, part3, part4;
...
part1 -= 'A';
part2 -= 'A';
part4 -= 1;
return (((part1 * 26 + part2) * 100 + part3) * 12 + part4;
于 2015-05-17T16:31:47.887 に答える
0

文字列を混合基数として解析すると、最初に基数 26 の 2 桁、次に基数 10 の 4 桁になるため、各文字列の一意のインデックスがすぐに得られます。唯一の問題は、まばらに配置された配列を取得する可能性がある場合です。

上記の問題を最小限に抑えるために、インデックスを計算するときにいつでも数字を並べ替えることができます。

数値は実際には月であるため、最初のエントリから月数を計算し、それにプレフィックスの 2 桁の base-26 数値を掛けます。

現時点で私のタブレットに入力して、これから何らかの意味を理解していただければ幸いです。:D

于 2015-05-17T16:29:52.820 に答える
0

次の値は、32 ビット整数で表現できる必要があります。

XYnnnn => (26 * X + Y) * 10000 + nnnn

ここでXYは [0, 26)nの範囲の値を取り、 と は [0, 10) の範囲の値を取ります。

合計 6,760,000 の表現可能な値があるため、少量のデータ (カウントやポインターなど) のみを関連付ける場合は、各シンボルが 1 つの配列エントリを占有するフラットな配列を作成できます。

于 2015-05-17T16:30:13.330 に答える