java字典树 实现统计

统计一个单词可重复的英文文件(假设4G)中每个单词出现的次数,把结果按照英文排序放入一个文件中, 并能够检索特定单词的出现次数,由于文件过大,不重复单词总数有限。 需要考虑到执行速度和内存使用情况。

public class Trie {
	private int SIZE = 26;
	private TrieNode root; // 字典树的根
	StringBuffer sb=new StringBuffer("");
	Trie() { // 初始化字典树
		root = new TrieNode();
	}

	private class TrieNode { // 字典树节点
		private int num;// 有多少单词通过这个节点,即节点字符出现的次数
		private TrieNode[] son;// 所有的儿子节点
		private boolean isEnd;// 是不是最后一个节点
		private char val;// 节点的值
		private boolean visited;// 是否被访问
		private int count;

		TrieNode() {
			num = 1;
			son = new TrieNode[SIZE];
			isEnd = false;
			visited = false;
			count=0;
		}
	}

	// 建立字典树
	public void insert(String str) { // 在字典树中插入一个单词
		if (str == null || str.length() == 0) {
			return;
		}
		TrieNode 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 TrieNode();
				node.son[pos].val = letters[i];
			} else {
				node.son[pos].num++;
			}
			node = node.son[pos];
		}
		node.count++;
		node.isEnd = true;
	}
	// 在字典树中查找一个完全匹配的单词.
	public boolean has(String str) {
		if (str == null || str.length() == 0) {
			return false;
		}
		TrieNode 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;
			}
		}
		System.out.println(node.count + "次出现");
		return node.isEnd;
	}

	public TrieNode getRoot() {
		return this.root;
	}

	public void dfs(TrieNode node) {//先根遍历 
		for (int i = 0; i < 26; i++) {
			if(node.son[i]!=null){
			sb.append(node.son[i].val);
			if(node.son[i].count>0){
			System.out.println(sb.toString()+" "+node.son[i].count);
			//写入文件
			}
			dfs(node.son[i]);
			sb=new StringBuffer(sb.substring(0,sb.length()-1));
			}
		}
	}

	public static void main(String[] args) {
		Trie tree = new Trie();
		String[] strs = { "banana", "band", "bee", "absolute", "ac", "acm" ,"ac","a"};
		for (String str : strs) {
			tree.insert(str);
		}
		//System.out.println(tree.has("a"));
		tree.dfs(tree.getRoot());
		
		}

	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值