自定义字典树(前缀树)

本文深入探讨了字典树(Trie)这一高效的数据结构,对比了其与二分搜索树、堆和线段树的区别,尤其强调了字典树在前缀搜索和模式匹配任务中的优势。文章详细介绍了字典树的实现原理,包括节点结构、插入、查找和前缀匹配等操作,并讨论了其在空间效率上的局限性。
摘要由CSDN通过智能技术生成

通过学习自定义字典树,了解字典树这一数据结构。

 

之前的二分搜索树(二叉树)堆(完全二叉树)线段树(平衡二叉树)都是基于二叉树。而字典树是一种多叉树。

 

 

如果有n个条目,使用树结构查询的时间复杂度为O(log n),如果有100万个条目(2^20),log n 大约为20; 而使用Trie(字典树)的时间复杂度与有多少条目无关,为O(w),w为查询单词的长度(大多数单词的长度不超过10)。

Trie的局限性:空间问题。

 

 

实践:前缀搜索  参考: LeetCode之208. 实现 Trie (前缀树)

实践:简单的模式匹配  参考:LeetCode之211. 添加与搜索单词 - 数据结构设计



 

自定义字典树(Trie):

package Trie;

import java.util.TreeMap;//java提供的TreeMap底层是红黑树

public class Trie {
	/**
	 * 内部类
	 * 
	 * @author xiaohau
	 *
	 */
	private class Node{
		public boolean isWord;//指示当前node是否为一个完整的单词
		public TreeMap<Character,Node> next;//保存字符及下一个节点信息
		
		public Node(boolean isWord) {
			this.isWord=isWord;
			next=new TreeMap<>();
		}
		
		public Node() {
			this(false);
		}
	}
	private Node root;//根节点
	private int size;//字典树中单词数量
	/**
	 * 无参构造函数,初始化根节点
	 */
	public Trie() {
		root=new Node();
		size=0;
	}
	/**
	 * 返回字典树中单词的数量
	 * @return
	 */
	public int getSize() {
		return size;
	}
	/**
	 * 向Trie中添加一个新的单词word
	 * @param word
	 */
	public void add(String word) {
		Node cur=root;//指向当前头结点
		//遍历单词每个字符,若节点中不存在,则添加,负责,跳过该结点,继续判断
		for(int i=0;i<word.length();i++) {
			char c=word.charAt(i);
			if(cur.next.get(c)==null) {
				cur.next.put(c, new Node());
			}
			cur=cur.next.get(c);
		}
		//修改当前结点为一个完整的单词
		if(!cur.isWord) {
			cur.isWord=true;
			size++;
		}
	}
	/**
	 * 查询单词word是否在Trie中
	 * @param word
	 * @return
	 */
	public boolean contains(String word) {
		Node cur=root;
		for(int i=0;i<word.length();i++) {
			char c=word.charAt(i);
			if(cur.next.get(c)==null) {
				return false;
			}
			cur=cur.next.get(c);
		}
		return cur.isWord;
	}
	/**
	 * 查询是否在Trie中有单词以prefix为前缀
	 * 注:整个单词也是整个单词的前缀
	 * @param prefix
	 * @return
	 */
	public boolean isPrefix(String prefix) {
		Node cur=root;
		for(int i=0;i<prefix.length();i++) {
			char c=prefix.charAt(i);
			if(cur.next.get(c)==null) {
				return false;
			}
			cur=cur.next.get(c);
		}
		return true;
	}
	
	
	
	
	
	
	
	
	
	
	
	
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值