前缀树学习

来源:互联网 发布:网络摄像头一天多少g 编辑:程序博客网 时间:2024/05/17 01:42

Trie(也叫前缀树)

Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。

Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
它有3个基本性质:

1,根节点不包含字符,除根节点外每一个节点都只包含一个字符。

2,从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。

3,每个节点的所有子节点包含的字符都不相同。
这里写图片描述

前缀树模板:

#include"iostream"#include"string.h"using namespace std;const int maxnode=1e4;const int size=30;struct trie{    int ch[maxnode][size];  //保存子节点    int val[maxnode];    int sz;   //节点总数    trie()  //初始时只有一个根节点    {        sz=1;        memset(ch[0],0,sizeof(ch[0]));    }    int idx(char c)  //将char型转化为int型    {        return c-'a';    }    void insert(char *s,int v)//插入字符串s,字符串附加信息为v,当val[u]!=0代表该字符串结束    {        int u=0;        int l=strlen(s);        for(int i=0;i<l;i++)        {            int c=idx(s[i]);            if(!ch[u][c])  //如果节点不存在            {                memset(ch[sz],0,sizeof(ch[sz]));                ch[u][c]=sz++;  //创建新的节点                val[u]=0;  //中间节点无附加信息            }            u=ch[u][c];  //向下走        }        val[u]=v;  //字符串尾加上附加信息v    }    bool find(char *s)  //判断s是否为已插入字符串的前缀    {        int u=0;        int l=strlen(s);        for(int i=0;i<l;i++)        {            int c=idx(s[i]);            if(!ch[u][c])            return false;            u=ch[u][c];        }        return true;    }};int main(){    trie jj;    char ai[][30]={"明明","静静","你是猪吗","张老三我问你你的家在哪里"};    for(int i=0;i<4;i++)    {        jj.insert(ai[i],1);    }     cout<<jj.find("张老三我问你")<<endl;    return 0;}

科赫曲线这里写图片描述这里写图片描述这里写图片描述

原创粉丝点击