應該可以將id轉換爲樹並返回。
ID和位串是:
0 -> 0
1 -> 100
2 -> 11000
3 -> 10100
4 -> 1110000
5 -> 1101000
6 -> 1100100
7 -> 1011000
8 -> 1010100
首先考慮的是給定一個位串的事實,我們可以輕鬆地移動到樹(遞歸方法),反之亦然(預購,輸出1爲家長和0葉)。
主要挑戰來自試圖將id映射到位串,反之亦然。
假設我們列了出來n個節點的樹如下:
Left sub-tree n-1 nodes, Right sub-tree 0 nodes. (Cn-1*C0 of them)
Left sub-tree n-2 nodes, Right sub-tree 1 node. (Cn-2*C1 of them)
Left sub-tree n-3 nodes, right sub-tree 2 nodes. (Cn-3*C2 of them)
...
...
Left sub-tree 0 nodes, Right sub-tree n-1 nodes. (C0*Cn-1 of them)
Cr = rth catalan number.
你給枚舉似乎來自以下過程:我們保持固定的左子樹,通過右子樹枚舉。然後移到下一個左側子樹,通過右側子樹列舉,依此類推。我們從最大尺寸左子樹開始,然後下一個是最大尺寸-1等。
所以說我們有一個ID = S說。我們首先找到的n使得
C0 + C1 + C2 + ... +道道<小號< = C0 + C1 + C2 + ... +的C n + 1
則S將對應於樹n + 1個節點。所以你現在考慮P = S - (C0 + C1 + C2 + ... + Cn),它是n + 1個節點樹的枚舉中的位置。
現在我們找出的R,使得道道* C0 +的C n - 1 * C1 + .. +的C n-R 鉻< P < = CN C0 +的C n - 1 * C1 + .. +的C n-R + 1 * Cr-1
這告訴我們左子樹和右子樹有多少個節點。我們現在可以計算出精確的左子樹枚舉位置(僅考慮那個大小的樹)和精確的右子樹枚舉位置並遞歸地形成位串。
將bitstring映射到id應該類似,因爲我們知道左側子樹和右側子樹是什麼樣子,我們需要做的就是找到相應的位置並進行一些算術運算以獲得ID。
不知道它是多麼有幫助。你會一直在處理一些非常龐大的數字。
加泰羅尼亞語數字增長爲O(4^n),這比階乘慢。 – 2010-02-15 20:19:54
你說得對。我不記得爲什麼我認爲他們的成長更快,但我已經刪除了錯誤。謝謝。 – Joren 2010-02-15 20:40:16