2011-02-15 42 views
2

我有一個ruby腳本來保持特定對象出現的次數 - 它不起作用,因爲我發現的每個數據結構都按排序,或者當它被值排序它返回一個或多個陣列Ruby在有序數據結構中保持着發生數

我想知道什麼是最好的方式去保存這些數據..

我只是有一堆的對象,有ID的距離一個數據庫,當我循環訪問一組給定的數據時,我想跟蹤我使用某個對象的次數,所以我需要增加次使用爲給定的對象。

基本上我正在做的是創建一個排序的優先級隊列,我想確保每個對象的使用次數與其他對象的使用次數一樣多,所以我按出現次序對列表進行排序,並使用對象第一次出現次數最少。

回答

0

因此,這裏是我結束了..有一個工作解決方案。我使用普通數組作爲排序的優先級隊列,所以我不是簡單地將對象ID存儲在一個數組中,而是將對象的ID作爲關鍵字,並將其值設爲訪問次數。

有了一個ID數組,當它到達'增量'時,我只需將它從數組中刪除,並將其推回數組的末尾 - 因爲數組具有「隱含」索引保留順序。

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,但也許這會啓發你發現一個解決方案。

+0

測試Redis ..我花了一點時間尋找解決方案的https://github.com/kanwei/algorithms,但沒有發現任何東西..我可能會取消我的整個流程,只是使用該寶石中的優先級隊列雖然.. – Rabbott 2011-02-15 16:22:09