兄弟數字;及修理柵欄分析

紫鳳發表於2013-08-26

今日面試題:兄弟數字

給定一個數X,他的兄弟數Y定義為:是由X中的數字組合而成,並且Y是大於X的數中最小的。例如,38276的兄弟數字為38627。給定X,求Y。

=======================================

修理柵欄

分析

原題為了修理柵欄,需要將很長的木板鋸為N塊,長度分別為L1,L2...LN。鋸斷一塊兒木板,需要一定的開銷,開銷記為木板的長度。例如,長度為21的木板,鋸為三塊,長度分別為5,8,8。如下按照如下的順序據斷:

首先鋸斷21為13和8兩塊兒,開銷為21


然後鋸斷13為8和5兩塊兒,開銷為13

總的開銷為34。但也可以按照如下的順序:

首先鋸斷21為16和5兩塊兒,開銷為21


然後鋸斷16為8和8兩塊兒,開銷為16

總的開銷為37。比34要大。

問題是,給定N,以及每一塊兒的長度。如何保證最小的開銷。儘量採用高效的方法。

分析

這個題目,要如何分析?這切鋸成N塊的方法太多了。如何入手呢?其實,題目中的兩個例子,都可以表明,我們可以將切割的過程用二叉樹表示:

enter image description here

以及

enter image description here

根據上面兩棵二叉樹,得到開銷的計算方法:

第一棵樹,開銷34 = 8 * 2 + 5 * 2 + 8 * 1 = 34

第二顆樹,開銷37 = 8 * 2 + 8 * 2 + 5 * 1 = 37

也就是所有的葉子節點的長度乘以深度。葉子節點,就是各個木塊兒的長度。從上面的式子,我們可以得出,要想開銷最小,樹的高度是不變的,那就一定要越短的木板,深度越深,即可。而且,因為一次鋸開,肯定是兩塊兒,所以,要保證整個開銷最小,則最短的和次短的木板一定是兄弟,這樣,可以遞迴使得,父親節點的開銷也是最小的。

這樣,求的最小開銷就很簡單了,去最短和次短木板,加起來,得到一個開銷,假設L1是最短的,L2是次短的。則遞迴處理(L1+L2)以及剩下的木板即可。這個複雜度是O(N^2)的。

那麼是否有更高效的方法呢?上面的方法,是從底向上計算的。鋸的時候,如何做呢?從最長的開始,每次都把最長的鋸掉。這樣排序O(NlogN)。從最大的開始鋸。解決。

還有呢?前面的方法,在取最短的時候,可以採用優先順序佇列。整個事件複雜度為O(NlogN),不過空間就是O(N)了。

【分析完畢】

本文來自微信:待字閨中,2013-08-19釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章