RubyTrie 2.1 → 2.2
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.
- data/ChangeLog +2 -1
- data/ext/trie/otrie2.c +12 -3
- data/ext/trie/otrie2.h +1 -0
- data/ext/trie/ruby_trie.c +2 -4
- metadata +4 -4
data/ChangeLog
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
1.0 added children and each methods
|
2
2
|
1.1 added levenshtein algorithm implementation - inspired from: http://stevehanov.ca/blog/index.php?id=114
|
3
3
|
2.0 completely rewritten the trie implementation to use more optimized data structure. For /usr/share/dict/web2 it takes the memory to about 6Mb from 40Mb. The levenshtein now takes a block and passes in the value but it can be easy extened to return an array. It also has a glitch where some values are for some reason just false... :|
|
4
|
-
2.1 bug fixes, fixing levenshtein search
|
4
|
+
2.1 bug fixes, fixing levenshtein search
|
5
|
+
2.2 fixes child search
|
data/ext/trie/otrie2.c
CHANGED
@@ -13,6 +13,8 @@
|
|
13
13
|
|
14
14
|
#include "otrie2.h"
|
15
15
|
|
16
|
+
Node* node_find_impl(Node* this, const char* string, bool include_partial);
|
17
|
+
|
16
18
|
Node* new_node() {
|
17
19
|
Node *node = malloc(sizeof(Node));
|
18
20
|
memset(node, 0, sizeof(Node));
|
@@ -61,6 +63,14 @@ void node_insert(Node* node, const char* string, const VALUE value) {
|
|
61
63
|
}
|
62
64
|
|
63
65
|
Node* node_find(Node* this, const char* string) {
|
66
|
+
return node_find_impl(this, string, false);
|
67
|
+
}
|
68
|
+
|
69
|
+
Node* partial_node_find(Node* this, const char* string) {
|
70
|
+
return node_find_impl(this, string, true);
|
71
|
+
}
|
72
|
+
|
73
|
+
Node* node_find_impl(Node* this, const char* string, bool include_partial) {
|
64
74
|
int len = strlen(string);
|
65
75
|
Pos *cur = new_pos(this, 0);
|
66
76
|
int i=0;
|
@@ -68,7 +78,7 @@ Node* node_find(Node* this, const char* string) {
|
|
68
78
|
pos_next(cur, string + i, false);
|
69
79
|
if (cur->node == NULL) { return NULL; }
|
70
80
|
}
|
71
|
-
if (strlen(cur->node->data) == cur->offset + 1)
|
81
|
+
if (strlen(cur->node->data) == cur->offset + 1 || include_partial)
|
72
82
|
return cur->node;
|
73
83
|
return NULL;
|
74
84
|
}
|
@@ -129,11 +139,10 @@ void pos_next(Pos *this, const char* string, bool insert) {
|
|
129
139
|
Node *splitChild = new_node_string(this->node->data + this->offset + 1);
|
130
140
|
splitChild -> value = this -> node -> value;
|
131
141
|
Node *newChild = new_node_string(string);
|
132
|
-
|
142
|
+
newChild -> value = Qnil;
|
133
143
|
node_update_data(this->node, this->node->data, this->offset + 1);
|
134
144
|
splitChild -> next_sibling = newChild;
|
135
145
|
this->node -> first_child = splitChild;
|
136
|
-
this->node -> value = Qnil;
|
137
146
|
|
138
147
|
this->node = newChild;
|
139
148
|
this->offset = 0;
|
data/ext/trie/otrie2.h
CHANGED
@@ -33,6 +33,7 @@ Node* new_node();
|
|
33
33
|
void free_node(Node*);
|
34
34
|
void node_insert(Node* node, const char* string, const VALUE value);
|
35
35
|
Node* node_find(Node* this, const char* string);
|
36
|
+
Node* partial_node_find(Node* this, const char* string);
|
36
37
|
|
37
38
|
Pos* new_pos(Node *node, int offset);
|
38
39
|
Node* pos_find_or_create_child(Pos* this, const char* string, bool down, bool insert);
|
data/ext/trie/ruby_trie.c
CHANGED
@@ -117,7 +117,7 @@ static VALUE rb_trie_find_children(VALUE self, VALUE key) {
|
|
117
117
|
key_cstring = StringValuePtr(key);
|
118
118
|
Data_Get_Struct(self, Node, root);
|
119
119
|
|
120
|
-
node =
|
120
|
+
node = partial_node_find(root, key_cstring);
|
121
121
|
|
122
122
|
if (node != NULL && node->value != Qnil) {
|
123
123
|
rb_ary_push(rary, node->value);
|
@@ -144,7 +144,7 @@ static VALUE rb_trie_find_children_with_block(VALUE self, VALUE key) {
|
|
144
144
|
key_cstring = StringValuePtr(key);
|
145
145
|
Data_Get_Struct(self, Node, root);
|
146
146
|
|
147
|
-
node =
|
147
|
+
node = partial_node_find(root, key_cstring);
|
148
148
|
|
149
149
|
if (node != NULL && node->value != Qnil) {
|
150
150
|
rb_yield(node->value);
|
@@ -168,12 +168,10 @@ static VALUE rb_trie_set_key_to_value(VALUE self, VALUE key, VALUE value) {
|
|
168
168
|
|
169
169
|
node = node_find(root, key_cstring);
|
170
170
|
if (node == NULL || node -> value == Qnil) {
|
171
|
-
// printf("New node for %s -> %d\n", key_cstring, value);
|
172
171
|
VALUE arr = rb_ary_new();
|
173
172
|
rb_ary_push(arr, value);
|
174
173
|
node_insert(root, key_cstring, arr);
|
175
174
|
} else {
|
176
|
-
// printf("Append value %s to %s -> %d\n", node->data, key_cstring, node->value);
|
177
175
|
rb_ary_push(node->value, value);
|
178
176
|
}
|
179
177
|
|
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: RubyTrie
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 7
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: "2.
|
8
|
+
- 2
|
9
|
+
version: "2.2"
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Petrica Ghiurca
|
@@ -15,7 +15,7 @@ autorequire: trie
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-03-
|
18
|
+
date: 2011-03-26 23:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|