4

所以我正在实现我自己的二叉搜索树,并注意到一个丑陋的 if 语句经常以我的方式出现(这可能不是最好的方式,但这不是我们正在讨论的),基于是否节点的孩子是左孩子或右孩子,例如:

if (leftChild)
    parent.setLeft(child.getRight());
else
    parent.setRight(child.getRight());

然后我想到了这个:

parent.setChild(childIndex, child.getRight());

其中 childIndex 是一个早先确定的字节,其中 leftChild 将被确定。

正如您所看到的那样更简洁,但是要以这种方式使用它,我要么必须在 setChild 方法中使用 if 语句,要么将子项表示为长度为 2 的数组。如果我们在这里假装这个 BST 需要最大化性能/空间效率,将子节点引用的存储切换为 2 元素数组,而不是一对变量(甚至只是将 if 语句隐藏在 setChild 方法中)会是一种什么样的权衡。

我知道在现实世界中这可能并不重要,但我仍然对哪种方法是最好的方法感兴趣。

4

2 回答 2

10

据我了解,您要问的是,以下两者中哪一个更有效:

if (condition)
    x = value
else
    y = value

xyArray[index] = value

首先,任何答案都取决于编译器和/或 JVM 实现,因为 JLS 没有提及任何类型语句的任何执行时间。

话虽如此,我怀疑if- 语句会稍微快一些,因为 JVM 不必计算任何数组偏移量并检查数组边界。

无论如何,这对我来说听起来像是过早的优化。根据哪种方法最容易阅读调试来选择方法。

于 2012-07-18T08:33:29.573 回答
1

我相信,如果存储为两个字段,您将不会只有一个if,您的代码将与它们一起爬行。if有两个字段而不是另一个堆分配的对象——一个完整的对象,具有通常的开销,这很可能更有效,并且在内存方面也更有效。如果你的树真的非常非常大(数百万个节点),这一个问题。此外,如果每个节点的有效负载与开销相比很小。

于 2012-07-18T08:41:31.627 回答