【问题标题】:Tree representation in javajava中的树表示
【发布时间】: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


【解决方案1】:

我认为您不需要将这么多变量传递给您的构造函数。它可以简单得多。我建议为Node 设置一个单独的static 内部类(嵌套类)。还可以利用 java 泛型 (&lt;T&gt;) 像这样:

public class MyTree<T> {

    private Node<T> root;

    public MyTree(T rootData) {
        root = new Node<T>();
        root.data = rootData;
        root.children = new ArrayList<Node<T>>();
    }

    public static class Node<T> {
        private T data;
        private Node<T> parent;
        private List<Node<T>> children;
    }
}

附带说明一下,JDK 中实现了一个树形结构,即使没有 Swing 接口,您也可以使用它。 (javax.swing.treeTreeModelTreeNode

【讨论】:

  • (此评论与本回复内容无关。)这个世界充满了陌生人。为什么要成为敌人而不是朋友。我今天对你的评论反应有点过度了。享受您在 S.O. 的旅程。 (奇怪,我不能@你)。
  • @smwikipedia 你可以在这里删除 cmets :)
  • @ldos 他们很有教育意义。如果不违反规则,让我们保留它们。
  • @idos 谢谢你的回答。我不知道 java 泛型 (),所以我必须进一步研究它。
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
相关资源
最近更新 更多