pretree 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/lib/file_writer.rb +19 -0
  3. data/lib/pretree.rb +99 -0
  4. metadata +44 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b12f0c90e7b27da6ade9b14e430c1386d6108b53cac874700e403a4332ff7977
4
+ data.tar.gz: c7c97966a45bc4e0bb37c30f08cd0f6fd442c1a9442d37957e696ba40a3f2430
5
+ SHA512:
6
+ metadata.gz: 84ebe54d5e3767dc4515fddbf8ecf6aa639b79180629e4e896479d753caab296e0c88a51aff0bde7df04d5df61fdb63654f8298062a38795dc94e1998196fd69
7
+ data.tar.gz: f98c580d93eae6909934251c04a87377dff3567eb7b3e04a90b447a8df2923434b90fd2838c0caf6f1a457281d0801d24fec2e80f44a8bee02b2d7a3c88bad46
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'csv'
4
+
5
+ class CSVWrite
6
+ def initialize
7
+ @path = '../data.csv'
8
+ end
9
+
10
+ def write(word)
11
+ CSV.open(@path, 'a') do |csv|
12
+ csv << [word]
13
+ end
14
+ end
15
+
16
+ def read
17
+ CSV.read(@path)
18
+ end
19
+ end
data/lib/pretree.rb ADDED
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'file_writer'
4
+
5
+ # Prefix tree (Node class)
6
+ class Node
7
+ attr_reader :value, :next
8
+ attr_accessor :word
9
+
10
+ def initialize(value)
11
+ @value = value
12
+ @word = false
13
+ @next = []
14
+ end
15
+ end
16
+
17
+ # Prefix tree (Trie class)
18
+ class PreTree
19
+ def initialize
20
+ @root = Node.new('root')
21
+ @csv_box = CSVWrite.new
22
+ end
23
+
24
+ def csv_write(word)
25
+ @csv_box.write(word)
26
+ end
27
+
28
+ def csv_read
29
+ @csv_box.read
30
+ end
31
+
32
+ def add_node(character, trie)
33
+ Node.new(character).tap { |new_node| trie << new_node }
34
+ end
35
+
36
+ def add_character(character, trie)
37
+ trie.find { |n| n.value == character } || add_node(character, trie)
38
+ end
39
+
40
+ def find_character(character, trie)
41
+ trie.find { |n| n.value == character }
42
+ end
43
+
44
+ def add_word(word)
45
+ csv_write(word)
46
+ letters = word.chars
47
+ base = @root
48
+ letters.each { |letter| base = add_character(letter, base.next) }
49
+ base.word = true
50
+ end
51
+
52
+ def find_word(word)
53
+ letters = word.chars
54
+ base = @root
55
+ word_found = letters.all? { |letter| base = find_character(letter, base.next) }
56
+ yield word_found, base if block_given?
57
+ base
58
+ end
59
+
60
+ def find?(word)
61
+ find_word(word) { |found, base| return found && base.word }
62
+ end
63
+
64
+ def include?(word)
65
+ find_word(word) { |found| return found }
66
+ end
67
+
68
+ def delete(word)
69
+ find_word(word) do |found, base|
70
+ base.word = false if found == true
71
+ end
72
+ end
73
+
74
+ def list(prefix = nil)
75
+ return @dictionary if prefix.nil?
76
+
77
+ @stack = []
78
+ @dictionary = []
79
+ @prefix_stack = []
80
+ @stack << find_word(prefix)
81
+ @prefix_stack << prefix.chars.take(prefix.size - 1)
82
+ return [] unless @stack.first
83
+
84
+ empty_stack
85
+ @dictionary
86
+ end
87
+
88
+ def empty_stack
89
+ until @stack.empty?
90
+ node = @stack.pop
91
+ @prefix_stack.pop and next if node == :guard_node
92
+
93
+ @prefix_stack << node.value
94
+ @stack << :guard_node
95
+ @dictionary << @prefix_stack.join if node.word
96
+ node.next.each { |n| @stack << n }
97
+ end
98
+ end
99
+ end
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pretree
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Tornike Ormotsadze
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-05-11 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A simple prefix trie gem
14
+ email: tormotsadze@unisens.ge
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/file_writer.rb
20
+ - lib/pretree.rb
21
+ homepage: https://rubygems.org/gems/prefixtree
22
+ licenses:
23
+ - MIT
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubygems_version: 3.2.3
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: prefixtree
44
+ test_files: []