8


1

あなたが誰かにEメールを送ったときに埋められるオートコンプリートリストがあります。それはリストが本当に大きくなるまであなたが欲しいものにたどり着くためにより多くのアドレスをタイプする必要があります。オートコンプリートの目的に反して

オートコンプリートの結果がアルファベット順ではなく、最近の連絡または最も頻繁に連絡を取った機能によってソートされるように、ロジックを追加する必要があると私は考えていました。

私が知りたいのは、この種の検索に適した既知のアルゴリズムがあるかどうか、または誰かが何か提案がある場合です。

私はちょうどポイントシステムの事を考えていました、同じ日が5ポイント、最後の3日間が4ポイント、先週が3ポイント、先月が2ポイント、そして最後の6ヶ月間が1ポイントです。 そして、ほとんどの場合、25は5ポイント、15は4、10は3、5は2、2は1です。 これらの数字以外の本当の論理は、正しいと「感じる」ことはありません。

恣意的に選んだ数字以外に誰かが何か入力がありますか? あなたが彼らが私のものより優れていると思う理由を与えることができるならば、他の数も歓迎します

編集:これは主に最近のこと(言葉を作るための賛成論)が頻度と同じくらい重要であることが多いビジネス環境であろう。 また、ある時点を過ぎると、80回会話した人と30回言った人の間には、それほど大きな違いはありません。

7 Answer


3


自己組織化リストを見てください。

早くて汚い表情:

前方への移動ヒューリスティック:リンクされたリスト。ノードが選択されるたびにそれがリストの前方へ移動されるようにします。

Frequency Heuristic:ノードが選択されるたびにその頻度カウントがインクリメントされ、その後ノードがリストの先頭に向かってバブルされるようにリンクリスト。そのため、最も頻繁にアクセスされるのはリストの先頭です。

フロントインプリメンテーションへの移行があなたのニーズに最も適しているように見えます。

編集:アドレスが選択されたら、その頻度に1を加えて、同じ重みを持つノードのグループの前に移動します(または、クーリンググループの場合は(weight div x))。 私はあなたの提案された実装の本当の問題であるとみなします、それはそれがそれぞれの、そしてすべてのアイテムの重みを計算することを必要とするという点で。 自己組織化リストは良い方法ですが、アルゴリズムはあなたが望むことをするために少し微調整を必要とします。

詳細編集:エイジングとは、時間の経過とともに重みが減少することを意味します。つまり、アドレスが使用されるたびにそのことを知っておく必要があります。 つまり、リストを作成するときには、電子メールの履歴全体を利用できるようにする必要があります。

問題は、実際にアクセスされたときにだけノード上で(検索以外の)計算を実行したいということです。これにより、統計的に優れたパフォーマンスが得られます。


2


この種のことはあなたがタイプしているサイトが何であるかを示唆するときにFirefoxによって行われることに似ているようです。

残念ながら、私は正確にはFirefoxがそれをどのように行うのかわかりません、ポイントシステムも同様に良いようです、多分あなたはあなたのポイントのバランスをとる必要があるでしょう:)

私は似たようなものに行きたいと思います:

NoM =メール数

(今日からXに送られたNoM)1/2 *(先週中にXに送られたNoM)/ 7 1/3 *(先月中にXに送られたNoM)/ 30

先月書いたことのない連絡先(変更される可能性があります)は0ポイントになります。 あなたは合計で送信されたNoMのためにそれらを分類し始めることができます(それが連絡先リストにあるので:)。 これらは、ポイント> 0の_after_個の連絡先が表示されます。

それは、単なるアイデアです。とにかく、最も連絡を取った連絡先と単にメールを送った連絡先に異なる重要性を与えることです。


2


あなたが夢中になりたい場合は、いくつかの方法のいずれかで最もアクティブなEメールをマークします。

  • 最後のアクセス

  • 使用頻度

  • 販売待ちの連絡先

  • ダイレクトボス

次に、リストの一番上にアクティブなメールを表示します。 ユーザーがどの「グループ」を最も使用しているかに注意してください。 十分なデータが収集されたら、そのソート戦略に排他的に切り替えます。

大変な作業ですが、ちょっと楽しいです…​


1


各アドレスに送信されたEメールの数を数えることもできます。 その後:

EmailCount DESC、LastName、FirstNameの順に並べ替え

そのようにして、あなたが最も頻繁に使われるアドレスは、たとえそれらが数日以内に使われなかったとしても、最初に来る。


1


私は最近の使用、使用の頻度、そして潜在的に他の要因(ローカルドメインの連絡先を好むか)のためのポイントを備えたポイントベースのシステムのアイデアが好きです。

私はこのようないくつかのシステムで作業しましたが、「最近使用された」も「最も一般的に使用された」もうまく動作しません。 誤って入力したことがある場合は、「最新」の表示が大変です。 あるいは、昨年あなたが誰かとたくさん連絡を取ったが、今あなたの仕事が変わったならば、「最もよく使われる」は時間が経ってもそれほど進化しません。

使用したい一連の測定値が得られたら、さまざまな重みをテストするための対話型アプリケーションを作成して、いくつかのサンプル・データに対してどの重みが最良の結果をもたらすかを確認できます。


0


http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.52.2668[この論文]は、最近の使用頻度の最も低いポリシーと使用頻度の最も低いポリシーを特別なケースとして含む、単一パラメーターファミリーのキャッシュ追い出しポリシーについて説明しています。 。

パラメータlambdaは0から1の範囲です。 lambdaが0のときはLFUキャッシュのように動作し、lambdaが1のときはLRUキャッシュのように動作します。 0から1の間では、最新情報と頻度情報の両方を自然な方法で組み合わせます。


0


答えが選ばれたにもかかわらず、私は検討とフィードバックのために私のアプローチを提出したいです。

使用するたびにカウンタをインクリメントすることで頻度を計算しますが、10のように1より大きい値で計算します(2番目の点に精度を追加するため)。

定期的に(24時間など)すべてのカウンターに何人かの斬新な人(たとえば0.9人)を掛けて、最新性を説明します。

それぞれの用途:

更新 `addresslist` SET` favor` = `favor` 10 WHERE` address` = '[email protected]'

各間隔

UPDATE `addresslist` SET` favor` = FLOOR( `favor` * 0.9)

このようにして、頻度と新しさの両方を1つのフィールドにまとめ、詳細な履歴を取って\ {先日、先週、先月}を導き出し、数学を(ほとんど)整数に保つ必要性を避けます。

もちろん、増加量と減少量は好みに合わせて調整する必要があります。