2012-07-18 43 views
4

所以我正在实现我自己的二叉搜索树,并注意到一个丑陋的if语句经常以我的方式出现(这可能不是最好的方式,但这不是我们正在讨论的)在一个节点的孩子是否是左或右的孩子,如:为了语法上的原因,是否值得使用长度为2的数组而不是两个变量?

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

然后我想到了这一点:

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

如果childIndex是较早确定其中leftChild本来是一个字节决心。

正如你可以看到这个更简洁,但要这样做,我要么必须在setChild方法中有一个if语句,要么代表长度为2的数组。如果我们在这里假装这个BST要求最大化的性能/空间效率,将子节点引用的存储切换为2元素数组而不是一对变量(或者甚至只是将set语句隐藏在setChild方法内部)会有什么样的折衷? 。

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

+4

我会选择在可能的小性能增益可读性。 – 2012-07-18 08:34:34

回答

10

据我了解,你所问的是以下两种中的哪一个更有效:

if (condition) 
    x = value 
else 
    y = value 

xyArray[index] = value 

所有任何回答首先是编译器和/或JVM实现因为JLS没有提及任何类型语句的执行时间。

话虽这么说,我会嫌疑,由于JVM不必计算任何阵列偏移和检查数组边界的if语句来将略快。

无论如何,这听起来像不成熟的优化给我。选择基于的方法哪一个最简单读取调试

+0

我想知道HotSpot是否会优化对'private final Node [] children = new Node [2];的访问权限''以消除范围检查。所有的信息都在确保它是安全的。 – 2012-07-18 08:46:10

+0

是的。这是一个有趣的问题。虽然有人通过反思改变了“儿童”的价值,但总有一些不幸的情况。 – aioobe 2012-07-18 08:47:28

+0

我听说过通过反射来改变一个'私人',但是'最后'?这真的有可能吗? – 2012-07-18 08:51:24

1

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

相关问题