Ruby хранит количество событий в упорядоченной структуре данных - PullRequest
2 голосов
/ 15 февраля 2011

У меня есть скрипт ruby, который ведет подсчет количества раз, когда конкретный объект появляется - он не работает, потому что каждая найденная мной структура данных сортируется по ключу или когда она сортируется по значению возвращает массив или массивы

Мне интересно, как лучше всего хранить эти данные ...

У меня просто есть куча объектов с идентификаторами из базы данных, когда я зацикливаюсь на заданном наборе данных, я хочу отслеживать, сколько раз я использую определенный объект, поэтому мне нужно увеличить раз используется для данного объекта.

По сути, я создаю приоритетную очередь, в которой я хочу убедиться, что каждый объект используется столько же раз, сколько и другие объекты, поэтому я сортирую список по вхождению и использую объекты с наименьшим количеством в первую очередь.

Ответы [ 2 ]

1 голос
/ 15 февраля 2011

Теоретически, я бы использовал класс 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 где-то в вашем пути загрузки.Таким образом, вы захотите убедиться, что также получите это .

Ваша следующая проблема заключается в том, что изменение веса не восстановит баланс rbtree.Я не уверен, как решить эту проблему.

Увы, это то, где моя структура данных выдает фу и просто использует Redis , но, возможно, это поможет вам найти решение.

0 голосов
/ 16 февраля 2011

Так вот, где я закончил .. с рабочим решением. Я использовал обычный массив в качестве приоритетной очереди, поэтому вместо того, чтобы иметь идентификатор ключа объекта и значение, сколько раз к нему обращались, я просто храню идентификатор объекта в массиве.

С массивом идентификаторов, когда наступает время «увеличения», я просто удаляю его из массива и возвращаю его обратно в конец массива - поскольку массивы «подразумевают» индексы порядка сохранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...