数据结构与算法-前缀树

数据结构与算法-前缀树详解

  • [1 何为前缀树](#1 何为前缀树)
  • [2 前缀树的代码表示及相关操作](#2 前缀树的代码表示及相关操作)

1 何为前缀树

前缀树 又称之为字典树,是一种多路查找树,多路树形结构,是哈希树的变种,和hash效率有一拼,是一种用于快速检索的多叉树结构。

性质:不同字符串的相同前缀只保存一份。

操作:查找,插入,删除

例如 字符数组

["abc","bck","abd","ace"]

构建成一颗前缀树


2 前缀树的代码表示及相关操作

前缀树中的节点

coding

java 复制代码
public static class TrieNode {
    public int pass;//前缀树节点被经过的次数
    public int end;// 多少个字符串在此点结尾
    public TrieNode[] nexts;// 下一个节点
	
	// 当字符种类很多的时候 可以使用HashMap
    // public Map<Character,TrieNode> trieNodeMap;// key 某条图  value 指向的下一个节点
		
    public TrieNode(){
         // trieNodeMap = new HashMap<>();//无序使用Hash表
        // trieNodeMap = new TreeMap<>();// 有序使用有序表
        this.pass = 0;
        this.end = 0;
        nexts = new TrieNode[26];
    }
}

前缀树代码表示及相关操作

java 复制代码
public static class Trie {
	private TrieNode root;//头结点
	
	public Trie() {
	    this.root = new TrieNode();
	}
	
	/**
	 * 将字符串word加入到前缀树中
	 *
	 * @param word
	 */
	public void insert(String word) {
	    if (word == null) {
	        return;
	    }
	    char[] chars = word.toCharArray();
	    TrieNode node = root;
	    node.pass++;
	    int index = 0;
	    // 从左往右遍历字符串
	    for (int i = 0; i < chars.length; ++i) {
	        // 由字符计算得出 该走哪条路
	        index = chars[i] - 'a';
	        //如果没有此字符的路 则新建
	        if (node.nexts[index] == null) {
	            node.nexts[index] = new TrieNode();
	        }
	        //来到下一个节点
	        node = node.nexts[index];
	        node.pass++;
	    }
	    node.end++;
	}
	
	/**
	 * @param word
	 * @return 字符串在前缀树中加入过几次
	 */
	public int search(String word) {
	    if (word == null) {
	        return 0;
	    }
	    // 临时前缀树节点 用于遍历前缀树
	    TrieNode node = root;
	    char[] chars = word.toCharArray();
	    int index = 0;
	    for (int i = 0; i < chars.length; ++i) {
	        index = chars[i] - 'a';
	        // 没有通往当前字符串的路 则说明没有加入过这个字符串 直接返回 0
	        if (node.nexts[index] == null) {
	            return 0;
	        }
	        // 下一个节点
	        node = node.nexts[index];
	    }
	    // 所有字符的路都有  则返回最后一个节点的 end 值
	    return node.end;
	}
	
	/**
	 * @param pre
	 * @return 有多少个字符串是以 pre开头的
	 */
	public int prefixNumber(String pre) {
	    if (pre == null) {
	        return 0;
	    }
	    TrieNode node = root;
	    int index = 0;
	    char[] chars = pre.toCharArray();
	    for (int i = 0; i < chars.length; ++i) {
	        index = chars[i] - 'a';
	        if (node.nexts[index] == null) {
	            return 0;
	        }
	        node = node.nexts[index];
	    }
	    return node.pass;
	}
	
	/**
	 * 删除前缀树中的字符串word
	 *
	 * @param word
	 */
	public void delete(String word) {
	    if (search(word) != 0) { // 前缀树中存在字符串再删除
	        char[] chars = word.toCharArray();
	        TrieNode node = root;
	        node.pass--;
	        int index = 0;
	        // 遍历每一个节点 将节点的pass值减 1
	        for (int i = 0; i < chars.length; ++i) {
	            index = chars[i] - 'a';
	            if (--node.nexts[index].pass == 0) {
	                node.nexts[index] = null;
	                return;
	            }
	            node = node.nexts[index];
	        }
	        node.end--;
	    }
	}
}
相关推荐
硬件人某某某1 分钟前
Java基于SSM框架的社区团购系统小程序设计与实现(附源码,文档,部署)
java·开发语言·社区团购小程序·团购小程序·java社区团购小程序
程序员徐师兄2 分钟前
Java 基于 SpringBoot 的校园外卖点餐平台微信小程序(附源码,部署,文档)
java·spring boot·微信小程序·校园外卖点餐·外卖点餐小程序·校园外卖点餐小程序
kucupung13 分钟前
【C++基础】多线程并发场景下的同步方法
开发语言·c++
chengpei14719 分钟前
chrome游览器JSON Formatter插件无效问题排查,FastJsonHttpMessageConverter导致Content-Type返回不正确
java·前端·chrome·spring boot·json
Quantum&Coder19 分钟前
Objective-C语言的计算机基础
开发语言·后端·golang
五味香21 分钟前
Java学习,List 元素替换
android·java·开发语言·python·学习·golang·kotlin
Joeysoda24 分钟前
Java数据结构 (从0构建链表(LinkedList))
java·linux·开发语言·数据结构·windows·链表·1024程序员节
迂幵myself24 分钟前
14-6-1C++的list
开发语言·c++·list
扫地僧00927 分钟前
(Java版本)基于JAVA的网络通讯系统设计与实现-毕业设计
java·开发语言
天乐敲代码27 分钟前
JAVASE入门九脚-集合框架ArrayList,LinkedList,HashSet,TreeSet,迭代
java·开发语言·算法