zoukankan      html  css  js  c++  java
  • 浅谈Trie树(字典树)

    定义:Trie,又称字典树,是一种用于实现字符串快速检索的多叉树结构。Trie的每个节点都拥有若干个字符指针,若在插入或检索字符串时扫描到一个字符(c),就沿着当前节点的(c)这个字符指针,走向该指针指向的节点。


    基本特点

    • 每条树边上仅包含一个字符
    • 从根节点到某一个节点,路径上经过字符顺次连接形成的串,为该节点对应的字符串
    • 每个节点对应的字符串各不相同,且一定为给定字典中某个串的前缀

    初始化:一颗空Trie树仅包含一个节点,该点的字符指针均指向空


    插入:当需要插入一个字符串(s)时,我们令一个指针(p)起初指向根节点。然后,依次扫描(s)中的每个字符(c):

    • (p)(c)字符指针指向一个已经存在的节点(Q),则令(p=Q)。(即(c)字符指针匹配到了相同的字符)
    • (p)(c)字符指针指向空,则新建一个节点(Q),令(p)(c)字符指针指向(Q),然后令(p=Q)(即(c)字符指针没有匹配到相同的字符)

    (s)中的字符扫描完毕时,若当前节点(p)被标记为一个字符串的末尾,则说明(s)在Trie树中存在,否则说明(s)没有被插入过Trie。

    检索:当需要检索一个字符串(s)在Trie树中是否存在时,我们令一个指针(p)起初指向根节点,然后依次扫描(s)中的每个节点(c)

    • (p)(c)指针指向空,则说明(s)没有被插入过Trie,结束检索
    • (p)(c)字符指针指向一个已经存在的节点(Q),则令(p=Q)
      (s)中的字符扫描完毕时,若当前节点(p)被标记为一个字符串的末尾,则说明(s)在Trie中存在,否则说明(s)没有被插入过Trie。

    字符串集{A,i,inn,to,tea,ted,ten}的Trie树如下:

    上图中红色标记了单词的末尾节点。可以看出Trie中,字符数据都体现在树的边(指针)上,树的节点仅保存一些额外信息,例如单词结尾标记等。其空间复杂度是(O(NC))


    代码实现

    int tot=1;
    bool end[4*maxn];
    int trie[4*maxn][26];
    void ins(char *str)
    {
    	int len=strlen(str),p=1;
    	for(int i=0;i<len;i++)
    	{
    		int ch=str[i]-'a';
    		if(!trie[p][ch])trie[p][ch]=++tot;
    		p=trie[p][ch];
    	}
    	end[p]=true;
    }
    int search(char *str)
    {
    	int len=strlen(str),p=1;
    	for(int i=0;i<len;i++)
    	{
    		p=trie[p][str[i]-'a'];
    		if(!p)return false;
    	}
    	return end[p];
    }
    
  • 相关阅读:
    自动化流程完成打包 IPA 到 上传 AppStore(部分)
    dex2jar jd_jui 反编译apk
    mac 系统常用小工具
    从 Jira page 上获取信息和下载附件
    python zip文件处理 之 zipfile模块
    showDoc 自动创建文档分析
    Unable to install ‘*****’
    自动化流程完成 打包 IPA 到 上传 AppStore 之 iOS IPA签名
    灰度图片和灰度颜色(代码里面只是一些相关的方法替换按需选取几个就好)
    Mac开发一些好的软件
  • 原文地址:https://www.cnblogs.com/Luvwgyx/p/8418704.html
Copyright © 2011-2022 走看看