ptrie 1.0.0

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
+ SHA256:
3
+ metadata.gz: 81802d98f47402dd56f3c7c91e945b87f5b849edcce8cf520a520135fef9ccf1
4
+ data.tar.gz: 3b818cb33bf00f1dd52441cc28099221cc9e295190844b30797d0a4d65148138
5
+ SHA512:
6
+ metadata.gz: bb7a1ff648ee0d2df6b8e80c195a8ca49d26503dfed33d5059252c5b9f57b3a8aecec645b77f29752882fa6d635cb84cb485e75084fedd1c810bef39531d8eea
7
+ data.tar.gz: bbbed0406c061d73ffd54a38ded3937182bb7f8a67350deccebba1e4e51c07c9d330ffc998e664fd128c2de8559931fb8f391f946560650d24160172be4fa2aa
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ require 'csv'
3
+
4
+ class Csv
5
+ attr_accessor :path
6
+
7
+ def initialize
8
+ @path = 'lib/data.csv'
9
+ end
10
+
11
+ def save_to_csv(word_list)
12
+ puts word_list.to_s
13
+ CSV.open(path, 'a') do |csv|
14
+ csv << word_list
15
+ end
16
+ puts 'Successfully added to CSV'
17
+ end
18
+
19
+ def read_from_csv
20
+ CSV.parse(File.read(@path), converters: :all)
21
+ end
22
+ end
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../lib/prefix_tree_node'
4
+ require_relative '../lib/csv_controller'
5
+ require 'csv'
6
+
7
+ class PrefixTree
8
+ attr_accessor :root
9
+
10
+ def initialize
11
+ @root = PrefixTreeNode.new('')
12
+ @dictionay = []
13
+ @csv_dictionary = Csv.new
14
+ end
15
+
16
+ def add_word(word)
17
+ @dictionay << word
18
+ letters = word.chars
19
+ base = @root
20
+ letters.each { |letter| base = add_letter(letter, base.next) }
21
+ puts "you added #{word} sucsesfuly"
22
+ base.word = true
23
+ end
24
+
25
+ def find_word(word)
26
+ letters = word.chars
27
+ base = @root
28
+
29
+ found_word = letters.all? { |letter| base = find_character(letter, base.next) }
30
+ yield found_word if block_given?
31
+
32
+ base ? base.word : false
33
+ end
34
+
35
+ def includes?(word)
36
+ find_word(word) { |found| return found }
37
+ end
38
+
39
+ def list(prefix = nil)
40
+ prefix = '' if prefix.nil?
41
+ listlist(prefix)
42
+ end
43
+
44
+ def delete_word(word)
45
+ @dictionay.delete(word)
46
+ delete_recursively(word, 0, root)
47
+ end
48
+
49
+ def write_csv
50
+ @csv_dictionary.save_to_csv(list)
51
+ end
52
+
53
+ def read_csv
54
+ qwe = @csv_dictionary.read_from_csv
55
+ qwe.each { |_, word| add_word(word.to_s) }
56
+ end
57
+
58
+ private
59
+
60
+ def listlist(prefix)
61
+ result = []
62
+ @dictionay.each { |word| result << word if word.start_with?(prefix) }
63
+ result.length.zero? ? 'word is not in dictionary' : result
64
+ end
65
+
66
+ def add_letter(character, trie)
67
+ trie.find { |n| n.value == character } || add_node(character, trie)
68
+ end
69
+
70
+ def add_node(character, trie)
71
+ PrefixTreeNode.new(character).tap { |new_node| trie << new_node }
72
+ end
73
+
74
+ def find_words_with_prefix(word)
75
+ letters = word.chars
76
+ base = @root
77
+ letters.all? { |letter| base = find_character(letter, base.next) }
78
+ base
79
+ end
80
+
81
+ def find_character(character, trie)
82
+ trie.find { |n| n.value == character }
83
+ end
84
+
85
+ def delete_each(current, char, should_delete_ref)
86
+ if should_delete_ref
87
+ current.children.delete(char)
88
+ current.children.length.zero?
89
+ end
90
+ end
91
+
92
+ def delete_recursively(word, index, root)
93
+ current = root
94
+
95
+ in_trie?(word, index, current)
96
+
97
+ char = word[index]
98
+ return false unless current.children.include?(char)
99
+
100
+ next_node = current.children[char]
101
+ should_delete_ref = delete_recursively(word, index + 1, next_node)
102
+
103
+ delete_each(current, char, should_delete_ref)
104
+ false
105
+ end
106
+
107
+ def in_trie?(word, index, current)
108
+ if index == word.length
109
+ return false unless current.is_end
110
+
111
+ current.is_end = false
112
+ current.children.length.zero?
113
+ end
114
+ end
115
+ end
116
+
117
+ trie = PrefixTree.new
118
+ # trie.read_csv
119
+ trie.add_word('cat')
120
+ # trie.add_word('caps')
121
+ # trie.add_word('cattle')
122
+ # puts trie.find_word('caps')
123
+ # puts trie.includes?('ca')
124
+ # trie.delete_word('cattle')
125
+ # trie.write_csv
126
+ puts trie.list()
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PrefixTreeNode
4
+ attr_reader :value, :next
5
+ attr_accessor :is_end, :children, :word
6
+
7
+ def initialize(value)
8
+ @value = value
9
+ @word = false
10
+ @next = []
11
+ @children = Array.new(26)
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ptrie
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Beka
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-05-13 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A simple Prefix Tree
14
+ email: barishvili@unisens.ge
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/csv_controller.rb
20
+ - lib/prefix_tree.rb
21
+ - lib/prefix_tree_node.rb
22
+ homepage: https://rubygems.org/gems/ptrie
23
+ licenses:
24
+ - MIT
25
+ metadata: {}
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ required_rubygems_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ requirements: []
41
+ rubygems_version: 3.2.3
42
+ signing_key:
43
+ specification_version: 4
44
+ summary: Prefix Tree!
45
+ test_files: []