オブジェクトを挿入するときに、オブジェクトのソートされたリストをヒット番号で追跡することで、なんとか解決しました。そのため、最多 N 件のトップ ヒットのリストが常に存在します。3,000,000 個のオブジェクトがあり、上位 20 個を取得したいと考えています。
私が使用した構造は次のとおりです:
key_hit
ヒットを追跡するため (キー、文字列、つまりオブジェクト):
unordered_map<string, int> key_hit;
2 つの配列 :トップ ヒットとそれに対応するキー (オブジェクト) が含まれますhits[N]
。keys[N]
idx, hits, keys
0, 212, x
1, 200, y
...
N, 12, z
key_idx
キーとそれに対応するインデックスを保持する別のマップ:
unordered_map<string,int> key_idx;
アルゴリズム (詳細なし):
key
が入力されます。
- を検索
key
しkey_hit
、そのヒットとインクリメントを見つけます (これは十分に高速です)。
- の場合
hit<hits[N]
は、無視してください。
- else,
idx=key_idx[key]
, (見つからない場合は構造に追加し、既存のものを削除します。すべての詳細を記述するには長すぎます)
H=h[idx]++
- 上記のエントリよりも大きいかどうかを確認し
h[idx-1]<H
ます。key_idx
はいの場合、 、hits
、の idx と idx-1 を入れ替えkeys
ます。
早くしてみました。でもどこまで速いかわかりません。