排列木樁;及模糊距離分析

紫鳳發表於2013-08-19

今日面試題:排列木樁

有N個木樁,高度分別為1到N。你現在要將木樁排列為一行,當你從左邊看的時候,只看到L個木樁(因為,一些高的木樁會擋住矮的木樁);從右邊看時,只看到R個木樁。給定N、L、R,你該如何排列木樁呢? 例1:N=3,L=2,R=1,可行的排列方案只有{2,1,3}。 例2:N=3,L=2,R=2,可行的排列方案有{1,3,2}{2,3,1}

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

模糊距離分析

原題

X和Y都是隻有0和1組成的字串。D(X,Y)稱為模糊距離,定義如下: 首先刪除X和Y從頭開始的公共子串 然後將X和Y剩下部分的長度相加得到模糊距離 例如D(1000,1111),首先,刪除子串“1”,然後剩下“000”和“111”長度都是3,相加為6,則 D(1000,1111)=6。 例如D(101,1100),首先刪除公共子串“1”,然後剩下"01"和"100"長度分別為2,3,相加為5,則 D(101,1100)=5。

問題是,給定n個只有0和1的字串,如:

1111

1000

101

1100

...

請找到最大的模糊距離,字串總數為n,字串最長為m。

分析

這個題目描述比較長,但實際上,並不難。只要耐心,看完題目,即可。描述也不晦澀。

直接想來,對於每一個01字串,與其他的每一個01字串進行模糊距離的計算,時間複雜度是O(nm),遍歷完n個字串,總的時間複雜度是O(n^2*m)。這個我們可以稱為暴力法。

如何改進上面的方法的,主要是指縮小時間複雜度。一個非常通用的方法,就是以空間換時間。如何換呢?對於模糊距離的第一個條件,我們想到什麼呢?公共字首,不知道同學們,聯想到樹形結構:trie樹沒有。例如:給定000、001、0010,我們構造如下的trie樹。

enter image description here

構造過程中,1為左子樹,0為右子樹。模糊距離的第一個條件是,去掉公共字首,則計算時,兩個字串,要有公共字首,也就意味著,只需要考慮開始分叉的節點,左右子樹,可以有一個沒有。這樣,我們考慮第一個分叉的節點:0,然後可以計算第二部分了,如何計算剩下長度相加呢?尤其,為了找到模糊距離的最大值,我們求得當前節點的左子樹的最大深度以及右子樹的最大深度,兩者相加,及得到一個模糊距離,為3。然後考慮1節點,右子樹為空,則模糊距離為1。綜合,最大的模糊距離為3。這裡有一個小小的技巧,構建的過程中,可以在節點中,儲存左右子樹的高度,並隨著加入新的字串,更新左右子樹的高度。總的時間複雜度為O(nm)。 根據上例,儲存的左右子樹的高度值變化如下 (left_height, right_height):

left_height: 左邊子樹的高度 right_height: 右邊子樹的高度

enter image description here

【分析完畢】

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

相關文章