5.2 单词查找树<正在更新>

作者:disappearedgod
时间:2014-8-22

前言

本博客为系列博客。主要根据的是《算法》forth Edition来写的。在后面的时间会逐渐加上一些题目

字符串的查找问题是一个匹配问题。我们希望在文本(String txt)中能够找到我们想要找到的匹配项(string pat)。

正文

5.2 单词查找树

public class StringST< Value>                                                                                                                              

StringST()                                                                  create a symbol table

void put(String key, Value val)                                  put key-value pair into the table(removekeyif value isnull)

Value get(String key)                                                 value paired with key(nullifkey is absent)

void delete(String key)                                              remove key (and its value)

boolean contains(String key)                                    is there a value paired with key?

boolean isEmpty()                                                   is the table empty? 

String longestPrefixOf(String s)                               the longest key that is a prefix of s

Iterable<String> keysWithPrefix(String s)               all the keys having s as a prefi x

Iterable<String> keysThatMatch(String s)                all the keys that match s(where.matches any character)

int size()                                                                   number of key-value pairs

Iterable<String> keys()                                            all the keys in the table                                                        

API for a symbol table with string keys


5.2.1 单词查找树(trie)

这个数据结构的作用是取出(retrieval)数据。我们会首先描述tire的基本性质(查找和插入),然后学习数据结构的表示方法已经JAVA实现。

5.2.1.1 基本性质
数据结构构成:
  • 父节点:每个节点都有一个指向它的节点。根节点除外。
  • R条链接:每个节点有R条链接,R为字母表的大小。
值为空的节点在符号表中没有对应的键,它们的存在是为了简化trie中查找。

5.2.1.2 单词查找树中的查找操作
从根节点开始,首先经过的时key的首字母对应的link;
在下一个节点中沿着第二个字符所对应的链接继续前进;
在第二个节点中沿着第三个字符所对应的链接向前,如此这般直到到达key的最后一个字母所指向的节点或是遇到了一条空Link。这时候可能出现以下3种情况:
  • key的尾字符所对应的节点中的Value 非null。这是一次命中查找,key对应的值就是key的尾字符所对应的节点中保存的Value。
  • key的尾字符所对应的结点中的Value is null。这是一次未命中查找。
  • 查找结束语一条 null link。未命中



5.2.1.3 单词查找树中的插入操作
对于上述2中未命中的情况,才需要插入操作。
对于在叨叨key的尾字符之前就遇到了一个null链接。字符查找树中不存在与key尾字符对应的节点。
->需要为key中未被检查的每个字符创建一个对应的结点并将key的值保存到最后的一个字符的结点中。
对已遇到null链接钱就到达了key的尾字符。
->将该节点的Value设为key对应的值。



5.2.1.4 结点的表示

5.2.1.5 大小

5.2.1.6  查找所有key

5.2.1.7 通配符匹配

5.2.1.8 最长前缀
为了找到给定字符串的最长key前缀,就需要使用一个类似get()递归方法。
  • 记录查找路径上所找到的最长键的长度。(晕倒值非空的节点时会更新它)
  • 查找会在被查找的字符串结束或是遇到null时候终止。

5.2.1.9 删除操作
从一棵单词查找树中山区一个键值对:
  • 找到key所对应的Node,并将它的值设为空(null)。
  • 如果该结点含有一个非空的链接指向某个子节点,那么就不需要再进行其他操作;如果他的所有链接均为null,那么就需要从数据结构中山区这个结点;如果删除同时使得它的父节点的所有链接为null,则需要从数据结构中山区这个Node<递归>。
public void delete(String key){
	root = delete(root, key, 0);
}

private Node delete(Node x, String key, int d){
	if(x == null) return null;
	if(d == key.length())
		x.val = null;
	else{
		char c= key.charAt(d);
		x.next[c] = delete(x.next[c], key, d+1);
	}
	if(x.val != null) return x;
	
	for(char c = 0; c < R; c++)
		if(x.next[c] != null)
			return x;
	return null;
}


5.2.1.10 字母表


5.2.2 单词查找树的性质


5.2.2.1

5.2.2.2

5.2.2.3

5.2.2.4

5.2.3 三向单词查找树

5.2.4 三向单词查找树的性质

5.2.5 应该使用字符串符号表的哪种实现



后记



参考博客



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值