honey_mushroom 0.0.1

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