RubyDataStructures 0.0.4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,193 @@
1
+ RubyDatStructures
2
+ =============
3
+
4
+ `RubyDataStructures` gem is a `ruby` implementation of common data structures that are not by default supported by the Ruby programming language.
5
+ The `RubyDatStructures` supports the following data structures:
6
+
7
+ - Multi Dimensional Array
8
+ - Stack (Implemented as an array)
9
+ - Queue (Implemented as an array)
10
+ - Singly Linked List
11
+ - Doubly Linked List
12
+ - Max Heap
13
+
14
+ Installation
15
+ ------------
16
+
17
+ gem install RubyDataStructures
18
+
19
+ Usage
20
+ -----
21
+
22
+ The `RubyDatStructures` library can be easily imported by running:
23
+
24
+ require 'rubygems'
25
+ require 'RubyDatStructures'
26
+
27
+ The usage of each of the data structures is described below.
28
+
29
+ ## Multi Dimensional Array
30
+
31
+ A `multi dimensional array` can be initialized by running:
32
+
33
+ RubyDataStructures::MultiDimensionalArray.new(n)
34
+
35
+ where `n` is the number of dimensions of the multi dimensional array.
36
+
37
+ The key at a particular index can be easily accessed by calling the array with the dimensions of the index.
38
+ The key at the index with dimensions `(2,4,3)` of a multi dimensional array `mul_dim_array` can be access by calling:
39
+
40
+ mul_dim_array[2,4,3]
41
+
42
+ The key for an index can also be easily set by calling the setter with the dimensions of the index.
43
+ The key at the index with dimensions `(2,4,3)` of a multi dimensional array `mul_dim_array` can be set to `36` by calling:
44
+
45
+ mul_dim_array[2,4,3] = 36
46
+
47
+ ## Stack
48
+
49
+ A `Stack` can be initialized by running:
50
+
51
+ RubyDataStructures::StackAsArray.new(n)
52
+
53
+ where `n` is the max-size of stack.
54
+
55
+ The following methods available on a `stack` are self explanatory:
56
+
57
+ - empty?
58
+ - full?
59
+ - singleton?
60
+ - push(`element`)
61
+ - pop
62
+ - reset
63
+
64
+ Examples:
65
+
66
+ my_stack = RubyDataStructures::StackAsArray.new(5)
67
+ my_stack.empty? # Returns `true`
68
+ my_stack.full? # Returns `false`
69
+ my_stack.singleton? # Returns `false`
70
+ my_stack.push(1)
71
+ my_stack.push(2)
72
+ my_stach.push(3)
73
+ my_stack.pop # Return `3`
74
+
75
+ ## Queue
76
+
77
+ A `Queue` can be initialized by calling:
78
+
79
+ RubyDataStructures::QueueAsArray.new(n)
80
+
81
+ where `n` is the max-size of the queue.
82
+
83
+ The following methods available on a `queue` are self explanatory:
84
+
85
+ - empty?
86
+ - full?
87
+ - enqueue(`element`)
88
+ - dequeue
89
+ - reset
90
+
91
+ Examples:
92
+
93
+ my_queue = RubyDataStructures::QueueAsArray.new(5)
94
+ my_queue.empty? # Returns `true`
95
+ my_queue.full? # Returns `false`
96
+ my_queue.enqueue(1)
97
+ my_queue.enqueue(2)
98
+ my_queue.enqueue(3)
99
+ my_queue.dequeue # Returns `1`
100
+
101
+ ## Singly Linked List
102
+
103
+ A `singly linked list` can be initialized by running:
104
+
105
+ RubyDataStructures::SinglyLinkedList.new
106
+
107
+ The following methods available on a `singly linked list` are self explanatory:
108
+
109
+ - head
110
+ - empty?
111
+ - insert(`item`)
112
+ - search(`key`)
113
+ - delete(`key`)
114
+ - reset
115
+
116
+ Examples:
117
+
118
+ my_list = RubyDataStructures::SinglyLinkedList.new
119
+ my_list.head # Returns `nil`
120
+ my_list.empty? # Returns `true`
121
+ my_list.insert(7)
122
+ my_list.search(7) # Returns a `RubyDataStructures::SinglyLinkedList::Element` element, whose key is `7`
123
+ my_list.delete(7)
124
+
125
+ ## Doubly Linked List
126
+
127
+ A `doubly linked list` can be intialized by running:
128
+
129
+ RubyDataStructures::DoublyLinkedList.new
130
+
131
+ The following methods available on a `doubly linked list` are self explanatory:
132
+
133
+ - head
134
+ - tail
135
+ - empty?
136
+ - insert(`item`)
137
+ - search(`key`)
138
+ - delete(`key`)
139
+ - reset
140
+
141
+ Examples:
142
+
143
+ my_list = RubyDataStructures::DoublyLinkedList.new
144
+ my_list.head # Returns a `RubyDataStructures::DoublyLinkedList::Element` element, whose key is nil
145
+ my_list.tail # Returns a `RubyDataStructures::DoublyLinkedList::Element` element, whose key is nil
146
+ my_list.empty? # Returns `true`
147
+ my_list.insert(7)
148
+ my_list.search(7) # Returns a `RubyDataStructures::DoublyLinkedList::Element` element, whose key is `7`
149
+ my_list.delete(7)
150
+
151
+ ## Max Heap
152
+
153
+ `MaxHeap` inherits most of its functionality from `Array`.
154
+ A `max heap` can be initialized by running:
155
+
156
+ RubyDataStructures::MaxHeap.build(array)
157
+
158
+ where `array` is an array, out of which we would like to build a max heap.
159
+
160
+ For example, a heap can be built out of an array `[4, 1, 3, 2, 16, 9, 10, 14, 8, 7]` by running:
161
+
162
+ heap = RubyDataStructures::MaxHeap.build([4, 1, 3, 2, 16, 9, 10, 14, 8, 7])
163
+ # Returns the MaxHeap: [16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
164
+
165
+ The `maximum` of the heap can be accessed by running:
166
+
167
+ heap.maximum # Returns `16`
168
+
169
+ The maximum of the heap can be extracted by running:
170
+
171
+ heap.extract_maximum!
172
+
173
+ The key of a particular element can be increased by running:
174
+
175
+ heap.increase_key!(index, key)
176
+
177
+ Example:
178
+
179
+ heap.increase_key!(8, 15)
180
+
181
+ A key can be inserted into a heap by running:
182
+
183
+ heap.insert!(key)
184
+
185
+ Example:
186
+
187
+ heap.insert!(11)
188
+
189
+
190
+ Author
191
+ ------
192
+
193
+ B V Satyaram <[bvsatyaram.com](http://bvsatyaram.com)>
@@ -0,0 +1,101 @@
1
+ class RubyDataStructures::MaxHeap < Array
2
+ Infinity = 1.0/0
3
+
4
+ attr_accessor :heapsize
5
+
6
+ # It is assumed that the binary trees rooted at left(i) and right(i) are max heaps,
7
+ # but self[i] might be smaller than its children, thus violating the max-heap property.
8
+ # max_heapify! lets the value at self[i] float down in the max-heap,
9
+ # so that the subtree rooted at index i obeys the max-heap property
10
+ def max_heapify!(i)
11
+ l = left(i)
12
+ r = right(i)
13
+
14
+ if l < self.heapsize && self[l] > self[i]
15
+ largest = l
16
+ else
17
+ largest = i
18
+ end
19
+
20
+ if r < self.heapsize && self[r] > self[largest]
21
+ largest = r
22
+ end
23
+
24
+ if largest != i
25
+ exchange(i, largest)
26
+ max_heapify!(largest)
27
+ end
28
+
29
+ return self
30
+ end
31
+
32
+ # Builds a max-heap from an array
33
+ def self.build(array)
34
+ heap = self.new(array)
35
+ heap.heapsize = array.size
36
+
37
+ if heap.heapsize > 0
38
+ ((heap.heapsize/2) - 1).downto(0) do |i|
39
+ heap.max_heapify!(i)
40
+ end
41
+ end
42
+
43
+ return heap
44
+ end
45
+
46
+ # Returns the maximum element of the heap
47
+ def maximum
48
+ return self[0]
49
+ end
50
+
51
+ # Extracts the maximum of the heap and max_heapifies the remaining heap.
52
+ # Returns the maximum of the input heap
53
+ def extract_maximum!
54
+ raise "Heap Underflow - The heap is empty" if self.heapsize < 1
55
+
56
+ max_value = self[0]
57
+ self[0] = self[self.heapsize - 1]
58
+ self.heapsize = self.heapsize - 1
59
+ self.max_heapify!(0)
60
+
61
+ return max_value
62
+ end
63
+
64
+ def increase_key!(i, key)
65
+ raise "New key is smaller than the current key" if key < self[i]
66
+
67
+ self[i] = key
68
+ while (i > 0) && (self[parent(i)] < self[i])
69
+ exchange(i, parent(i))
70
+ i = parent(i)
71
+ end
72
+
73
+ return self
74
+ end
75
+
76
+ def insert!(key)
77
+ self.heapsize = self.heapsize + 1
78
+ self[self.heapsize - 1] = -Infinity
79
+ self.increase_key!(self.heapsize - 1, key)
80
+ end
81
+
82
+ private
83
+
84
+ def parent(i)
85
+ return ((i+1)/2) - 1
86
+ end
87
+
88
+ def left(i)
89
+ return (2*i) + 1
90
+ end
91
+
92
+ def right(i)
93
+ return (2*i) + 2
94
+ end
95
+
96
+ def exchange(i, j)
97
+ tmp = self[i]
98
+ self[i] = self[j]
99
+ self[j] = tmp
100
+ end
101
+ end
@@ -1,3 +1,3 @@
1
1
  module Rubydatastructures
2
- VERSION = "0.0.4"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -8,4 +8,5 @@ require 'RubyDataStructures/queue_as_array'
8
8
  require 'RubyDataStructures/singly_linked_list'
9
9
  require 'RubyDataStructures/singly_linked_list/element'
10
10
  require 'RubyDataStructures/doubly_linked_list'
11
- require 'RubyDataStructures/doubly_linked_list/element'
11
+ require 'RubyDataStructures/doubly_linked_list/element'
12
+ require 'RubyDataStructures/max_heap'
@@ -0,0 +1,46 @@
1
+ $:.unshift File.join(File.dirname(__FILE__),'..','lib')
2
+
3
+ require 'test/unit'
4
+ require 'RubyDataStructures'
5
+
6
+ class MaxHeapTest < Test::Unit::TestCase
7
+ def test_build
8
+ assert_equal [16, 14, 10, 8, 7, 9, 3, 2, 4, 1], RubyDataStructures::MaxHeap.build([4, 1, 3, 2, 16, 9, 10, 14, 8, 7])
9
+ end
10
+
11
+ def test_maximum
12
+ array = [4, 1, 3, 2, 16, 9, 10, 14, 8, 7]
13
+ heap = RubyDataStructures::MaxHeap.build(array)
14
+
15
+ assert_equal 16, heap.maximum
16
+ end
17
+
18
+ def test_extract_maximum
19
+ array = [4, 1, 3, 2, 16, 9, 10, 14, 8, 7]
20
+ heap = RubyDataStructures::MaxHeap.build(array)
21
+
22
+ assert_equal 10, heap.heapsize
23
+ assert_equal 16, heap.extract_maximum!
24
+ assert_equal 9, heap.heapsize
25
+ assert_equal [14, 8, 10, 4, 7, 9, 3, 2, 1, 1], heap
26
+ end
27
+
28
+ def test_increase_key
29
+ array = [4, 1, 3, 2, 16, 9, 10, 14, 8, 7]
30
+ heap = RubyDataStructures::MaxHeap.build(array)
31
+
32
+ assert_equal [16, 15, 10, 14, 7, 9, 3, 2, 8, 1], heap.increase_key!(8, 15)
33
+ end
34
+
35
+ def test_insert
36
+ array = [4, 1, 3, 2, 16, 9, 10, 14, 8, 7]
37
+ heap = RubyDataStructures::MaxHeap.build(array)
38
+
39
+ assert_equal 10, heap.heapsize
40
+ assert_equal 16, heap.extract_maximum!
41
+ assert_equal 9, heap.heapsize
42
+ assert_equal [14, 8, 10, 4, 7, 9, 3, 2, 1, 1], heap
43
+
44
+ assert_equal [14, 11, 10, 4, 8, 9, 3, 2, 1, 7], heap.insert!(11)
45
+ end
46
+ end
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: RubyDataStructures
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
5
4
  prerelease: false
6
5
  segments:
6
+ - 1
7
7
  - 0
8
8
  - 0
9
- - 4
10
- version: 0.0.4
9
+ version: 1.0.0
11
10
  platform: ruby
12
11
  authors:
13
12
  - Satyaram B V
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2011-03-05 00:00:00 +05:30
17
+ date: 2011-05-16 00:00:00 +05:30
19
18
  default_executable:
20
19
  dependencies: []
21
20
 
@@ -32,13 +31,14 @@ files:
32
31
  - .gitignore
33
32
  - Gemfile
34
33
  - LICENSE
35
- - README
34
+ - README.md
36
35
  - RELEASE_NOTES
37
36
  - Rakefile
38
37
  - RubyDataStructures.gemspec
39
38
  - lib/RubyDataStructures.rb
40
39
  - lib/RubyDataStructures/doubly_linked_list.rb
41
40
  - lib/RubyDataStructures/doubly_linked_list/element.rb
41
+ - lib/RubyDataStructures/max_heap.rb
42
42
  - lib/RubyDataStructures/multi_dimensional_array.rb
43
43
  - lib/RubyDataStructures/queue_as_array.rb
44
44
  - lib/RubyDataStructures/ruby_data_structures.rb
@@ -49,6 +49,7 @@ files:
49
49
  - test/RubyDataStructureTest.rb
50
50
  - test/doubly_linked_list_element_test.rb
51
51
  - test/doubly_linked_list_test.rb
52
+ - test/max_heap_test.rb
52
53
  - test/multi_dimensional_array_test.rb
53
54
  - test/queue_as_array_test.rb
54
55
  - test/singly_linked_list_element_test.rb
@@ -64,27 +65,23 @@ rdoc_options: []
64
65
  require_paths:
65
66
  - lib
66
67
  required_ruby_version: !ruby/object:Gem::Requirement
67
- none: false
68
68
  requirements:
69
69
  - - ">="
70
70
  - !ruby/object:Gem::Version
71
- hash: 3
72
71
  segments:
73
72
  - 0
74
73
  version: "0"
75
74
  required_rubygems_version: !ruby/object:Gem::Requirement
76
- none: false
77
75
  requirements:
78
76
  - - ">="
79
77
  - !ruby/object:Gem::Version
80
- hash: 3
81
78
  segments:
82
79
  - 0
83
80
  version: "0"
84
81
  requirements: []
85
82
 
86
83
  rubyforge_project: RubyDataStructures
87
- rubygems_version: 1.3.7
84
+ rubygems_version: 1.3.6
88
85
  signing_key:
89
86
  specification_version: 3
90
87
  summary: Implementation of standard data structures in Ruby
data/README DELETED
@@ -1,3 +0,0 @@
1
- == RubyDataStructures
2
-
3
- Implementation of standard data structures in Ruby.