Trie树:统计词频、排序、查找

Trie树是一种数据结构,利用字符串公共前缀减少查询时间,简化插入、删除和查找操作。通过逐字符遍历,从根节点开始沿着字母路径检索,直到关键词所有字母匹配完成,实现快速的字频统计、排序和查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Trie树利用字符串的公共前缀降低了查询时间的开销,提高了查询的效率。

字典树的插入,删除和查找都非常简单,用一个一重循环即可。

1. 从根节点开始一次搜索

2. 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索

3. 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索

4. 迭代过程...

5. 在某个节点处,关键词的所有字母已被取出,则读取附在该节点上的信息,即完成查找

package algrithm;

public class dictionaryTree2 {

	private int SIZE=26;
	private TreeNode root;//字典的根
	
	public dictionaryTree2() {
		// TODO Auto-generated constructor stub
		root=new TreeNode();
	}
	
	private class TreeNode
	{
		 private int num; //词频统计
		 private TreeNode []son;//每一层都是由26字母开头的,即所有的节点
		 private boolean isWord;//是不是最后一个节点
		 private char val;//节点的值
		
		TreeNode()
		{
			num=1;
			son=new TreeNode[SIZE];
			isWord=false;
		}
	}
	
	public void insert(String str)
	{
		if(str==null||str.length()==0)
			return ;
		TreeNode node=root;
		char[] letters=str.toCharArray();
		for(int i=0,len=str.length();i<len;i++)
		{
			int pos=letters[i]-'a';
			if(node.son[pos]==null)
			{
				node.son[pos]=new TreeNode();
				node.son[pos].val=letters[i];
			}
			else
			{
				node.son[pos].num++;
			}
			node=node.son[pos];
		}
		node.isWord=true;
	}
	
	public int countNums(String str){  //计算单词的数量
        if(str==null||str.length()==0){  
            return -1;  
        }  
        TreeNode node=root;  
        char[] letters=str.toCharArray();  
        for(int i=0,len=str.length();i< len;i++){  
            int pos=letters[i]-'a';  
            if(node.son[pos]==null){  
                return 0;  
            }else{  
                node=node.son[pos];  
            }  
        }  
        return node.num;  
    }  
	
    // 在字典树中查找一个完全匹配的单词.  
    public boolean search(String str) {  
        if (str == null || str.length() == 0) {  
            return false;  
        }  
        TreeNode node = root;  
        char[] letters=str.toCharArray();  
        for (int i = 0, len = str.length(); i < len; i++) {  
            int pos = letters[i] - 'a';  
            if (node.son[pos] != null) {  
                node = node.son[pos];  
            } else {  
                return false;  
            }  
        }  
        return node.isWord;  
    }  
   
    public TreeNode getRoot(){  
        return this.root;  
    }  
    
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		dictionaryTree2 tree = new dictionaryTree2();  
	        String[] strs={"beer","banana", "band","bee", "you","young","that"};
	        for(String str : strs){  
	            tree.insert(str);
	        }
	        System.out.println(tree.search("bee"));
	        System.out.println(tree.countNums("ba"));
	      
	}

}

输出结果:

true
2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值