统计一个单词可重复的英文文件(假设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());
}
}
}