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 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,2 @@
1
+ require 'honey_mushroom/graph'
2
+ class DirectedGraph < Graph; 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,19 @@
1
+ class Stack
2
+ attr_accessor :stack
3
+ def initialize
4
+ @stack = []
5
+ end
6
+
7
+ def push(value)
8
+ stack.push(value)
9
+ return value
10
+ end
11
+
12
+ def pop
13
+ stack.pop
14
+ end
15
+
16
+ def peek
17
+ stack[-1]
18
+ end
19
+ 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