オブジェクトを挿入するときに、オブジェクトのソートされたリストをヒット番号で追跡することで、なんとか解決しました。そのため、最多 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ます。
早くしてみました。でもどこまで速いかわかりません。