前缀树的介绍及简单实现 java

什么是前缀树

Trie (发音为 “try”) 或前缀树是一种树数据结构,用于检索字符串数据集中的键。这一高效的数据结构有多种应用:

1.自动补全
2.拼写检查
3.IP 路由 (最长前缀匹配)
4.打字预测
前缀树的结构

假设我们现在要做一个关于小写英文单词的前缀匹配,这个时候我们想起来可以使用我们的前缀树呀,那么什么是前缀树呢~
从一个根节点出发。每对下一个节点的映射都应该具有26种可能性(单指目前对小写英文单词的匹配的情况)。那么我们的Trie的结构是不是应该是这样的。

Class Node{
   
	//想象一下链表结构,本来是一个对象,现在这个对象是一个26个位置的数组,用来按顺序存放26个字母
	Node[] next=new Node[26];
}

请看下图

  • 假设我们现在存入的是cat。root出发,在第一层当中匹配c,没有找到c,则new一个对象,并存入c。同时让一个临时节点指向当前存入的c。以此往下。
  • 假设我们现在前缀树里面已经有dog了,但没有dear,我们现在要存入dear。那么我们从root出发,在第一层当中匹配d,找到了d,临时节点指向d,再去获取d中的数组,在判断是否具有e,没有找到e,则new一个新的对象存入,这个对象也带着26个位置,你只需要把e放进去,再重复往下就可以。

tip:有一种 一个节点对应26个往下的可能性 的感觉
在这里插入图片描述

那前缀树除了插入的功能之外,自然还有搜索的功能。比如前缀树具有boolean search(String word)的方法。那为了方便遍历完word之后,可以快速返回word是否是一个单词。我们可以对前缀树的结构进行调整,如下

Class Node{
   
	//想象一下链表结构,本来是一个对象,现在这个对象是一个26个位置的数组,用来按顺序存放26个字母
	boolean isWord=false;
	Node[] next=new Node[26];
}

这样在每一个叶子节点的时候,都会对当前这个叶子节点的对象标识上一个isWord为true的属性。如下图所示吗,每一个蓝色节点的位置的对象的isWord属性都为true。
在这里插入图片描述

假设我们已经插入了panda,现在要插入pan这个单词,因为这个pan是panda的前缀。所以再插入完pan之后,其实在n这个节点处的对象的isWord也应该是true。即如下图所示
在这里插入图片描述

前缀树的数组实现(基于26个单词的)

那我们来看一下这种26个单词前缀树搜索的java实现

class Trie {
   

    private Trie[] next=new Trie[26];
    private boolean isEnd=false;

    /** Initialize your data structure here. */
    public Trie() {
   }
    
    /** Inserts a word into the trie. */
    public void insert(String word) {
   
        Trie root=this;
        char[] c=word.toCharArray();
        for(int i=0;i<c.length;i++)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值