我已经建立了具有预定最大级别的N叶树。
我要填写的数据约为1.5亿个字符。
我填充树的方法是创建一个长度等于最大级别的list<Character>
,然后调用addNodes(List<Character>)
方法。(源代码在下面)
现在的问题是,最大级别越高,花费的时间越长,这是显而易见的。使用level = 6
大约需要4分钟,而使用level = 7
则需要20分钟。
我正在寻找的是一种可能并行填充树的方法(我不知道该怎么做,甚至根本无法受益)或使填充过程更有效,内存不是问题(目前至少)。
源代码:
节点:
public class Node {
Node parent;
List<Node> children;
Character keyvalue;
int count;
//Constructors & getter and setter methods
}
树:
public class Tree{
Node root
public void addListToTree(List<Character> list){
//check if list.isEmpty
if(root.children.isEmpty()){
Node parent = root;
for (Character e : list) {
Node node = new Node(parent, e, 1, 0);
parent.addChildren(node);
parent = node;
}
} else {
Node tmp = root;
for (int i = 0; i < list.size(); i++) {
Node node = new Node(null, list.get(i), 1, 0);
if (-1 != tmp.getChildIndex(node)) {
tmp = tmp.getChild(node);
tmp.setCount(1); //increments counter by 1
} else {
node.setParent(tmp);
tmp.addChildren(node);
tmp = node;
}
}
}
}
}
ReadFileContents:
public void start() {
String file_contents = "";
try {
FileReader fr = new FileReader(new File(filepath));
BufferedReader br = new BufferedReader(fr);
String tmp;
while ((tmp = br.readLine()) != null) {
file_contents += tmp;
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
ArrayList<Character> tmp = new ArrayList<Character>();
for (char e : file_contents.toCharArray()) {
tmp.add(e);
// System.out.println("Chunksize: " + chunksize);
if (chunksize == tmp.size()) {
toTrain.addListToTree(tmp);
tmp.remove(0);
}
}
while (tmp.size() > 0) {
toTrain.addListToTree(tmp);
tmp.remove(0);
}
}