首页 > 编程知识 正文

treeset底层实现原理,平衡trie树

时间:2023-05-06 10:00:54 阅读:42889 作者:4615

词典树通常称为trie树,trie树常用于搜索提示。 输入网址后,将自动搜索可能的选择。 如果没有完全匹配的搜索结果,则前缀可能最相似。

有关详细信息,请参阅维基:树

基本概念

包含8个密钥的trie结构、' a '、' to '、' tea '、' ted '、' ten '、' I '、' in '和' inn '。

image-20190428191028045

优点:最大限度地减少无谓的比较,查询效率高于散列

核心思想:在空间上改变时间,利用字符串的公共前缀降低查询时间开销达到了提高查询的目的。

缺点:空间消耗大

基本性质:

根节点不包含字符,除根节点外,每个节点只包含一个字符

从根节点到某个节点,通过路径上字符相连,是与该节点对应的字符串

每个节点的所有子节点中包含的字符都不同

实现

leet代码的第208个问题

1首先定义节点类。 因为数据结构是树,所以需要节点。

静态类三节点{

//*

*当前节点保存的字符

*/

char val;

//*

*标记当前节点是否是要保存的节点的最后一个字符的节点

*/

布尔感测;

//*

*因为存储树中的下一个节点这次只考虑小写字母

*只打开了26个数组空间

*

如果树的节点远远大于26个,则可以使用Map作为next

* TreeMap=new TreeMap () )

*/

三节点[ ]下一步=新三节点[ 26 ];

公共树节点() {

}

公共服务(char val ) {

this.val=val;

}

}

定义树的结构。

公共类树{

//*

*树的根节点

*/

三节点根;

//*

Trie数据结构初始化

*/

公共树() }

根=新三节点(;

root.val=' ';

}

//*

在树中插入单词

*

*/

公共语音插入(字符串word ) {

三节点当前节点=根;

for(intI=0; i word.length (; I ) {

charc=word.Charat(I;

//将当前字符作为节点插入到树中

//但是在插入之前先检查

if (当前节点. next [ c-' a ' ]==null ({

current node.next [ c-' a ' ]=newtrienode (c;

}

current node=current node.next [ c-' a ' ];

}

//现在标志来到单词的末尾

currentNode.isEnd=true;

}

//*

*判断某个单词是否在树中

*/

publicbooleansearch (字符串word ) {

三节点当前节点=根;

for(intI=0; i word.length (; I ) {

charc=word.Charat(I;

//单词还没说完,就发现已经不匹配了

if (当前节点. next [ c-' a ' ]==null ({

返回假;

}

current node=current node.next [ c-' a ' ];

}

//每个单词的末尾都设置为true

//如果当前为false,则表示没有存储此单词

return currentNode.isEnd;

}

//*

*确定当前单词是否为Trie树种某个单词的前缀。 请注意,这里的逻辑与查询相同。 唯一不同的是

*前缀匹配后返回true

*/

公共蓝牙(string prefix ) {

三节点当前节点=根;

for(intI=0; i prefix.length (; I ) {

charc=prefix.charat(I;

if (当前节点. next [ c-' a ' ]==null ({

返回假;

}

current node=current node.next [ c-' a ' ];

}

返回真;

}

}

3写测试代码看效果

publicstaticvoidmain (字符串[ ] args ) {

三叉树=新三叉树(;

trie.insert(flink );

trie.insert('Netty );

trie.insert(MySQL );

trie.insert(redis );

//false

system.out.println (trie.search (' MongoDB ' );

//真

system.out.println (trie.search (' redis ' );

//false

system.out.println (trie.search (' my ' );

//真

system.out.println (trie.search (' MySQL ' ) );

//真

system.out.println (trie.starts with (' my ) );

}

4运行程序,取得了预期的结果

image-20190429081246407

最后一次

这里只是给出了树的简单介绍和实现,关于树还有很多话题。

扩展:

虽然压缩了Trie树,优化了一定的空间,但是增加了维护成本

后缀树

三分词典的树

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。