honey_mushroom 0.0.1
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 +7 -0
- data/lib/honey_mushroom.rb +12 -0
- data/lib/honey_mushroom/binary_search_tree.rb +102 -0
- data/lib/honey_mushroom/breadth_first_search.rb +19 -0
- data/lib/honey_mushroom/depth_first_search.rb +14 -0
- data/lib/honey_mushroom/directed_graph.rb +2 -0
- data/lib/honey_mushroom/doubly_linked_list.rb +45 -0
- data/lib/honey_mushroom/graph.rb +63 -0
- data/lib/honey_mushroom/linked_list.rb +28 -0
- data/lib/honey_mushroom/node.rb +22 -0
- data/lib/honey_mushroom/queue.rb +26 -0
- data/lib/honey_mushroom/singly_linked_list.rb +24 -0
- data/lib/honey_mushroom/stack.rb +19 -0
- data/lib/honey_mushroom/stack_queue.rb +30 -0
- data/lib/honey_mushroom/undirected_graph.rb +27 -0
- data/spec/binary_search_tree_spec.rb +0 -0
- metadata +60 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b9c416987328997c19925df1a42d0d1496a79cf9
|
4
|
+
data.tar.gz: f7808bb5be33111b3d05dd152c06d707b47fd6e3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 312e5110c838f5b8699efbec5b918fc385fb89c30c2d5040f2c05d6f6b213b8b5ce29abd773e44db8980204e10661427f5ac390df5f2c5f3aa69a20553dca73d
|
7
|
+
data.tar.gz: 84c193602e6e34a727466209dab93ee91e0bfa1dac0a0f28802e3cef57724d817740c8ba0af4a5dda1cddc8209e93a322b3594ad688ebb188e1d19b510b21de8
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'honey_mushroom/binary_search_tree'
|
2
|
+
require 'honey_mushroom/breadth_first_search'
|
3
|
+
require 'honey_mushroom/depth_first_search'
|
4
|
+
require 'honey_mushroom/directed_graph'
|
5
|
+
require 'honey_mushroom/doubly_linked_list'
|
6
|
+
require 'honey_mushroom/linked_list'
|
7
|
+
require 'honey_mushroom/node'
|
8
|
+
require 'honey_mushroom/queue'
|
9
|
+
require 'honey_mushroom/singly_linked_list'
|
10
|
+
require 'honey_mushroom/stack_queue'
|
11
|
+
require 'honey_mushroom/stack'
|
12
|
+
require 'honey_mushroom/undirected_graph'
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'honey_mushroom/node'
|
2
|
+
|
3
|
+
class BinarySearchTree
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@head = nil
|
7
|
+
end
|
8
|
+
|
9
|
+
def set_head(value)
|
10
|
+
@head = Node.new({value: value, left: nil, right: nil})
|
11
|
+
end
|
12
|
+
|
13
|
+
def search(value, node=@head)
|
14
|
+
if value == node.value
|
15
|
+
return node.value
|
16
|
+
elsif value < node.value
|
17
|
+
search(value, node.left) unless node.left.nil?
|
18
|
+
elsif value > node.value
|
19
|
+
search(value, node.right) unless node.right.nil?
|
20
|
+
else
|
21
|
+
return nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def include?(value, node=@head)
|
26
|
+
!!search(value, node)
|
27
|
+
end
|
28
|
+
|
29
|
+
def delete(value)
|
30
|
+
delete_node(value, node=@head)
|
31
|
+
end
|
32
|
+
|
33
|
+
def insert(value, node=@head)
|
34
|
+
if node.value < value
|
35
|
+
insert_right(value, node)
|
36
|
+
elsif node.value > value
|
37
|
+
insert_left(value, node)
|
38
|
+
else
|
39
|
+
return false
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def delete_node(value, node)
|
46
|
+
if value == node
|
47
|
+
remove(value)
|
48
|
+
elsif node < value
|
49
|
+
delete_node(value, node.left)
|
50
|
+
else
|
51
|
+
delete_node(value, node.right)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def remove(node)
|
56
|
+
if node.left.nil? && node.right.nil?
|
57
|
+
node = nil
|
58
|
+
elsif !node.left.nil? && node.right.nil?
|
59
|
+
node = node.left
|
60
|
+
elsif node.left.nil? && !node.right.nil?
|
61
|
+
node = node.right
|
62
|
+
else
|
63
|
+
node = change_parant(node)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def change_paretn(node)
|
68
|
+
node.value = successor_value(node.right)
|
69
|
+
node.right = update(node.right)
|
70
|
+
node
|
71
|
+
end
|
72
|
+
|
73
|
+
def successor_value(node)
|
74
|
+
unless node.left.nil?
|
75
|
+
successor_value(node.left)
|
76
|
+
end
|
77
|
+
node.value
|
78
|
+
end
|
79
|
+
|
80
|
+
def update(node)
|
81
|
+
unless node.left.nil?
|
82
|
+
node.left = update(node)
|
83
|
+
end
|
84
|
+
node.right
|
85
|
+
end
|
86
|
+
|
87
|
+
def insert_left(value, node)
|
88
|
+
if node.left
|
89
|
+
insert(value, node.left)
|
90
|
+
else
|
91
|
+
node.left = Node.new({value: value, left: nil, right: nil})
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def insert_right(value, node)
|
96
|
+
if node.right
|
97
|
+
insert(value, node.right)
|
98
|
+
else
|
99
|
+
node.right = Node.new({value: value, left: nil, right: nil})
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module BreadthFirstSearch
|
2
|
+
|
3
|
+
def breadth_first_search_include?(node_id, target_node)
|
4
|
+
queue = []
|
5
|
+
visited_nodes = Hash.new(0)
|
6
|
+
queue << node_id
|
7
|
+
until queue.empty?
|
8
|
+
id = queue.shift
|
9
|
+
visited_nodes[id] += 1
|
10
|
+
if id == target_node && visited_nodes[id] < 2
|
11
|
+
return true
|
12
|
+
else
|
13
|
+
queue.concat(@nodes[id].edges) unless visited_nodes[id] >= 2
|
14
|
+
end
|
15
|
+
end
|
16
|
+
false
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module DepthFirstSearch
|
2
|
+
|
3
|
+
def depth_first_search_include?(node_id, target_node, visited_nodes=Hash.new {0})
|
4
|
+
return true if node_id == target_node
|
5
|
+
@nodes[node_id].edges.each do |child|
|
6
|
+
visited_nodes[child] += 1
|
7
|
+
return false if visited_nodes[child] >= 2
|
8
|
+
result = depth_first_search_include?(@nodes[child].id, target_node, visited_nodes)
|
9
|
+
return true unless result == false
|
10
|
+
end
|
11
|
+
false
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'honey_mushroom/node'
|
2
|
+
require 'honey_mushroom/linked_list'
|
3
|
+
|
4
|
+
class DoublyLinkedList < LinkedList
|
5
|
+
attr_accessor :tail
|
6
|
+
def initialize
|
7
|
+
super
|
8
|
+
@tail = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def add(value)
|
12
|
+
node = Node.new({value: value, next: nil, last: nil})
|
13
|
+
node.next = @head
|
14
|
+
@head = node
|
15
|
+
node.next.last = node unless node.next.nil?
|
16
|
+
@tail = node if @tail.nil?
|
17
|
+
end
|
18
|
+
|
19
|
+
def remove_front
|
20
|
+
current = @head
|
21
|
+
@head = current.next
|
22
|
+
current.next.last = nil
|
23
|
+
|
24
|
+
return current
|
25
|
+
end
|
26
|
+
|
27
|
+
def remove_back
|
28
|
+
current = @tail
|
29
|
+
@tail = current.last
|
30
|
+
current.last.next = nil
|
31
|
+
return current
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
def to_s
|
36
|
+
s = '@head<->'
|
37
|
+
current = @head
|
38
|
+
until current.nil?
|
39
|
+
s += "[#{current.value}]<->"
|
40
|
+
current = current.next
|
41
|
+
end
|
42
|
+
|
43
|
+
return s
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'honey_mushroom/node'
|
2
|
+
require 'honey_mushroom/depth_first_search'
|
3
|
+
require 'honey_mushroom/breadth_first_search'
|
4
|
+
|
5
|
+
class Graph
|
6
|
+
|
7
|
+
attr_accessor :nodes
|
8
|
+
include DepthFirstSearch
|
9
|
+
include BreadthFirstSearch
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@nodes = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_node(value, edges=[])
|
16
|
+
node = Node.new({value: value, edges: edges})
|
17
|
+
@nodes[node.id] = node
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_node(node_id)
|
22
|
+
@nodes.delete(node_id)
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_node_value(node_id)
|
26
|
+
@node[node_id].value
|
27
|
+
end
|
28
|
+
|
29
|
+
def set_node_value(node_id, value)
|
30
|
+
@nodes[node_id].value = value
|
31
|
+
end
|
32
|
+
|
33
|
+
def add_edge(node_id, edge)
|
34
|
+
@nodes[node_id].edges << edge
|
35
|
+
end
|
36
|
+
|
37
|
+
def delete_edge(node_id, edge_id)
|
38
|
+
@nodes[node_id].edges.delete(edge_id)
|
39
|
+
end
|
40
|
+
|
41
|
+
def adjacent?(node_id, edge)
|
42
|
+
@nodes[node_id].edges.include?(edge)
|
43
|
+
end
|
44
|
+
|
45
|
+
def neighbors(node_id)
|
46
|
+
@nodes[node_id].edges
|
47
|
+
end
|
48
|
+
|
49
|
+
#FIXIT: to_s broken for undirected graph
|
50
|
+
def to_s
|
51
|
+
s = ""
|
52
|
+
@nodes.each do |node_id, node|
|
53
|
+
s += "#{node_id} (#{node.value}) => #{node.edges} \n"
|
54
|
+
end
|
55
|
+
return s
|
56
|
+
end
|
57
|
+
|
58
|
+
def get_id_from_value(value)
|
59
|
+
#TODO
|
60
|
+
#find a fast way to get id from value
|
61
|
+
#returns an array of all node ids with a given value
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class LinkedList
|
2
|
+
attr_accessor :head
|
3
|
+
def initialize
|
4
|
+
@head = nil
|
5
|
+
end
|
6
|
+
|
7
|
+
def add(value)
|
8
|
+
node = Node.new({value: value, next: nil})
|
9
|
+
node.next = @head
|
10
|
+
@head = node
|
11
|
+
end
|
12
|
+
|
13
|
+
def remove_front
|
14
|
+
current = @head
|
15
|
+
@head = current.next
|
16
|
+
|
17
|
+
return current
|
18
|
+
end
|
19
|
+
|
20
|
+
def find(value)
|
21
|
+
current = @head
|
22
|
+
until current.value == value
|
23
|
+
current = current.next
|
24
|
+
end
|
25
|
+
|
26
|
+
return "Value: #{current.value} Next: #{current.next.value} ID: #{current.id}"
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class Node
|
2
|
+
@@auto_increment = 0
|
3
|
+
attr_reader :id
|
4
|
+
attr_accessor :value, :edges, :next, :last, :left,
|
5
|
+
:right, :value2, :value3, :value4
|
6
|
+
|
7
|
+
def initialize(args={})
|
8
|
+
@value = args.fetch(:value, nil)
|
9
|
+
@edges = args.fetch(:edges, nil) if args.include?(:edges )
|
10
|
+
@next = args.fetch(:next, nil) if args.include?(:next )
|
11
|
+
@last = args.fetch(:last, nil) if args.include?(:last )
|
12
|
+
@left = args.fetch(:left, nil) if args.include?(:left )
|
13
|
+
@right = args.fetch(:right, nil) if args.include?(:right )
|
14
|
+
@value2 = args.fetch(:value2, nil) if args.include?(:value2)
|
15
|
+
@value3 = args.fetch(:value3, nil) if args.include?(:value3)
|
16
|
+
@value4 = args.fetch(:value4, nil) if args.include?(:value4)
|
17
|
+
|
18
|
+
@id = args.fetch(:id, @@auto_increment)
|
19
|
+
|
20
|
+
@@auto_increment += 1
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class Queue
|
2
|
+
def initialize
|
3
|
+
@queue = []
|
4
|
+
end
|
5
|
+
|
6
|
+
def enqueue(value)
|
7
|
+
@queue.push(value)
|
8
|
+
return value
|
9
|
+
end
|
10
|
+
|
11
|
+
def dequeue
|
12
|
+
@queue.shift
|
13
|
+
end
|
14
|
+
|
15
|
+
def peek
|
16
|
+
@queue[0]
|
17
|
+
end
|
18
|
+
|
19
|
+
def enq(value) #shorthand = less typing =)
|
20
|
+
enqueue(value)
|
21
|
+
end
|
22
|
+
|
23
|
+
def dq #shorthand = less typing =)
|
24
|
+
dequeue
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'honey_mushroom/linked_list'
|
2
|
+
|
3
|
+
class SinglyLinkedList < LinkedList
|
4
|
+
|
5
|
+
def remove_back
|
6
|
+
current = @head
|
7
|
+
current = current.next until current.next.next.nil?
|
8
|
+
node = current.next
|
9
|
+
current.next = nil
|
10
|
+
|
11
|
+
return node
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_s
|
15
|
+
s = '@head->'
|
16
|
+
current = @head
|
17
|
+
until current.nil?
|
18
|
+
s += "[#{current.value}]->"
|
19
|
+
current = current.next
|
20
|
+
end
|
21
|
+
|
22
|
+
return s
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'honey_mushroom/stack'
|
2
|
+
|
3
|
+
class StackQueue
|
4
|
+
attr_accessor :stack_one, :stack_two
|
5
|
+
def initialize
|
6
|
+
@stack_one = Stack.new
|
7
|
+
@stack_two = Stack.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def enqueue(value)
|
11
|
+
stack_one.push(value)
|
12
|
+
end
|
13
|
+
|
14
|
+
def dequeue
|
15
|
+
if stack_two.stack.empty?
|
16
|
+
stack_two.push(stack_one.pop) until stack_one.stack.empty?
|
17
|
+
end
|
18
|
+
|
19
|
+
stack_two.pop
|
20
|
+
end
|
21
|
+
|
22
|
+
def enq(value) #shorthand = less typing =)
|
23
|
+
enqueue(value)
|
24
|
+
end
|
25
|
+
|
26
|
+
def dq #shorthand = less typing =)
|
27
|
+
dequeue
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'honey_mushroom/graph'
|
2
|
+
|
3
|
+
class UndirectedGraph < Graph
|
4
|
+
|
5
|
+
def add_node(value, edges=[])
|
6
|
+
node = Node.new({value: value, edges: edges})
|
7
|
+
@nodes[node.id] = node
|
8
|
+
edges.each { |edge| add_edge(edge, node.id) }
|
9
|
+
self
|
10
|
+
end
|
11
|
+
|
12
|
+
def delete_node(node_id)
|
13
|
+
all_edges = @nodes[node_id].edges.dup
|
14
|
+
all_edges.each { |edge| delete_edge(node_id, edge); p edge}
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_edge(node_id, edge)
|
19
|
+
super
|
20
|
+
@nodes[edge].edges << node_id
|
21
|
+
end
|
22
|
+
|
23
|
+
def delete_edge(node_id, edge_id)
|
24
|
+
@nodes[edge_id].edges.delete(node_id)
|
25
|
+
super
|
26
|
+
end
|
27
|
+
end
|
File without changes
|
metadata
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: honey_mushroom
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Riley Scheid
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-05-04 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Honey Mushroom builds and traverses common abstract data structures in
|
14
|
+
Ruby
|
15
|
+
email: riley.k.scheid@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/honey_mushroom.rb
|
21
|
+
- lib/honey_mushroom/binary_search_tree.rb
|
22
|
+
- lib/honey_mushroom/breadth_first_search.rb
|
23
|
+
- lib/honey_mushroom/depth_first_search.rb
|
24
|
+
- lib/honey_mushroom/directed_graph.rb
|
25
|
+
- lib/honey_mushroom/doubly_linked_list.rb
|
26
|
+
- lib/honey_mushroom/graph.rb
|
27
|
+
- lib/honey_mushroom/linked_list.rb
|
28
|
+
- lib/honey_mushroom/node.rb
|
29
|
+
- lib/honey_mushroom/queue.rb
|
30
|
+
- lib/honey_mushroom/singly_linked_list.rb
|
31
|
+
- lib/honey_mushroom/stack.rb
|
32
|
+
- lib/honey_mushroom/stack_queue.rb
|
33
|
+
- lib/honey_mushroom/undirected_graph.rb
|
34
|
+
- spec/binary_search_tree_spec.rb
|
35
|
+
homepage: http://www.github.com/sp33drac3r/honey_mushroom
|
36
|
+
licenses:
|
37
|
+
- MIT
|
38
|
+
metadata: {}
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
requirements: []
|
54
|
+
rubyforge_project:
|
55
|
+
rubygems_version: 2.4.5.1
|
56
|
+
signing_key:
|
57
|
+
specification_version: 4
|
58
|
+
summary: Graphs & Traversals
|
59
|
+
test_files:
|
60
|
+
- spec/binary_search_tree_spec.rb
|