2012-02-08 82 views
2

假設我們要保存n節點的有序樹形狀,每個節點最多有2個子節點。 如果它是一個二叉樹,我們必須使用2n位。因爲在我們的情況下,我們沒有左或右的孩子,他們是一樣的,所以我們必須有一些冗餘的序列。那麼,我們可以用更好的方式對它進行編碼嗎?看來每個節點仍然有3個案例,沒有孩子,一個孩子,兩個孩子,但是我們可以將它存儲在少於2位的位置嗎?或總共有一個更好的常數比2?如何更有效地將有序樹編碼爲位序列

+0

這有可能,但我對此表示懷疑。你可以重建一個樹都預購和中序遍歷,而不是隻有一個人[也不與後序遍歷],所以你再「堅持」用2個常數使用這種方法。 – amit 2012-02-08 21:27:22

+0

p.s.它是2n個字而不是位,每個指向一個節點的指針都包含多一點。 – amit 2012-02-08 21:29:42

+0

@amit他只是存儲樹的形狀。所以它是2n位。 – ElKamina 2012-02-08 21:32:43

回答

1

你也許可以爲你提到存儲2n個位,然後用huffman coding或其他lossless data compression技術來壓縮該數據。

我不認爲你可以達到更好的最壞情況的界限,但在平均情況下 - 它應該爲你節省一些空間。

+0

如果我們沒有約束每個節點最多有2個孩子,那麼證明我們能做的最好的事情是使用2n加上一些東西。但在這種情況下,我仍然認爲這可能會完成。 – user22997 2012-02-08 21:48:14

1

有兩種方法來解決:

  1. 編碼多級子樹。例如:在最大電平2可以有四種形狀:()中,(a),(A-> B)和(a < -B-> C)。現在使用0,10,110,111來處理這些情況。對於簡單的2級完整樹編碼是:111 0 0. 3級完整樹是:111,10,10。對於4級完整樹,這變成:111 111 111 0 0 0 0。任務是任意的。您可以使用霍夫曼編碼方案(如上所述)來尋找最佳編碼。這種編碼方案對鏈條來說更糟糕。對於一個純鏈,你需要3n-2位來存儲。

  2. 做2n位編碼,然後用任何壓縮算法壓縮。

===另一種方法===

在每一個節點的正常表現,你可以有以下三個選項之一:00,01,11,現在,採取三個節點在同一時間。你可以有27個組合。您可以將這些組合中的每一個以5位存儲。這樣,所需的平均存儲量變爲5/3而不是2位。此外,您可以嘗試組合任意數量的節點。請參閱下表爲壓縮率:

正如你所看到的,如果你把10個節點同時您可以通過係數1.25減少存儲空間

naive_length compr_length compr_factor 
2 2 1.0 
4 4 1.0 
6 5 1.2 
8 7 1.14285714286 
10 8 1.25 
12 10 1.2 
14 12 1.16666666667 
16 13 1.23076923077 
18 15 1.2 
20 16 1.25 
22 18 1.22222222222 
24 20 1.2 
26 21 1.2380952381 
28 23 1.21739130435 
30 24 1.25 
32 26 1.23076923077 
34 27 1.25925925926 
+0

謝謝,@ElKamina,但是當樹非常不平衡時,它會變得更糟。沒有壓縮可以獲得更好的結構嗎? – user22997 2012-02-08 22:02:11

+0

@ user22997你能否提供我樹中每個形狀的數量(即(),(a),(a-> b)和(a <-b-> c))的數量? – ElKamina 2012-02-08 23:14:34

+0

@ user22997不要擔心計數。使用我在解決方案中描述的新方法。 – ElKamina 2012-02-09 00:11:56

0

(即空間減少20%),如果我正確理解,如果一個節點有一個孩子,這不是左或右的孩子,即你不辨左右在一個孩子的情況下。然後我認爲它可以在(日誌3)n中以日誌爲基數2來完成。

您可以通過預先遍歷來描述樹,爲每個節點編寫子節點數(0,1或2)。這將創建一個長度爲n的基數3(實際上長度爲n - 1,最後一個節點將始終爲零)。恰好有3 ^(N - 1)這樣的數字,這可以以二進制編碼的(對數3)(N - 1)〜= 1.59(N - 1)。

可以使用O(log n)位在編碼位串的開頭寫入位數。

更新:這裏是一個implementation

+0

謝謝,@aelguindy,我認爲你展示的常量可能是n * log3,但是有沒有這樣的編碼方法? – user22997 2012-02-09 01:16:56

+0

當然,我修改了答案並添加了Python實現。 – aelguindy 2012-02-09 10:00:15