1

検索クエリのログを使用していくつかの調査を行おうとしています。私の最初の興味はトレンドを見つけることです。たとえば、冬になると口唇ヘルペスがよく起こります。冬になると、このようなタイプのクエリが増えると思います。

傾向を検出する方法:

  1. アプリオリなアルゴリズムか何かを使用して、頻繁なアイテム セットを取得します。
  2. 時間範囲内の各セットのカウント数 (1 時間、1 日など)
  3. これが ax + b の回帰である場合、線形回帰を使用して相対的な関数の変化を見つけます。次に、(a*(first_date)+b)/(a*(second_date)+b) を計算します。

だから私には問題があります:大量のデータセットで頻繁に設定されるアイテムを見つけるのは非常に困難です(私は何百万ものクエリを持っています)。アプリオリなアルゴリズムを実装しましたが、サポートが少なく非常に遅く動作しています (たとえば、200k のクエリで 2 回実行すると 1 日かかる場合があります)。

私の場合、最適なアルゴリズムは何ですか? 多分私は別の方法で私の仕事を解決できますか?

4

1 に答える 1

0

これは、コレクション全体ではなく、要求された時間枠内の文字列のみをカウントするように絞り込む考えです。
クエリを並べ替えられた拡張可能なデータ構造に保存します。ここではスキップ リストが適していると思います。
スキップ リスト内のクエリの順序は、時間の昇順になります。
注: スキップ リストに新しいクエリを追加するのは簡単です。既存のすべてのクエリよりも常に "大きい" (後に発生する) ため、常に追加します。

ここで、時間枠を検索する必要がある場合 - すべてのクエリを反復する必要はありませんが、時間枠の最初と最後の要素を見つけることはスキップで高速に実行できるため、関連する部分だけを反復する必要があります。リスト。

効率を改善するために、bi-map を使用して各文字列に一意の ID を付与し、ID のみを保存します。ID からヒストグラムを作成する方が (計算上) 簡単で、元の文字列に対してヒストグラムを作成するよりも簡単です。最も頻繁に使用される ID を見つけたら、それらがどの文字列を参照しているかをマップから推測できます。

于 2012-06-08T08:25:52.820 に答える