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);
}
}
分享到:
相关推荐
总结来说,TrieTree作为一种高效的数据结构,特别适用于处理字符串相关的问题,尤其在需要进行前缀匹配的情况下。理解其原理和操作,可以极大地提升我们解决相关问题的能力。通过严蔚敏数据结构与算法中的TrieTree...
在处理文本、编程语言、数据压缩、搜索、排序等问题时,字符串算法起着至关重要的作用。这里我们将深入探讨一些核心的字符串算法及其应用。 1. **KMP算法**:KMP(Knuth-Morris-Pratt)算法是一种用于字符串匹配的...
KMP算法和Trie搜索树是两种在计算机科学中用于字符串处理的重要算法,它们在文本检索、模式匹配和数据结构优化等领域有着广泛的应用。 首先,我们来深入了解一下KMP算法。KMP(Knuth-Morris-Pratt)算法是一种高效...
总结起来,TrieTree是数据结构中一种重要的字符串处理工具,通过有效的存储和检索策略,大大提高了对大量字符串操作的效率。严蔚敏教授的实现为我们提供了宝贵的教育资源,使我们能够深入理解和应用这一数据结构。在...
5. **优化与空间效率**:Trie树在处理大量字符串时可能会占用大量内存。因此,可以学习如何通过压缩路径、共享节点等方式来优化空间效率。 6. **实际应用**:了解字典树在实际问题中的应用,如搜索引擎的关键词索引...
虽然构建过程需要一定的时间成本,但在处理大量字符串和重复查询的场景下,TrieTree的性能优势尤为明显。通过理解和熟练运用TrieTree,开发者可以更好地优化其在NLP和文本处理应用中的算法性能。
C#,单词查找树(Trie Tree)的插入与搜索算法与源代码 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统...
《POJ2525-Text Formalization:深入解析TrieTree》 在计算机科学的世界里,算法和数据结构是解决问题的关键。今天我们要探讨的是一个名为"POJ2525-Text Formalization"的问题,它涉及到一种高效的数据结构——Trie...
Aho-Corasick 算法便是为此目的而设计的一种高级搜索策略,它巧妙地结合了字典树(Trie Tree)和有限状态自动机(Finite State Automaton, FSA)的概念,极大地提升了字符串匹配的效率。 Aho-Corasick 算法由艾兹格...
9. **字符串在数据结构中的应用**:如Trie树(字典树)和suffix tree(后缀树)等,用于快速查找和操作字符串集合。 10. **正则表达式**:正则表达式是一种强大的文本处理工具,用于模式匹配和提取。学习正则表达式...
总之,了解和熟练掌握Trie数据结构及其在Go中的实现,对于提升Go程序员的技能水平、优化字符串处理的性能都大有裨益。通过实践和不断优化,我们可以构建出更加高效、可靠的字符串处理工具和系统。
总的来说,Java实现的字典树TrieTree是一个强大的工具,尤其适用于处理大量字符串数据,如四六级高频词汇的存储和查询。通过理解和运用这种数据结构,我们可以提高算法效率,优化应用程序的性能。
【标题】"POJ2513-Colored Sticks【TrieTree+MergeSet+EulerPath】"涉及的是一道编程竞赛题目,主要考察参赛者的数据结构与算法应用能力,特别是Trie树(字典树)、并查集(MergeSet)以及欧拉路径(Euler Path)这...
Trie树,也被称为前缀树或字典树,是一种数据结构,主要用于高效地存储和检索字符串。在Trie树中,每个节点代表一个字符串的前缀,而...了解并掌握Trie树的原理和实现方法,对于解决涉及大量字符串处理的问题至关重要。
字符串,作为基本的数据类型之一,在编程语言中广泛应用,尤其是在文本处理、信息检索、模式匹配等领域。 首先,我们要了解字符串在数据结构中的常见表示方式。一种是字符数组,简单直接,但长度固定,不便于动态...
本篇文章将探讨四个关键概念:树状数组、后缀数组、字典树以及多串匹配算法,这些都属于字符串处理和高效计算的重要工具,并提供一些实际应用的启示。 1. **树状数组(Counting Array / Fenwick Tree)** 树状数组...
在计算机科学领域,字符串处理技术一直是研究的重点之一,特别是在信息检索、生物信息学等领域有着广泛的应用。多串匹配问题是字符串处理中的一个重要分支,它涉及到在一个文本串中查找多个模式串首次出现的位置。...
在Objective-C中实现Trie算法,可以帮助开发者快速处理大量字符串数据,例如在搜索引擎、自动补全功能或者关键词过滤等场景下。下面将详细探讨Trie数据结构的原理以及如何在Objective-C中进行实现。 Trie的核心思想...
**AC算法(Aho-Corasick算法)**是一种在...总的来说,AC算法是字符串处理领域的一个强大工具,尤其在需要快速匹配大量模式串的场景下,其优势显著。通过理解和掌握AC算法,可以有效地解决多种实际问题,提升软件性能。
辅助算法2是单词前缀树(Word Prefix Tree),也称为字典树或Trie树。它是一种特殊的树结构,每个非根节点对应一个字符串,并且具有前缀指针,指向最长的出现在单词树中的子串。例如,在树中,对于字符串"abbabab",...