2012-07-18 47 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很有可能更有效率,並且它具有兩個字段而不是另一個堆分配對象,因此它在記憶方面更有效,因爲它具有通常的開銷。如果你的樹會真的,真的很大(數百萬個節點),這個問題是。另外,如果每個節點的負載與開銷相比都很小。

相關問題