《編程之美》數組分割問題——個人想法和證明

最近一直看編程之美,想法真的很重要,今天發這篇文章還是有一點不自信,希望碰到志同道合的同學一起討論下!

 

本文來自:http://blog.csdn.net/lengzijian/article/details/7842551

 

題目:

有一個無序、元素個數爲2n的正整數數組,要求:如何能吧這個數組分割爲元素個數爲n的兩個數組,並使兩個子數組的和最近?

例如有如下數組如圖:

 

第一行:源數組

第二行:目的數組

書中講了很多方法,這裏就不在贅述了,我的方法也很簡單,相信很多人也想到了,但是沒有辦法證明這個方法的可靠性。今天我們主要講下,該方法的可靠性

 

先來說下方法:

1.    首先對無序數組進行排序(時間複雜度nlogn)

2.    從當前源數組中取最大的元素,放置到一個和最小的目的數組(起初都爲0,故可以隨意放置),同時這個最大元組從源數組中刪除。

3.    重複第2步,直到源數組個數爲0

 

按照如上方法:上題的到的結果爲:

 

左邊和爲43,右邊爲44。符合題意。

 

很多人第一感覺就是,①題目不會這麼簡單,②這種解法可能會有漏洞,下面對該種解法,做一下個人的理解。

 

1.    我把這種問題看作是往天平上放籌碼,放到最後的要求是天平兩端的差異最小;

2.    先把要放的籌碼都排好序;

3.    先放置最大籌碼到天平的任意一段(起初天平是平衡的)

4.    放置第二塊籌碼到天平籌碼重量輕的一段;

5.    放置第三塊籌碼到天平籌碼輕的一段(一定是和第二塊一起)。這時,有兩種可能:①:天平沒有動,此時應按照規則繼續放下一塊;②天平平衡有變化(包括兩邊平衡和逆變化),我們可以確定的是,此時此刻天平兩邊的籌碼重量差一定小於等於剛剛放上的籌碼(目前天平上最輕的籌碼)

6.    按照上面的方法,放到最後一塊後,如果天平平衡是有變化的,我們可以保證天平量變的差值永遠小於等於所有籌碼最小的一個。當沒有變化是,也可以保證我們的結果是正確的(自己考慮下)

 

目前我能想到的只有這些,根據上面的規則時間複雜度應該爲nlogn(排序)+n = O(nlogn)

 

如果本人哪裏說得不對,可以留言,也希望能夠遇到一些朋友一起討論下這方面的問題。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章