honey_mushroom 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|