演算法競賽入門經典--紫書6.3.1小球下落

bbbbaai發表於2015-04-27

每個小球都會落在根節點上,因此前兩個小球必然是一個在左子樹,一個在右子樹。一般地,只需看小球編號的奇偶性,就能知道它是最終在哪棵子樹中。對於那些落入根節點 左子樹的小球來說,只需知道該小球是第幾個落在根的左子樹裡的,既可以知道它下一步往左還是往右了。以此類推,直到小球落到葉子上。

如果使用題目中給出的編號n,則當I是奇數時,它是往左走的第(n+1)/2個小球;當I是偶數時,它是往右走的對n/2個小球。這樣,可以直接模擬最後一個小球的路線。

-----------------------------------------------------------------

以上是摘抄。不好理解。

個人理解:

每一個雙親節點,在球經過時。對於該節點,該球若為第偶數個則往左走,奇數個就往右走。

這個規律正好和十進位制轉換為二進位制的時候的奇偶過程一致。所以可以用計算後者的步驟餘數來代表規律中的方向。就可以計算了。

比如:

如果把向左和向右描述成0和1.D=4時

那麼第0個小球的方向變化為:0,0,0;第1個小球:1,0,0 ;第2個小球:0,1,0;第3個小球:1,1,0

恰好是其二進位制的逆序。所以程式中可以使用


for(int i = 0; i < d-1; i++)
if(n%2){ k *= 2; n = (n+1)/2;}else{ k = k*2+1; n /= 2;}

就像是在將10進位制轉換為2進位制一樣進行趨勢控制,迴圈體內不斷地做n%2。

用深度來進行層次控制,<d-1。

而根據趨勢不同來計算最終下落到的節點的號碼,k的計算。

相關文章