ruby_structures 2.1.0 → 2.2.0
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/lib/data_structures/heap.rb +76 -0
- data/lib/data_structures/lru_cache.rb +10 -12
- data/lib/ruby_structures.rb +1 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f90580fdf848a8b70513b2756ea932be5913ca0
|
4
|
+
data.tar.gz: 0bdf1a300665bfa031045f07ab5a01a9b4e17f34
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c9b4072b567a40780c949177e91bf4a26b92af651038e2eb1d39ac04ac3adb88bf0d37bb4bcf7e88f379fa8b72d6893912234c5615b6f5da1b74a1ac7cb330b3
|
7
|
+
data.tar.gz: fbac1d228a0a991f05506bbbca51177582c97612289e82015bd941dd67c9d258feab5fcb2c491c95756edf22ec608238d9d074094385af363e19000ebff4b6c1
|
@@ -0,0 +1,76 @@
|
|
1
|
+
class Heap
|
2
|
+
def initialize
|
3
|
+
@store = []
|
4
|
+
end
|
5
|
+
|
6
|
+
def peek
|
7
|
+
raise ArgumentError.new('Heap is empty') if @store.empty?
|
8
|
+
@store.first
|
9
|
+
end
|
10
|
+
|
11
|
+
def insert(el)
|
12
|
+
@store << el
|
13
|
+
|
14
|
+
el_idx = @store.length - 1
|
15
|
+
parent_idx = parent_idx(el_idx)
|
16
|
+
|
17
|
+
heapify_up(el_idx, parent_idx)
|
18
|
+
|
19
|
+
el
|
20
|
+
end
|
21
|
+
|
22
|
+
def extract
|
23
|
+
raise ArgumentError.new('Heap is empty') if @store.empty?
|
24
|
+
return @store.shift if @store.length <= 2
|
25
|
+
|
26
|
+
@store[0], @store[-1] = @store[-1], @store[0]
|
27
|
+
head = @store.pop
|
28
|
+
|
29
|
+
el_idx = 0
|
30
|
+
children_indices = children_indices(el_idx)
|
31
|
+
|
32
|
+
heapify_down(el_idx, children_indices)
|
33
|
+
|
34
|
+
head
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def heapify_up(el_idx, parent_idx)
|
40
|
+
until el_idx == 0 || @store[el_idx] >= @store[parent_idx]
|
41
|
+
@store[el_idx], @store[parent_idx] = @store[parent_idx], @store[el_idx]
|
42
|
+
el_idx = parent_idx
|
43
|
+
parent_idx = parent_idx(el_idx)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def heapify_down(el_idx, children_indices)
|
48
|
+
return if children_indices.empty?
|
49
|
+
if children_indices.length == 1
|
50
|
+
child_idx = children_indices.first
|
51
|
+
if @store[el_idx] > @store[child_idx]
|
52
|
+
@store[el_idx], @store[child_idx] = @store[child_idx], @store[el_idx]
|
53
|
+
end
|
54
|
+
return
|
55
|
+
elsif @store[el_idx] > @store[children_indices.first] || @store[el_idx] > @store[children_indices.last]
|
56
|
+
child1, child2 = @store[children_indices.first], @store[children_indices.last]
|
57
|
+
lowest_child_idx = child1 <= child2 ? children_indices.first : children_indices.last
|
58
|
+
@store[el_idx], @store[lowest_child_idx] = @store[lowest_child_idx], @store[el_idx]
|
59
|
+
|
60
|
+
children_indices = children_indices(lowest_child_idx)
|
61
|
+
heapify_down(lowest_child_idx, children_indices)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def parent_idx(idx)
|
66
|
+
(idx - 1) / 2
|
67
|
+
end
|
68
|
+
|
69
|
+
def children_indices(idx)
|
70
|
+
idx1 = idx * 2 + 1
|
71
|
+
idx2 = idx * 2 + 2
|
72
|
+
[idx1, idx2].select { |idx| @store[idx] }
|
73
|
+
end
|
74
|
+
|
75
|
+
attr_reader :store
|
76
|
+
end
|
@@ -37,9 +37,7 @@ class LRUCache
|
|
37
37
|
@hash[key] = node
|
38
38
|
|
39
39
|
if @size == @max_size
|
40
|
-
|
41
|
-
@linked_list.remove(first_node_key)
|
42
|
-
@hash.delete(first_node_key)
|
40
|
+
remove_node(:first)
|
43
41
|
else
|
44
42
|
@size += 1
|
45
43
|
end
|
@@ -52,9 +50,7 @@ class LRUCache
|
|
52
50
|
@hash[key] = node
|
53
51
|
|
54
52
|
if @size == @max_size
|
55
|
-
|
56
|
-
@linked_list.remove(last_node_key)
|
57
|
-
@hash.delete(last_node_key)
|
53
|
+
remove_node(:last)
|
58
54
|
else
|
59
55
|
@size += 1
|
60
56
|
end
|
@@ -67,9 +63,7 @@ class LRUCache
|
|
67
63
|
@hash[key] = node
|
68
64
|
|
69
65
|
if @size == @max_size
|
70
|
-
|
71
|
-
@linked_list.remove(first_node_key)
|
72
|
-
@hash.delete(first_node_key)
|
66
|
+
remove_node(:first)
|
73
67
|
else
|
74
68
|
@size += 1
|
75
69
|
end
|
@@ -82,9 +76,7 @@ class LRUCache
|
|
82
76
|
@hash[key] = node
|
83
77
|
|
84
78
|
if @size == @max_size
|
85
|
-
|
86
|
-
@linked_list.remove(last_node_key)
|
87
|
-
@hash.delete(last_node_key)
|
79
|
+
remove_node(:last)
|
88
80
|
else
|
89
81
|
@size += 1
|
90
82
|
end
|
@@ -105,6 +97,12 @@ class LRUCache
|
|
105
97
|
|
106
98
|
private
|
107
99
|
|
100
|
+
def remove_node(position)
|
101
|
+
node_key = @linked_list.send(position).send(:key)
|
102
|
+
@linked_list.remove(node_key)
|
103
|
+
@hash.delete(node_key)
|
104
|
+
end
|
105
|
+
|
108
106
|
attr_accessor :max_size, :size
|
109
107
|
attr_reader :hash, :linked_list
|
110
108
|
end
|
data/lib/ruby_structures.rb
CHANGED
metadata
CHANGED
@@ -1,23 +1,24 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_structures
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Numeroff
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-05-
|
11
|
+
date: 2018-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description: Ruby implementations of a Stack, Queue, Linked List, Binary Tree
|
14
|
-
|
13
|
+
description: Ruby implementations of a Stack, Queue, Linked List, Binary Tree, LRU
|
14
|
+
Cache and Heap. More to come!
|
15
15
|
email: jnumeroff@hotmail.com
|
16
16
|
executables: []
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
20
|
- lib/data_structures/binary_tree.rb
|
21
|
+
- lib/data_structures/heap.rb
|
21
22
|
- lib/data_structures/linked_list.rb
|
22
23
|
- lib/data_structures/lru_cache.rb
|
23
24
|
- lib/data_structures/queue.rb
|