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