如果我理解正確,您希望通過單詞和標籤匹配進行搜索,以獲取您將從中選擇「最佳」項目的候選人列表。你的問題表明你會喜歡在標籤匹配上的描述(單詞?)完全匹配。現在您想知道如何將訪問頻率和訪問時間考慮在內。
你並不需要爲此特定的數據結構。任何你可以排序的列表都可以正常工作。訣竅是提出一個比較功能,將這些事情考慮在內。比較功能的工作方式取決於您。
最簡單的比較功能將基於四項標準的簡單排序:字匹配,標籤的比賽,上次訪問,和頻率。它看起來像這樣:
// returns 1 if item1 > item2.
// returns -1 if item1 < item2
// returns 0 if item1 == item2
int compare(item1, item2)
{
if (item1.wordMatch && !item2.wordMatch) return 1;
if (item2.wordMatch && !item1.wordMatch) return -1;
// do the same with tag match
// then check last access
if (item1.lastAccess > item2.lastAccess) return 1;
if (item1.lastAccess < item2.lastAccess) return -1;
// and check access frequency
if (item1.freq > item2.freq) return 1;
if (item1.freq < item2.freq) return -1;
// everything's the same
return 0;
}
您可能反而想計算每個項目的「分數」。例如,單詞匹配值10分,標籤匹配值4分。因此,具有三個標記匹配項的項目的得分爲12,將其排名高於具有單個確切詞匹配項的項目。
你怎麼量化上次訪問時間和訪問頻率是由你。你會想要考慮這些事情的重要性。如果某些不經常訪問但最近30秒前訪問過的內容的排名高於或低於訪問頻率非常高但在最後一個小時內根本沒有訪問過的內容?只有你可以決定每個標準的重要性。
一旦您想出了計算每個項目得分的方法,您的比較功能就非常簡單。
無論你做什麼都需要進行一些調整。開始一種方法是這樣的:
10 points for an exact word match
4 points for a tag match
subtract .01 points for every minute since the last access time, up to a maximum of 8 points.
add .01 points for each prior access (i.e. frequency count), up to a maximum of 8 points.
我會說實話,以上只是胡亂猜測的東西,可能給出合理的結果。關鍵是想出點什麼來嘗試。然後做一些調整。也許試試其他的東西。但基本的想法是想出一個基於這四個標準來計算分數的方法。