【发布时间】:2016-01-07 11:43:27
【问题描述】:
我正在撰写与人工智能领域相关的论文工作。
我想制作一个实时推荐系统,所以我需要用树来表示决策。
我的主要问题是如何以有效的方式表示这棵树?我想提一下,这棵树将自下而上和自上而下地遍历。此外,这棵树不是二元的,它拥有的节点非常多(超过 100 个)。
现在我已经创建了一个像上面这样的节点类:
public class node {
private String nodeName;
private expectedValue ev;
private boolean isLeaf;
private boolean isRoot;
private List<node> listOfChildren = new ArrayList<node>();
private node parent;
public node(String nodeName) {
super();
this.nodeName = nodeName;
}
public node(String nodeName, boolean isLeaf, boolean isRoot, List<node> listOfChildren, node parent) {
super();
this.nodeName = nodeName;
this.isLeaf = isLeaf;
this.isRoot = isRoot;
this.listOfChildren = listOfChildren;
this.parent = parent;
}
public void initializeNode(boolean isLeaf, boolean isRoot, List<node> listOfChildren, node parent) {
this.isLeaf = isLeaf;
this.isRoot = isRoot;
this.listOfChildren = listOfChildren;
this.parent = parent;
}
//getter and setter here......
}
但我认为这不是表示树的最有效方式....
那么,在 Java 中表示树的有效方法是什么?有没有一种方法可以动态创建树,还是必须一个节点地初始化它?
谢谢!
【问题讨论】:
-
我将其标记为“过于宽泛”/“基于意见”,因为您的请求没有正确答案。它还很大程度上取决于树的确切要求。顺便说一句,你不需要 "isLeaf" (listOfChildern.size() == 0) 或 "IsRoot" (parent == null)。
-
您为什么“认为这不是表示树的最有效方式”?您认为它存在哪些问题?
-
@Dima :由于这个系统将实时运行并且树有很多节点,我相信列表的开销(例如儿童列表)是太大了,它可以以更高效和“优雅”的方式完成。
-
为了得到最有帮助的答案,您能否提供有关节点上操作(添加、更新、删除;可能是随机播放、重新附加等)的相对频率的数据/估计,可能采取考虑到典型的操作顺序?由于目标是推荐系统,因此优化以最小化查询时间可能是最好的方法。
标签: java algorithm tree artificial-intelligence