字典树

1 篇文章 0 订阅
1 篇文章 0 订阅

笔记参考来源:
1.简单易懂的字典树
2.字典树代码

字典树

1.定义

又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。
字典树并不直接在节点上存储字符串, 而是将词语视作根节点到某节点之间的一条路径,并在终点节点(蓝色) 上做个标记“该节点对应词语的结尾”。字符串就是一 条路径,要查询一个单词,只需顺着这条路径从根节点往下走。如果能走到特殊标记的节点,则该字符串在集合中,否则不存在。
一个典型的字典树如下图所示所示:
在这里插入图片描述

2.特点

  • 根节点不包含字符,除根节点外每一个节点都只包含一个字符(具体应该是连接的边上);
  • 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
  • 每个节点的所有子节点包含的字符都不相同;
  • 终点节点不一定是叶子节点,每一个终点节点都对应着一个字符串,从根节点到终点节点路径上的字符连接起来即为该终点节点所对应的字符串;
  • 拥有相同字符前缀的字符串共享路径,这也是字典树又被称为前缀树的原因,字典树能够利用字符串中的公共前缀,这样可能会节省内存,不过通过上图中"语"字来看,如果系统中存在大量字符串并且这些字符串基本没有前缀,相应的字典树内存消耗也会很大;
  • 查询效率比较高:不过利用字符串的公共前缀可以减少查询字符串的时间,能够最大限度的减少无谓的字符串比较,同时在查询的过程中不需要预知待查询字符串的长度,沿着字典树的边进行匹配。

3.基本操作

插入(insert)、删除(delete)、修改(update)和查询(search)
删除和修改操作本质上和查询操作是一样的,删除操作通过查询找到对应的终点节点,将终点节点设置为None即可,而修改操作只需将终点节点设置为另外一个字符值,因此对于字典树来说最主要的就是插入和查询操作,接下来具体的看一看字典树的插入和查询操作。

3.1 插入

例:将"入门", “自然”, “自然人”, “自然语言”, "自语"5个单词插入到字典树中。

  • 将"入门"插入到字典树中

1.初始节点变量p=0,此时的红色箭头定位到根节点的位置,首先插入字符"入":
1)判断与根节点连接的子节点中是否有一条标识为"入"的边 --> 没有;
2)创建一个新节点编号为1(p+=1),将1号节点作为0号节点的子节点并将连接的 边标识为"入";
3)判断字符"入"是否为"入门"的最后一个字符 --> 不是;
在这里插入图片描述
2.节点变量p = 1,此时的红色箭头定位到1号节点的位置,接下来插入字符"门":
1)判断与1号节点连接的子节点中是否有一条标识为"门"的边 --> 没有;
2)创建一个新节点编号为2,将2号节点作为1号节点的子节点并将连接的边标识为"门";
3)判断字符"门"是否为"入门"的最后一个字符 --> 是;
4)将2号节点标识为终止节点;
在这里插入图片描述

  • 将"自然"插入到字典树中
    将p =0,定位到根节点,类似插入"入门"。
    在这里插入图片描述
  • 将"自然人"插入到字典树中

1.“自然"和"自然人"拥有相同的字符前缀,因此插入过程稍有不同。由于是新插入的字符串,因此令p=0,此时的红色箭头定位到根节点的位置,首先插入字符"自”:

1)判断与根节点连接的子节点中是否有一条标识为"自"的边 --> 有;
2)获取对应子节点的对象,并将p设置为此节点;
3)判断字符"自"是否为"自然人"的最后一个字符 --> 不是;
在这里插入图片描述
2.节点变量p = 3,此时的红色箭头定位到3号节点的位置,接下来插入字符"然":

1)判断与3号节点连接的子节点中是否有一条标识为"然"的边 --> 有;
2)获取对应子节点的对象,并将p设置为此节点;​
3)判断字符"然"是否为"自然人"的最后一个字符 --> 不是;
在这里插入图片描述

3.节点变量p = 4,此时的红色箭头定位到4号节点的位置,最后插入字符"人":

1)判断与4号节点连接的子节点中是否有一条标识为"人"的边 --> 没有;
2)创建一个新节点编号为5,将5号节点作为4号节点的子节点并将连接的边标识为"人";​
3)判断字符"人"是否为"自然人"的最后一个字符 --> 是;
4)将5号节点标识为终点节点;
在这里插入图片描述

ps:字典树太难了(/(ㄒoㄒ)/~~),我不学了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值