【问题标题】:Structure for top hit objects顶部命中对象的结构
【发布时间】:2013-02-09 13:39:28
【问题描述】:

我想要接收到的objects 有一个hit 参数,显示它的频率。并且能够拥有最频繁的顶级hitobjects。 Unordered_map 适合第一部分,object 作为键,hit 作为值。

unordered_map<object,int> 

它可以快速搜索object 并增加其hit。但是排序呢? priority_queue 启用顶部命中对象。但是如何增加对象的命中呢?

【问题讨论】:

  • 您指的是特定语言吗?
  • 是的,代码是c++。

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


【解决方案1】:

我建议您查看splay tree,它以一种最近和最常访问的对象更靠近顶部的方式保存对象。这依赖于几个 euristicts,因此会给你一个完美解决方案的近似值。

对于一个精确的解决方案,最好实现自己的binary heap 并实现操作icrement 优先级。理论上同样用于支持priority_queue,但没有cahnge优先级操作,但可以在不影响数据结构操作复杂度的情况下完成。

【讨论】:

  • 谢谢,但我不知道该怎么做。二进制堆可以很好地对对象进行排序,但要增加我需要搜索键。如何实现快速搜索?有没有办法在 C++/boost 中使用已实现的结构?
【解决方案2】:

当我插入对象时,我设法通过按对象的命中数跟踪排序的对象列表来解决它。所以总是有最多 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_hit 中搜索key,找到它的命中和增量(这已经足够快了)。
  • 如果hit&lt;hits[N],忽略它。
  • 否则,idx=key_idx[key],(如果找不到,将其添加到结构中并删除现有结构。写所有详细信息太长)
  • H=h[idx]++
  • 检查是否大于上述条目h[idx-1]&lt;H。如果是,则在key_idx,hits,keys 中交换 idx 和 idx-1。

我试着让它快点。但我不知道它有多快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 2020-10-30
    • 2011-08-02
    • 2017-10-25
    相关资源
    最近更新 更多