我想收到object
s的hit
參數,顯示其頻率。並且能夠擁有最頻繁的頂端hit
,object
s。 Unordered_map
適合第一部分,以object
爲關鍵字,hit
爲值。最受歡迎的物體的結構
unordered_map<object,int>
它能使搜索快object
和增加其hit
。但是如何排序呢? priority_queue
使得擁有最受歡迎的對象。但是如何增加對象的命中?
我想收到object
s的hit
參數,顯示其頻率。並且能夠擁有最頻繁的頂端hit
,object
s。 Unordered_map
適合第一部分,以object
爲關鍵字,hit
爲值。最受歡迎的物體的結構
unordered_map<object,int>
它能使搜索快object
和增加其hit
。但是如何排序呢? priority_queue
使得擁有最受歡迎的對象。但是如何增加對象的命中?
我建議你看看splay tree,它保持對象的方式,使得最近和最頻繁訪問的對象更接近頂端。這依賴於幾個euristics,因此會給你一個近似的完美解決方案。
對於確切的解決方案,最好實施您自己的binary heap並實施操作優先級。在理論上,這同樣用於支持priority_queue
,但沒有cahnge優先級操作,但可以在不影響數據結構操作的複雜性的情況下完成。
謝謝,但我不知道該怎麼辦。二進制堆很好,有對象排序,但增量我需要搜索關鍵。如何實現快速搜索?沒有任何方法可以在C++/boost中使用實現的結構嗎? – Yasser 2013-02-10 14:14:28
我設法通過在插入對象時跟蹤對象的排序列表的按鍵數來解決它。所以總是有最多N首熱門歌曲的名單。有300萬分的對象和我想有前20
下面是我使用的結構: key_hit
跟蹤點擊率(按鍵,一個字符串,我指的是對象):
unordered_map<string, int> key_hit;
兩個陣列: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_hit
中搜索key
,找到它的命中和增量(這足夠快)。hit<hits[N]
,忽略它。idx=key_idx[key]
,(如果沒有找到,將其添加到結構和刪除現有之一。它太長寫所有細節)H=h[idx]++
h[idx-1]<H
更大。如果是,則在key_idx
,hits
,keys
中交換idx和idx-1。我試圖讓它變快。但我不知道它有多快。
你指的是一種特定的語言嗎? – 2013-02-09 13:46:55
是的,代碼是在C++中。 – Yasser 2013-02-10 14:08:39