博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Trie树的学习--英文字典树的建立和获得前缀次数
阅读量:6572 次
发布时间:2019-06-24

本文共 1555 字,大约阅读时间需要 5 分钟。

hot3.png

2012112521092438.png

根节点为root

private Vertex root = new Vertex();

节点类:Vertex 

节点包含3个属性:

        protected int words; // 单词个数  到该节点为止,可以组合出单词的个数 

        protected int prefixes; // 前缀个数  到该节点位置,可以组合出符合该前缀单词的个数
        protected Vertex[] edges; // 子节点  

新建英文字典树:添加单词

root 节点:

先判定word的length 是否未0 ,0 代表解表截止 words++;不需要添加子节点,前缀个数也无需增加

至多可以有26个节点 0 25 第一个单词的第一位的char(不区分大小写)-a的hash就是就是该字符的index  edges[index]

    private void addWord(Vertex vertex, String word) { //添加单词到目录树,root , word

        if (word.length() == 0) { // if all characters of the word has been
                                    // added
            vertex.words++;
        } else {
            vertex.prefixes++;//前缀个数
            char c = word.charAt(0);
            c = Character.toLowerCase(c);//无视大小写
            int index = c - 'a';获得该节点的index
            if (vertex.edges[index] == null) { // if the edge does NOT exist  新建一个  
                vertex.edges[index] = new Vertex();
            }
 
            addWord(vertex.edges[index], word.substring(1)); // go the the next继续添加下个字符的节点
                                                                // character
        }
    }

添加完所有单词 字典树已经建好了

 

那么就是查找符合该前缀的单词数了!!

 

    /**
     * 计算指定前缀单词的个数
     * 
     * prefix
     *
     */
    public int countPrefixes(String prefix) {//输入要查找的单词
        return countPrefixes(root, prefix);  //从根节点开始查找
    }
 
    private int countPrefixes(Vertex vertex, String prefixSegment) {
        if (prefixSegment.length() == 0) { // 输入的单词未空的话直接返回所有的root下的单词数 

    //或者已经到这个单词的结尾时 可以返回该节点下的子节点个数 也就是符合该前缀的单词数

                                            
            return vertex.prefixes;
        }
 
        char c = prefixSegment.charAt(0); //获得第一个字符的hash
        int index = c - 'a';//获得第一个字符的index
        if (vertex.edges[index] == null) { // 如果该节点下无子节点 直接返回0
            return 0;   //第一执行这个方法会进入 
        } else {
 
            return countPrefixes(vertex.edges[index],
                    prefixSegment.substring(1)); //递归
 
        }
 
    }
 这样你就可以得到符合该前缀的所有单词的个数啦!!

 

 

 

转载于:https://my.oschina.net/xiaoshoubingliang/blog/777480

你可能感兴趣的文章
socket 编程入门教程(五)UDP原理:4、“有连接”的UDP
查看>>
linux sort 命令详解
查看>>
Jquery获取iframe中的元素
查看>>
Laravel 学习笔记5.3之 Query Builder 源码解析(下)
查看>>
Struts2简单入门实例
查看>>
Android应用及应用管理
查看>>
2012CSDN年度博客之星评选http://vote.blog.csdn.net/item/blogstar/xyz_lmn
查看>>
Linux系统与网络服务管理技术大全(第2版)
查看>>
window下配置定时任务实现类似linux的cron定时任务
查看>>
铁道部否认被中铁工程等十多家公司老总蹲点讨债
查看>>
js事件---事件流
查看>>
我的友情链接
查看>>
谁拿了最多奖学金
查看>>
详解linux运维工程师入门级必备技能
查看>>
我的友情链接
查看>>
PhoneGap在Microsoft Visual Studio Express For Wi...
查看>>
Shell脚本的模块化和脚本复用
查看>>
暴力删除
查看>>
unable to bind to locking port 7054 within 45000 ms
查看>>
自动化运维之kickstart自动化部署安装操作系统
查看>>