顶部撞击物体的结构

时间:2013-02-09 13:39:28

标签: c++ data-structures priority-queue unordered-map

我想为收到的hitobject参数显示其频率。并且能够拥有最频繁的前hitobject个。 Unordered_map适合第一部分,以object为键,hit为值。

unordered_map<object,int> 

它可以快速搜索object并增加其hit。但排序怎么样? priority_queue允许拥有最高命中对象。但如何增加对象的命中率呢?

2 个答案:

答案 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],请忽略它。
  • else,idx=key_idx[key],(如果没有找到,请将其添加到结构中并删除现有的。编写所有详细信息的时间太长)
  • H=h[idx]++
  • 检查它是否大于上述条目h[idx-1]<H。如果是,请在key_idxhitskeys中交换idx和idx-1。

我试图让它快速。但我不知道它的速度有多快。