字典树(前缀树/后缀树)

虽然据说用途是为了计数字数,但是我想HashMap可以做到。 虽然据说比HashMap消耗内存小,但是感觉即使小也哪里都去不了。

为了查文字,也有人说还是那句话,但HashSet说我也可以。

在Hash没有出现之前,可能在这些领域占有一席之地。 现在,从数据结构来看,我认为其作用在以下几个方面可能很突出。

也称为前缀树,是删除相同前缀的操作。 这里一般不知道。 稍后慢慢说出搜索提示,说出以下结构就能理解结构了

这就是字典树。 试着沿着最左边走。 那就是善良的水壶。

谈谈刚才提到的第一个用途,前缀树。 例如,有两个字符串:善良的水壶和约翰。 我知道两者有前缀,JOHN。 这个有什么作用? 可能在数据压缩时使用,但也可以看这个问题。

820 .单词的压缩代码接下来,谈谈第二个功能。 比如在搜索框里输入JO,根据字典树推测,你要找的可能是善良的水壶或者慈爱的口红,我会给你一些提示。

定义数据结构说明数据结构,主要说明如何定义数据结构,以及相关操作,这里是添加(构建)、删除操作。

因为这也是树的结构。 但是,这里不一定是二叉树。 上图有点误会。 如果我们表示英语字符,应该可以从根节点中选择26个字符。

class NodeTree{ //使用数组编号代替字符可以降低搜索查询时间的复杂性; //记录下一个子节点被使用的个数,int count=0进行删除操作; NodeTree () { charNode=new NodeTree[26]; }添加(构建)添加和构建本质上是相同的,构建是通过一定数量的添加来实现的。

//直接字符串publicvoidaddstring(strings,NodeTree root ) for ) intI=0; i s.length (; I () charc=s.charat ) I; if(root.charnode[c-‘a’]==null ) root.char node [ c-‘ a ‘ ]=new node tree; root=root.charNode[c-‘a’]; root.count; }//publicnodetreeaddchar(charc,NodeTree root ) (if(root.charnode(c-‘a )==null ) root.charnode ) ) ) return root.charNode[c-‘a’]; }为了验证添加是否成功,编写用于搜索字符的函数

publicbooleanfindstring (strings,NodeTree root ) { boolean flag=false; for(intI=0; i s.length (; I () charc=s.charat ) I; root.char node [ c-‘ a ‘ ]==null )返回标志; root=root.charNode[c-‘a’]; } return! 闪光灯; } publicclasstrimtree { publicstaticvoidmain (string [ ] args ) { NodeTree root=new NodeTree; root.addstring(‘test ‘,root; system.out.println (root.find string (‘ tes ‘,root ) ); system.out.println (root.find string ),root ); system.out.println (root.find string ),root ); }//true false上面的这个测试输出,在词典树中写,test,test的前缀,查询tes,就可以正常查询了。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注