Trie树|字典树(字符串排序)

举报
香菜聊游戏 发表于 2021/07/15 00:05:34 2021/07/15
【摘要】 有时,我们会碰到对字符串的排序,若采用一些经典的排序算法,则时间复杂度一般为O(n*lgn),但若采用Trie树,则时间复杂度仅为O(n)。 Trie树又名字典树,从字面意思即可理解,这种树的结构像英文字典一样,相邻的单词一般前缀相同,之所以时间复杂度低,是因为其采用了以空间换取时间的策略。 下图为一个针对字符串排序的Trie树(我们假设在这里字符串都是小写字母),...

有时,我们会碰到对字符串的排序,若采用一些经典的排序算法,则时间复杂度一般为O(n*lgn),但若采用Trie树,则时间复杂度仅为O(n)。

Trie树又名字典树,从字面意思即可理解,这种树的结构像英文字典一样,相邻的单词一般前缀相同,之所以时间复杂度低,是因为其采用了以空间换取时间的策略。

下图为一个针对字符串排序的Trie树(我们假设在这里字符串都是小写字母),每个结点有26个分支,每个分支代表一个字母,结点存放的是从root节点到达此结点的路经上的字符组成的字符串。

将每个字符串插入到trie树中,到达特定的结尾节点时,在这个节点上进行标记,如插入"afb",第一个字母为a,沿着a往下,然后第二个字母为f,沿着f往下,第三个为b,沿着b往下,由于字符串最后一个字符为'\0',因而结束,不再往下了,然后在这个节点上标记afb.count++,即其个数增加1.

之后,通过前序遍历此树,即可得到字符串从小到大的顺序。(图取自网络)


数据结构如下:


  
  1. package com.trie;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. /**
  5. * @author silence
  6. * @since 2013/7/2
  7. * */
  8. public class Node {
  9. boolean isWord = false;
  10. Node[] child = new Node[26];//0-25:a:b
  11. List<String> pos = new ArrayList<String>();
  12. }


  
  1. package com.trie;
  2. /**
  3. * @author silence
  4. * @since 2013/7/2
  5. * */
  6. public class Trie {
  7. private Node root;
  8. Trie(){
  9. root = new Node();
  10. }
  11. public void addWord(String word,String pos){
  12. int len = word.length();
  13. Node s = root;
  14. for(int i =0;i<len;i++){
  15. int ch = word.charAt(i)-97;//c2 h7
  16. if(s.child[ch] !=null){//有节点了
  17. s = s.child[ch];//后移
  18. }else{//没节点
  19. Node child = new Node();
  20. if(i==len-1){//最后一个字符
  21. child.isWord = true;
  22. child.pos.add(pos);
  23. }
  24. s.child[ch] = child;//挂上节点
  25. s = child;//后移
  26. }
  27. }
  28. }
  29. public void findWord(String word){
  30. int len = word.length();
  31. Node s = root;
  32. for(int i =0;i<len;i++){
  33. int ch = word.charAt(i)-97;
  34. if(s.child[ch]!=null){//节点存在
  35. s = s.child[ch];//后移
  36. if(i == len -1){
  37. for(String pos :s.pos){
  38. System.out.println(pos);
  39. }
  40. }
  41. }else{
  42. System.out.println("不存在这个单词");
  43. return ;
  44. }
  45. }
  46. }
  47. public static void main(String[] args) {
  48. Trie trie = new Trie();
  49. trie.addWord("silence", "1");
  50. trie.addWord("hello", "2");
  51. trie.addWord("word", "3");
  52. trie.findWord("silence");
  53. }
  54. }



文章来源: gamwatcher.blog.csdn.net,作者:香菜聊游戏,版权归原作者所有,如需转载,请联系作者。

原文链接:gamwatcher.blog.csdn.net/article/details/9223227

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。