`

字符串处理算法之TrieTree

 
阅读更多
package com.yan.algorithm.string;

import java.util.LinkedList;
import java.util.Queue;

public class TrieTree {

	private static int R = 256;

	private Node root = new Node();

	private class Node {

		private Node[] next = new Node[R];
		private Object value;
	}
	
	/**
	 * add value to trie tree
	 * @param key
	 * @param value
	 */
	public void put(String key, Object value) {

		root = put(root, key, value, 0);
	}

	private Node put(Node x, String key, Object value, int d) {
		if (x == null)
			return null;
		if (key.length() == d)
			return x;
		char c = key.charAt(d);
		x.next[c] = put(x.next[c], key, value, d + 1);
		return x;
	}
	
	/**
	 * search value by key
	 * @param key
	 * @return
	 */
	public Node get(String key) {
		return get(root, key, 0);
	}

	private Node get(Node x, String key, int d) {
		if (x == null)
			return null;

		if (key.length() == d)
			return x;

		char c = key.charAt(d);
		return get(x.next[c], key, d + 1);
	}
	
	/**
	 * remove value from trie tree by key
	 * @param key
	 */
	public void remove(String key) {
		root = remove(root,key,0);
	}

	/**
	 * delete one element from trie tree
	 * @param x
	 * @param key
	 * @param d
	 * @return
	 */
	private Node remove(Node x, String key, int d) {

		if(x == null) return null;
		if(key.length()==d) {
			
			x.value = null;
		} else {
			char c = key.charAt(d);
			x.next[c] = remove(x.next[c],key,d+1);
		}
		
		if(x.value != null) return x;
		for(char e = 0;d<R;d++) {
			if(x.next[e] != null)
				return x;
		}
		return null;
	}
	
	
	private void collect(Node x, String pre,Queue<String> q) {
		if(x == null) return;
		
		if(x.value != null) q.add(pre);
		for(char c=0;c<R;c++) {
			collect(x.next[c],pre+c,q);
		}
		
	}
	
	/**
	 * get all keys which start with pre 
	 */
	public Iterable<String> keysWithPrefix(String pre) {
		Queue<String> q = new LinkedList<String>();
		collect(root,pre,q);
		return q;
	}
	
	/**
	 * get all keys
	 */
	public Iterable<String> keys() {
		return keysWithPrefix("");
	}
	
	/**
	 * return a key which is the longest prefix of a string
	 * @param str
	 * @return
	 */
	public String longPrefixOf(String str) {
		return str.substring(0,search(root,0,0,str));
	}
	
	
	private int search(Node x,int d,int length,String str) {
		
		if(x == null) return length;
		if(x.value != null) length = d;
		if(d == str.length()) return length;
		char c = str.charAt(d);
		
		return search(x.next[c],d+1,length,str);
	}

}
分享到:
评论

相关推荐

    11 TrieTree.rar

    总结来说,TrieTree作为一种高效的数据结构,特别适用于处理字符串相关的问题,尤其在需要进行前缀匹配的情况下。理解其原理和操作,可以极大地提升我们解决相关问题的能力。通过严蔚敏数据结构与算法中的TrieTree...

    字符串算法

    在处理文本、编程语言、数据压缩、搜索、排序等问题时,字符串算法起着至关重要的作用。这里我们将深入探讨一些核心的字符串算法及其应用。 1. **KMP算法**:KMP(Knuth-Morris-Pratt)算法是一种用于字符串匹配的...

    KMP算法与trie搜索树实现

    KMP算法和Trie搜索树是两种在计算机科学中用于字符串处理的重要算法,它们在文本检索、模式匹配和数据结构优化等领域有着广泛的应用。 首先,我们来深入了解一下KMP算法。KMP(Knuth-Morris-Pratt)算法是一种高效...

    11 TrieTree.zip

    总结起来,TrieTree是数据结构中一种重要的字符串处理工具,通过有效的存储和检索策略,大大提高了对大量字符串操作的效率。严蔚敏教授的实现为我们提供了宝贵的教育资源,使我们能够深入理解和应用这一数据结构。在...

    PHP-TrieTree-master.zip

    5. **优化与空间效率**:Trie树在处理大量字符串时可能会占用大量内存。因此,可以学习如何通过压缩路径、共享节点等方式来优化空间效率。 6. **实际应用**:了解字典树在实际问题中的应用,如搜索引擎的关键词索引...

    C# TrieTree介绍及实现方法

    虽然构建过程需要一定的时间成本,但在处理大量字符串和重复查询的场景下,TrieTree的性能优势尤为明显。通过理解和熟练运用TrieTree,开发者可以更好地优化其在NLP和文本处理应用中的算法性能。

    C#,单词查找树(Trie Tree)的插入与搜索算法与源代码

    C#,单词查找树(Trie Tree)的插入与搜索算法与源代码 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统...

    POJ2525-Text Formalization【TrieTree】

    《POJ2525-Text Formalization:深入解析TrieTree》 在计算机科学的世界里,算法和数据结构是解决问题的关键。今天我们要探讨的是一个名为"POJ2525-Text Formalization"的问题,它涉及到一种高效的数据结构——Trie...

    AhoCorasickAutomation.rar_字符串字典_有限状态自动机

    Aho-Corasick 算法便是为此目的而设计的一种高级搜索策略,它巧妙地结合了字典树(Trie Tree)和有限状态自动机(Finite State Automaton, FSA)的概念,极大地提升了字符串匹配的效率。 Aho-Corasick 算法由艾兹格...

    10 深入学习字符串.zip

    9. **字符串在数据结构中的应用**:如Trie树(字典树)和suffix tree(后缀树)等,用于快速查找和操作字符串集合。 10. **正则表达式**:正则表达式是一种强大的文本处理工具,用于模式匹配和提取。学习正则表达式...

    Java实现字典树TrieTree

    总的来说,Java实现的字典树TrieTree是一个强大的工具,尤其适用于处理大量字符串数据,如四六级高频词汇的存储和查询。通过理解和运用这种数据结构,我们可以提高算法效率,优化应用程序的性能。

    POJ2513-Colored Sticks【TrieTree+MergeSet+EulerPath】

    【标题】"POJ2513-Colored Sticks【TrieTree+MergeSet+EulerPath】"涉及的是一道编程竞赛题目,主要考察参赛者的数据结构与算法应用能力,特别是Trie树(字典树)、并查集(MergeSet)以及欧拉路径(Euler Path)这...

    Trie树 结构描述 实现方法 用法

    Trie树,也被称为前缀树或字典树,是一种数据结构,主要用于高效地存储和检索字符串。在Trie树中,每个节点代表一个字符串的前缀,而...了解并掌握Trie树的原理和实现方法,对于解决涉及大量字符串处理的问题至关重要。

    数据结构字母字符串操作

    字符串,作为基本的数据类型之一,在编程语言中广泛应用,尤其是在文本处理、信息检索、模式匹配等领域。 首先,我们要了解字符串在数据结构中的常见表示方式。一种是字符数组,简单直接,但长度固定,不便于动态...

    树状数组 后缀数组 字典树 多串匹配算法及启示

    本篇文章将探讨四个关键概念:树状数组、后缀数组、字典树以及多串匹配算法,这些都属于字符串处理和高效计算的重要工具,并提供一些实际应用的启示。 1. **树状数组(Counting Array / Fenwick Tree)** 树状数组...

    多串匹配算法及其启示 多串匹配算法及其启示

    在计算机科学领域,字符串处理技术一直是研究的重点之一,特别是在信息检索、生物信息学等领域有着广泛的应用。多串匹配问题是字符串处理中的一个重要分支,它涉及到在一个文本串中查找多个模式串首次出现的位置。...

    Go-trie-单词查找树实现Go实现

    总之,了解和熟练掌握Trie数据结构及其在Go中的实现,对于提升Go程序员的技能水平、优化字符串处理的性能都大有裨益。通过实践和不断优化,我们可以构建出更加高效、可靠的字符串处理工具和系统。

    Trie 字典树 Objective-c 算法实现

    在Objective-C中实现Trie算法,可以帮助开发者快速处理大量字符串数据,例如在搜索引擎、自动补全功能或者关键词过滤等场景下。下面将详细探讨Trie数据结构的原理以及如何在Objective-C中进行实现。 Trie的核心思想...

    aho corasick (AC算法)

    **AC算法(Aho-Corasick算法)**是一种在...总的来说,AC算法是字符串处理领域的一个强大工具,尤其在需要快速匹配大量模式串的场景下,其优势显著。通过理解和掌握AC算法,可以有效地解决多种实际问题,提升软件性能。

    多串匹配算法及其启示_朱泽园.ppt

    辅助算法2是单词前缀树(Word Prefix Tree),也称为字典树或Trie树。它是一种特殊的树结构,每个非根节点对应一个字符串,并且具有前缀指针,指向最长的出现在单词树中的子串。例如,在树中,对于字符串"abbabab",...

Global site tag (gtag.js) - Google Analytics