Ruby在有序数据结构中保持出现次数

时间:2011-02-15 04:02:19

标签: ruby sorting data-structures

我有一个ruby脚本,它会记录特定对象出现的次数 - 它不起作用,因为我发现每个数据结构都按进行排序,或者它是按值排序,它返回数组或数组

我想知道存储这些数据的最佳方法是......

我只有一堆对象,ID来自数据库,当我遍历一组给定的数据时,我想跟踪我使用某个对象的次数,所以我需要增加使用次数给定对象。

基本上我正在做的是创建一个排序的优先级队列,我想确保每个对象的使用次数与其他对象一样多,所以我按事件对列表进行排序,并使用最少的对象首先发生。

2 个答案:

答案 0 :(得分:1)

理论上,我会使用SortedSet类+自定义类来完成三件事:实现#eql?hash<=>。它看起来像这样:

class WeightedEntry
  attr_accessor :weight, :object

  def initialize(object)
    @object = object
    @weight = 1
  end

  def hash
    self.object.hash
  end

  def eql?(other)
    self.equal?(other) || self.object.equal?(other.object)
  end

  def <=>(other)
    self.weight <=> other.weight
  end

  def incr
    @weight += 1
  end
end

但是,查看源代码(set.rb),只有在加载路径中某处有rbtree时,此类才有效。因此,您需要确保get that as well

您的下一个问题是修改重量不会重新平衡rbtree。我不知道如何解决这个问题。

唉,这是我的数据结构-fu发出的地方和just use Redis,但也许这会启发你发现解决方案。

答案 1 :(得分:0)

所以这就是我结束的地方..有一个有效的解决方案。我使用普通数组作为排序的优先级队列,因此,不是将对象的ID作为键,而是将其访问的次数,我将对象ID存储在数组中。

使用ID数组,当需要'递增'时,我只需将其从数组中删除,然后将其推回到数组的末尾 - 因为数组的“隐含”索引是保留顺序。