Sha256: 83b63956e168d5205810e34de6210ca414c616839039a2d5a649881d7d510d42

Contents?: true

Size: 1.32 KB

Versions: 1

Compression:

Stored size: 1.32 KB

Contents

module RubyCollections
  class UnionFind
    def initialize(arr)
      @leadership_hash = {}; @count = {}; @orig_val = {}
      arr.each   {|elem| set_hash(elem, elem); set_size(elem, 0); @orig_val[elem.to_s] = elem}
    end

    def find(elem)
      elem = get_hash(elem) while get_hash(elem) != elem
      return elem
    end

    def union(elem1, elem2)
      leader1 = find(elem1)
      leader2 = find(elem2)
      unless leader1 == leader2
        size(leader1) > size(leader2) ? set_hash(leader2, leader1) : set_hash(leader1, leader2)
      end
    end

    def to_a
      hash.keys.each do |key|
        leader = find(key)
        uf_hash[leader.to_s] = uf_hash.fetch(leader.to_s, []) << @orig_val[key]
      end
      uf_hash.values
    end

    def cluster(elem)
      leader = find(elem)
      cluster = []
      hash.keys.each {|key| cluster << @orig_val[key] if find(key) == leader}
      cluster
    end

    private

    def set_hash(key, value)
      @leadership_hash[key.to_s] = value
    end

    def get_hash(key)
      @leadership_hash[key.to_s]
    end

    def hash
      @leadership_hash
    end

    def size(elem)
      @count[elem.to_s]
    end

    def set_size(elem, val)
      @count[elem.to_s] = val
    end

    def uf_hash
      @uf_hash ||= {}
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ruby_collections-0.0.7 lib/ruby_collections/union_find.rb