2013-02-09 91 views
0

我想收到object s的hit參數,顯示其頻率。並且能夠擁有最頻繁的頂端hit,objects。 Unordered_map適合第一部分,以object爲關鍵字,hit爲值。最受歡迎的物體的結構

unordered_map<object,int> 

它能使搜索快object和增加其hit。但是如何排序呢? priority_queue使得擁有最受歡迎的對象。但是如何增加對象的命中?

+0

你指的是一種特定的語言嗎? – 2013-02-09 13:46:55

+0

是的,代碼是在C++中。 – Yasser 2013-02-10 14:08:39

回答

0

我建議你看看splay tree,它保持對象的方式,使得最近和最頻繁訪問的對象更接近頂端。這依賴於幾個euristics,因此會給你一個近似的完美解決方案。

對於確切的解決方案,最好實施您自己的binary heap並實施操作優先級。在理論上,這同樣用於支持priority_queue,但沒有cahnge優先級操作,但可以在不影響數據結構操作的複雜性的情況下完成。

+0

謝謝,但我不知道該怎麼辦。二進制堆很好,有對象排序,但增量我需要搜索關鍵。如何實現快速搜索?沒有任何方法可以在C++/boost中使用實現的結構嗎? – Yasser 2013-02-10 14:14:28

0

我設法通過在插入對象時跟蹤對象的排序列表的按鍵數來解決它。所以總是有最多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,找到它的命中和增量(這足夠快)。
  • if if hit<hits[N],忽略它。
  • 否則,idx=key_idx[key],(如果沒有找到,將其添加到結構和刪除現有之一。它太長寫所有細節)
  • H=h[idx]++
  • 檢查它是否比上面的條目,h[idx-1]<H更大。如果是,則在key_idx,hits,keys中交換idx和idx-1。

我試圖讓它變快。但我不知道它有多快。