Browse Source

change Trie

Olivier Marty 8 years ago
parent
commit
4554bac142
2 changed files with 44 additions and 21 deletions
  1. 35 21
      code/Trie.cpp
  2. 9 0
      code/Trie_test.cpp

+ 35 - 21
code/Trie.cpp

@@ -1,25 +1,39 @@
-const int maxnode = 40000;
-const int sigma_size = 26;
-struct Trie {
-  int ch[maxnode][sigma_size];
-  int val[maxnode];
-  int sz; //nombre de noeuds
-  void clear() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); } // initialisation
-  int idx(char c) { return c - 'a'; }
-  void insert(const char *s, int v) {
-    int u = 0, n = strlen(s);
-    for(int i = 0; i < n; i++) {
-      int c = idx(s[i]);
-      if(!ch[u][c]) { // il y'a pas de noeud correspondant
-        memset(ch[sz], 0, sizeof(ch[sz]));
-        val[sz] = 0;
-        ch[u][c] = sz++;
-      }
-      u = ch[u][c];
+struct node { char a; int b,c,n; };
+// Set r = -1 for the first call to insert
+int insert(int *r, const char *s, node t[], int &m) {
+  if(!*s) return 0;
+  while(true) {
+    while(*r != -1 && t[*r].a != *s) r = &t[*r].b;
+    if(*r == -1) {
+      t[m].a=*s;
+      t[m].b = t[m].c = -1;
+      t[m].n = 0;
+      *r=m++;
     }
-    val[u] = v;
+    if(*++s) r=&(t[*r].c);
+    else return ++t[*r].n;
   }
-  void find(char *s){
-    //TODO
+}
+// return -1=Not found, 0=not found but preffix, >0=found
+int match(int r, const char *s, node*t) {
+  if(!*s) return -1;
+  while(true) {
+    while(r!=-1 && t[r].a != *s) r=t[r].b;
+    if(r == -1) return -1;
+    if(*++s) r=t[r].c; else return t[r].n;
   }
 }
+void test() {
+  node n[256];
+  int r = -1, m;
+  insert(&r, "coucou", n, m);
+  insert(&r, "ca", n, m);
+  insert(&r, "va", n, m);
+  assert(match(r, "coucou", n) > 0);
+  assert(match(r, "ca", n) > 0);
+  assert(match(r, "va", n) > 0);
+  assert(match(r, "c", n) == 0);
+  assert(match(r, "co", n) == 0);
+  assert(match(r, "z", n) == -1);
+  assert(match(r, "v", n) == 0);
+}

+ 9 - 0
code/Trie_test.cpp

@@ -0,0 +1,9 @@
+#include <bits/stdc++.h>
+using namespace std;
+
+#include "Trie.cpp"
+
+int main() {
+  test();
+  return 0;
+}