尝试和后缀树实现

我学习了Tries和Suffix Trees,并想实现它。 请分享一些链接,我可以从中了解实施的结构和基本思路。

任何好的例子,如果包括,将是一个加号。

在C中实现


C算法库(http://fragglet.github.io/c-algorithms/)提供了C语言的Trie实现。它是开源的,带有BSD风格的许可证。

C中的后缀树实现可以在这里找到:https://github.com/0xtonyxia/suffix-tree

我希望有所帮助。


#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>

typedef struct trie trie;
struct trie
{
       char key;
       trie *next,*children;
};

trie *newnode(char s)
{
     trie *t=(trie *)malloc(sizeof(trie));
     t->key=s;
     t->next=t->children=NULL;
}

void insert(trie **t,char *s,int start)
{if(s[start]=='')
                   {
                          *t=newnode('#');
                          return;
                   } 
                   if(*t==NULL)
                   {
                               *t=newnode(s[start]);
                               insert(&(*t)->children,s,start+1);
                   }       
                   if((*t)->key==s[start])
                   insert(&(*t)->children,s,start+1);
                   else
                   insert(&(*t)->next,s,start);
}


bool search(trie *t ,char *s,int start)
{


     if(t==NULL)
     return false;

     if(t->key=='#' && s[start]=='')
     return true;

     if(t->key!='#' && s[start]=='' || t->key=='#' && s[start]!='')
     return false;

     if(t->key==s[start])
     return search(t->children,s,start+1);

     else
     return search(t->next,s,start);

     return false;
}

/*void push(trie **t ,char *str)
{                        int i=0;
                         for(i=0;i<strlen(str);i++)
                         insert(t,str[i]);
}*/

main()
{     int i=0;

      trie *t=NULL;
      char ch='y';
      while(ch=='y')
      {             
                    {char str[20];
                    fflush(stdin);
                    printf("Enter the word ");
                    gets(str);


                    insert(&t,str,0);
                    }
                   // push(&t,str);
                    fflush(stdin);
                    printf("more y/n ::");
                    ch=getchar();
      }

      ch='y';
      while(ch=='y')
      {char str[20];
      fflush(stdin);
      printf("Enter the string you want to search::");
      gets(str);

      fflush(stdin);
      if(search(t,str,0))
      printf("Found");
      else
      printf("Not Found");

      printf("n more y/n ::");
      scanf("%c",&ch);

      }

    getch();  

}

以下是我发现的非常有用的链接。

6个小时的后缀树讲座(第3讲到第5讲)Google SCICOMP第5讲(最长公共子串问题:O(n)后缀树,排序后缀)

通用后缀树实现http://www.geeksforgeeks.org/generalized-suffix-tree-1/

用后缀树快速搜索字符串http://marknelson.us/1996/08/01/suffix-trees/

在wikipedia上查找Ukkonen算法。 注意:不能发布超过2个链接会导致声誉不够。

链接地址: http://www.djcxy.com/p/40093.html

上一篇: Tries and Suffix Trees implementation

下一篇: When do we actually use a Trie?