ruby_collections 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +26 -2
- data/lib/ruby_collections/collections.rb +2 -1
- data/lib/ruby_collections/deque.rb +3 -0
- data/lib/ruby_collections/linked_list.rb +3 -0
- data/lib/ruby_collections/stack.rb +3 -0
- data/lib/ruby_collections/union_find.rb +62 -0
- data/lib/ruby_collections/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34ab0c58c7947f07aa41aedecd63bb6cb93891da
|
4
|
+
data.tar.gz: bc4baeb4df6f7b1bcaeb0932791c449dbfa48382
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f019fb61c75a57552a9442e1ef97f735f9329c02c5fb5e5e5b6390ae8aa3aac772a29be1908b7deef5b46237fe80554e8de026a45c842b673c79912651f34b24
|
7
|
+
data.tar.gz: c9b8b9192ef07cc1f53b2d39cd0db21d108d7d479041a4831665789f7dbf9c4c64847cd7314d9c6d30ed5f64d990366e39858fa01666621f31398e41fa8a2935
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# RubyCollections
|
2
2
|
|
3
|
-
Welcome to ruby_collections gem. This gem will provide you with an easy access to common data structures to be used in
|
3
|
+
Welcome to ruby_collections gem. This gem will provide you with an easy access to common data structures to be used in Ruby Language.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -20,7 +20,7 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
## Usage
|
22
22
|
|
23
|
-
Supported Data Structures: Max Heap, Min Heap, Stack, LinkedList, Deque
|
23
|
+
Supported Data Structures: Max Heap, Min Heap, Stack, LinkedList, Deque, UnionFind
|
24
24
|
|
25
25
|
### RubyCollections::MaxHeap
|
26
26
|
|
@@ -156,6 +156,30 @@ list.remove_last # list: [10, 2]
|
|
156
156
|
|
157
157
|
```
|
158
158
|
|
159
|
+
### RubyCollections::UnionFind
|
160
|
+
|
161
|
+
```ruby
|
162
|
+
|
163
|
+
# initialization takes an array argument. each element should have a to_s method defined which should return uniq val
|
164
|
+
|
165
|
+
uf = RubyCollections::UnionFind.new (1..8).to_a
|
166
|
+
|
167
|
+
uf.union(1,3) # joins 1 and 3 and returns the leader
|
168
|
+
|
169
|
+
uf.union(5,6) # joins 5 and 6 and returns the leader
|
170
|
+
|
171
|
+
uf.union(2,4) # joins 2 and 4 and returns the leader
|
172
|
+
|
173
|
+
uf.union(1,7) # joins 1 and 7 and returns the leader
|
174
|
+
|
175
|
+
uf.find(7) # leader of the cluster containing 7
|
176
|
+
|
177
|
+
uf.to_a # => [[1, 3, 7], [2, 4], [5, 6], [8]] i.e. returns array of all clusters
|
178
|
+
|
179
|
+
uf.cluster(1) # => [1, 3, 7] i.e. returns all elements in same cluster as of 1
|
180
|
+
|
181
|
+
```
|
182
|
+
|
159
183
|
## Development
|
160
184
|
|
161
185
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module RubyCollections
|
2
|
+
class UnionFind
|
3
|
+
def initialize(arr)
|
4
|
+
@leadership_hash = {}; @count = {}; @orig_val = {}
|
5
|
+
arr.each {|elem| set_hash(elem, elem); set_size(elem, 0); @orig_val[elem.to_s] = elem}
|
6
|
+
end
|
7
|
+
|
8
|
+
def find(elem)
|
9
|
+
elem = get_hash(elem) while get_hash(elem) != elem
|
10
|
+
return elem
|
11
|
+
end
|
12
|
+
|
13
|
+
def union(elem1, elem2)
|
14
|
+
leader1 = find(elem1)
|
15
|
+
leader2 = find(elem2)
|
16
|
+
unless leader1 == leader2
|
17
|
+
size(leader1) > size(leader2) ? set_hash(leader2, leader1) : set_hash(leader1, leader2)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_a
|
22
|
+
hash.keys.each do |key|
|
23
|
+
leader = find(key)
|
24
|
+
uf_hash[leader.to_s] = uf_hash.fetch(leader.to_s, []) << @orig_val[key]
|
25
|
+
end
|
26
|
+
uf_hash.values
|
27
|
+
end
|
28
|
+
|
29
|
+
def cluster(elem)
|
30
|
+
leader = find(elem)
|
31
|
+
cluster = []
|
32
|
+
hash.keys.each {|key| cluster << @orig_val[key] if find(key) == leader}
|
33
|
+
cluster
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def set_hash(key, value)
|
39
|
+
@leadership_hash[key.to_s] = value
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_hash(key)
|
43
|
+
@leadership_hash[key.to_s]
|
44
|
+
end
|
45
|
+
|
46
|
+
def hash
|
47
|
+
@leadership_hash
|
48
|
+
end
|
49
|
+
|
50
|
+
def size(elem)
|
51
|
+
@count[elem.to_s]
|
52
|
+
end
|
53
|
+
|
54
|
+
def set_size(elem, val)
|
55
|
+
@count[elem.to_s] = val
|
56
|
+
end
|
57
|
+
|
58
|
+
def uf_hash
|
59
|
+
@uf_hash ||= {}
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_collections
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vikash Vikram
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -63,6 +63,7 @@ files:
|
|
63
63
|
- lib/ruby_collections/max_heap.rb
|
64
64
|
- lib/ruby_collections/min_heap.rb
|
65
65
|
- lib/ruby_collections/stack.rb
|
66
|
+
- lib/ruby_collections/union_find.rb
|
66
67
|
- lib/ruby_collections/version.rb
|
67
68
|
- ruby_collections.gemspec
|
68
69
|
homepage: https://github.com/vikashvikram/ruby_collections
|