所以我正在实现我自己的二分查找树,并注意到一个丑陋的if语句经常以我的方式出现(这可能不是最好的方式,但这不是我们正在讨论的内容),基于节点的子节点是左子节点还是右子节点,例如:
if (leftChild)
parent.setLeft(child.getRight());
else
parent.setRight(child.getRight());
然后我想到了这个:
parent.setChild(childIndex, child.getRight());
其中childIndex是先前已确定leftChild的字节。
正如你可以看到的那样简洁,但是要这样做,我要么必须在setChild方法中有一个if语句,要么将子节点表示为长度为2的数组。如果我们假装这个BST需要最大化性能/空间效率,将子节点引用的存储切换到2元素数组而不是一对变量(甚至只是隐藏setChild方法中的if语句)会有什么样的权衡。
我知道在现实世界的情况下,这可能并不重要,但我仍然对哪种方法是最好的方法感兴趣。
答案 0 :(得分:10)
据我所知,你问,以下哪两项更有效:
if (condition)
x = value
else
y = value
和
xyArray[index] = value
首先,任何答案都是编译器和/或JVM实现依赖,因为JLS没有提到任何类型语句的任何执行时间。
话虽如此,我会怀疑 if
- 语句稍快一些,因为JVM不必计算任何数组偏移量并检查数组边界。
无论如何,这对我来说有点像过早优化。选择基于最容易读取和调试 的方法。
答案 1 :(得分:1)
我相信,如果存储为两个字段,您将不会只有一个if
,那么您的代码将与它们一起抓取。 if
很可能更有效率,并且在内存方面也更有效地拥有两个字段而不是另一个堆分配的对象 - 一个完整的对象,具有通常的开销。如果您的树真的非常庞大(数百万个节点),那么 是一个问题。此外,如果每个节点的有效负载与开销相比很小。