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

前缀树(Trie)是一种用于检索字符串数据集的高效树结构,常用于前缀匹配。文章介绍了Trie树的结构,包括数组和Map两种实现方式,并对比了它与普通树结构(如平衡搜索树)和哈希表的优缺点。在特定场景下,Trie树能提供更快的查找速度和节省空间。
摘要由CSDN通过智能技术生成

什么是前缀树

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++){
   
            if(root.next[c[i]
Java中,可以使用Trie树实现前缀树。Trie树是一种树形结构,用于存储和查询字符串。下面是一个简单Java代码示例,展示了如何实现前缀树: ```java class TrieNode { private TrieNode[] children; private boolean isWord; public TrieNode() { children = new TrieNode == null) { node.children[index = new TrieNode(); } node = node.children[index]; } node.isWord = true; } public boolean search(String word) { TrieNode node = searchPrefix(word); return node != null && node.isWord; } public boolean startsWith(String prefix) { return searchPrefix(prefix) != null; } private TrieNode searchPrefix(String prefix) { TrieNode node = this; for (char c : prefix.toCharArray()) { int index = c - 'a'; if (node.children[index == null) { return null; } node = node.children[index]; } return node; } } public class Trie { private TrieNode root; public Trie() { root = new TrieNode(); } public void insert(String word) { root.insert(word); } public boolean search(String word) { return root.search(word); } public boolean startsWith(String prefix) { return root.startsWith(prefix); } } ``` 这个代码示例中,`TrieNode`类表示前缀树的节点,每个节点包含一个字符数组和一个布尔值,用于标记是否是一个完整的单词。`Trie`类则是前缀树实现,提供了插入、搜索和前缀匹配等功能。 使用该代码实现前缀树,可以方便地插入字符串,搜索字符串和匹配前缀。你可以根据自己的需求来使用和扩展这个前缀树实现。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [Trie树(字典树)的介绍Java实现](https://download.csdn.net/download/weixin_38725119/12786975)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [java实现前缀树--过滤敏感词汇](https://blog.csdn.net/qq_37933128/article/details/126461250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值