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