versucht, die Daten-Struktur Umsetzung... Anwendung - Wörterbuch

Wollte ein Programm schreiben, das zu implementieren, ein Wörterbuch der Wörter, die mit Versucht Datenstruktur.

Bitte sagen Sie mir die Struktur für die Umsetzung, so dass ich konnte das Programm starten, so habe ich keine Artikel über das internet Versucht der Umsetzung.

Die Verwirrung ist, dass, wenn wir uns auf die Suche durch das Wort, und das bekommen wir durch das Wort an den Blatt-Knoten, nur ist dann der Sinn des Wortes gespeichert werden würde.. Aber alle Knoten Versucht, die Daten-Struktur von Abfällen. d.h. speichern von Variablen von Bedeutung, die in jedem internen Knoten......

Also, die grundlegende Idee, mit Hilfe von kleinen Beispiel wie Sie zu speichern Wörterbuch, bitte lassen Sie mich wissen, die Struktur, Versucht der Struktur der Daten..

Bitte C-Programm Umsetzung.

Dank..

Komprimiert Versucht.. Dies gibt mir die richtige Komprimierter Trie, wie erwartet,,,, aber es gibt einige Probleme mit ihm.... Und wollte diskutieren....

1) ich Baue eine einfache versuche zuerst, und dann komprimiert Sie mit Hilfe einer Funktion trie_compress(), wenn ich Jetzt hinzufügen möchten jedem Wort, es möchte eine geänderte trie_add(), verändert sich auch trie_lookup(), ok ich werde dies auf meine eigene, ich wollte nur wissen, ist mein Ansatz richtig, oder es könnte etwas besser Weg..

2) In trie_new(), ich habe t->substr = (char*)malloc(10);,,,,,, Dies sieht nicht effizient, wie Speicher zugeordnet werden soll, wie in, wenn erforderlich. Können wir uns verbessert werden kann.

typedef struct trie
{
   int on;
   char *substr;
   struct trie *first_child;
   struct trie *next_sibling;
}trie;

trie* trie_new()
{
   trie *t = (trie*)malloc(sizeof(trie));
   t->substr = (char*)malloc(10);
   t->on = 0;
   t->substr[0] = '\0';
   t->first_child = NULL;
   t->next_sibling = NULL;

   return t;
}

trie* trie_at_level(trie *t, char c)
{
   while(t != NULL)
   {
      if(t->substr[0] == c)
      {
         return t;
      }
      t = t->next_sibling;
   }
   return NULL;
}

void trie_add(trie *t, const char *str)
{
   const int n = strlen(str);
   int i;

   for(i=0; i<n; i++)
   {
      const char c = str[i];
      trie* parent = t;

      t = t->first_child;
      t = trie_at_level(t,c);
      if(t == NULL)
      {
         t = trie_new();
         t->substr[0] = c;
         t->substr[1] = '\0';
         t->next_sibling = parent->first_child;
         parent->first_child = t;
      }
   }
   t->on = 1;
}

int trie_lookup(trie *t, const char *str)
{
   const int n = strlen(str);
   int i;

   for(i=0; i<n; i++)
   {
      const char c = str[i];
      t = t->first_child;
      t = trie_at_level(t,c);
      if(t == NULL)
         return 0;
   }
   return t->on;
}

void trie_compress(trie *t)
{
   trie* parent = t;
   t = t->first_child;

   if(t->first_child != NULL)
      trie_compress(t);

   if(t->next_sibling == NULL)
   {
      parent->substr = strcat(parent->substr,t->substr);
      parent->first_child = t->first_child;
      parent->on = t->first_child->on;
      free(t);

      return;
   }
   else
      trie_compress(t->next_sibling);
}
Sie könnte beginnen mit einer Antwort, jemand hat Ihnen gestern: stackoverflow.com/questions/3306279/...

InformationsquelleAutor AGeek | 2010-07-23

Schreibe einen Kommentar