在java中创建树的最有效方法是什么?

时间:2011-05-05 02:35:04

标签: java tree

我正在用Java创建一个树来为人工智能的广泛形式的游戏建模。树将是一棵25树(一棵树,其中每个树枝最多有25个儿童树枝),因为在游戏的每个转弯处有25种不同的动作。因为必须在树的每个新层中创建的新分支的数量是25 ^ n,所以我非常关心如何使其高效。 (我打算无情地削减树枝以防止它们长大,以防止事情陷入困境)。当效率受到关注时,对这种树进行建模的最佳方法是什么?我的第一印象是有一个节点对象,其中每个节点都有一个父节点和一个子节点数组,但这意味着创建了很多对象。最终这些是我的问题:

这是创建和管理我的树的最快方法吗?

计算程序中任何给定算法或进程需要花费多少时间的好方法是什么? (到目前为止,我唯一想到的是在进程之前创建一个日期,之后再比较已经过的毫秒数)

欢迎任何其他想法。我的问题暗示并且与我预期的许多其他问题有关。如果我一直含糊不清或不清楚,请发表评论告诉我,而不是进行投票和冲击,因为这样做效率不高。

2 个答案:

答案 0 :(得分:2)

实际上,你描述的方式是最好的方法。与您可以做的任何其他事情相比,它的表现相当不错,并且可以直接实施。

人们一次又一次地询问如何“有效地”做事。最好的答案几乎总是,“甚至不打扰尝试”。除非你的改进是算法改进,否则它不太可能产生很大的不同,特别是在这样的情况下,额外的努力和复杂性并不值得你可能实现的微小的收益。

换句话说,借用引用(虽然我记不起发起者),优化的第一条规则是:不要。

话虽如此,如果你真的觉得需要挤压每一滴速度,你可以尝试缓存并重新使用对象(而不是完全丢弃它们,在免费的对象存储中跟踪它们,然后当您需要创建一个新对象,首先检查免费对象库以检查是否存在现有对象。与往常一样,您需要在之前和之后测量性能以确定它是否真的有帮助(除非物理内存确实受到限制,否则它可能无济于事,在这种情况下,垃圾收集会变得昂贵)。

答案 1 :(得分:1)

我同意之前关于仅在您实施其余应用程序后进行优化的评论。

另一方面,我确实意识到一些可能很重要的事情:

  1. 分支因子25:虽然不是很大,但对于其他问题来说仍然很大。对于树,您肯定必须有每个节点的列表以指示子节点列表。您可以通过创建一个Node类,其中包含一组节点,或者使用外部Map将给定节点映射到子节点列表来实现此目的。

  2. 将完成对元素的删除和添加:这有助于存储子元素的LinkedList实现,因为您不希望执行昂贵的删除和添加。 HashSet也可以工作,但问题是您可能需要更多内存。

  3. 元素的迭代可能会也可能不会完成:如果要在每一步迭代整个列表,LinkedLists就可以了。如果要确定节点的优先级,则可以使用优先级队列数据结构来节省内存。如果要实现启发式函数并评估要在任何给定节点上移动的子项,优先级队列尤其有用。

  4. 这就是我到目前为止所做的一切,但如果我想到更多的事情,或者你更新了你的内容,我会不断更新。