我想为收到的hit
个object
参数显示其频率。并且能够拥有最频繁的前hit
,object
个。
Unordered_map
适合第一部分,以object
为键,hit
为值。
unordered_map<object,int>
它可以快速搜索object
并增加其hit
。但排序怎么样? priority_queue
允许拥有最高命中对象。但如何增加对象的命中率呢?
答案 0 :(得分:0)
我建议您查看splay tree,以最近和最常访问的对象更靠近顶部的方式保持对象。这依赖于几个euristicts,因此将为您提供完美解决方案的近似值。
要获得精确的解决方案,最好实现自己的binary heap并实现操作icrement优先级。理论上,它用于支持priority_queue
,但没有cahnge优先级操作,而它可以在不影响数据结构操作复杂性的情况下完成。
答案 1 :(得分:0)
我设法通过在插入对象时按其命中数跟踪对象的排序列表来解决它。因此,总有最多N个热门歌曲的列表。有3,000,000个对象,我想拥有前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
中的key_hit
,查找其命中和增量(这足够快)。hit<hits[N]
,请忽略它。idx=key_idx[key]
,(如果没有找到,请将其添加到结构中并删除现有的。编写所有详细信息的时间太长)H=h[idx]++
h[idx-1]<H
。如果是,请在key_idx
,hits
,keys
中交换idx和idx-1。我试图让它快速。但我不知道它的速度有多快。