問題:將一個n元一維向量向左旋轉(zhuǎn)i個位置。例如,當(dāng)n=8,且i =3時,向量abcdefgh旋轉(zhuǎn)為defghabc.簡單的代碼使用一個n元向量在n步內(nèi)完成該工作。
你能否僅僅使用數(shù)十個額外字節(jié)的存儲空間,在此正比于n的時間內(nèi)完成向量的旋轉(zhuǎn)?
方案1:首先將n的前i個數(shù)組復(fù)制到一個臨時數(shù)組中,然后將剩余下的n-i個元素向左移動i個位置,最后將最初的i個元素存儲在臨時數(shù)組中的內(nèi)容復(fù)制到n中余下的位置。
這個方案產(chǎn)生過大的存儲空間消耗。方案2:定義一個函數(shù)將n向左旋轉(zhuǎn)一個位置,然后調(diào)用該函數(shù)i次。
該方法產(chǎn)生過多的時間消耗方案3:將問題看作是交換向量AB的兩段,得到向量BA。這里A代表n中的前i個元素.假設(shè)A比B短,將B分為Bl和Br,使得Br具有和A相同的長度,交換A,Br,得到BrBlA,A放到了他需要的最終位置。
接下來將BrBl看作整體,采用同樣的形式,交換Br到Bl后面,遞歸解決
該方案非常優(yōu)雅,效率也足夠高。不過需要作者具有較好的編碼能力
方案4:將問題看作是把數(shù)組AB轉(zhuǎn)換成BA,同時假定我們擁有一個函數(shù)可以將數(shù)組中的特定部分的元素求逆。
從AB開始------->對A求逆得到ArB
abc | defgh-----------> cba | defgh
對B求逆-------->ArBr
cba | defgh---------->cba | hgfed
對該式子整體求逆------------>(ArBr)r==BA
cba | hgfed---------->cbahgfed -----------> cbah | gfed---求逆--->defghabc (這就是我們要的結(jié)果)
最終得到BA.
defghabc
于是我們得到了如下代碼;
reverse(0,i-1); /*逆轉(zhuǎn)A*/
reverse(i-1,n-1);/*逆轉(zhuǎn)B*/
reverse(0,n-1);/*逆轉(zhuǎn)ArBr*/
時間和空間上都很高效,代碼簡短優(yōu)雅,不易出錯(強(qiáng)壯性高)