《程式設計珠璣》第二章-迴圈移位

liyuxia713發表於2010-11-08

問題:將一個n維向量向左迴圈移位m位。如向量0,1,2,3,4,5,6,7,8,9向左迴圈移位3位,結果是3,4,5,6,7,8,9,0,1,2。

方法1:每次迴圈移位1位,執行m次。輔助空間1,時間複雜度O(n*m)

方法2:用m維的輔助空間暫存前m個元素,對剩下的n-m個元素進行移位,最後將m個元素移動向量末尾。輔助空間m,時間複雜度O(n)。

 

方法3:(雜技方法)先a[0]-->temp,然後a[i]-->a[0],a[2i]-->a[i],直到遇到a[0],將temp-->剛才移動的最後一個位置。如

果沒有移動完則a[i]-->temp,然後a[1+i]-->a[1],a[1+2i]-->a[1+i],迴圈,直到全部移動。輔助空間O(1),時間複雜度O(n).

 

方法4:(求逆方法)利用了 (b,a)=(arbr)r,輔助空間1,時間複雜度O(n). 還可以擴充套件為(c,b,a)=(ar,br,cr)r噢~

 

方法5:(分塊方法)對於向量(a,b),其中a是m維的,b是n-m維,將b分成兩部分,b=(b1,b2),其中b2同a也是m維的,首先交換a和b2的位置。然後對(b2,b1)部分再迴圈進行上述操作。m>n-m時調換位置,繼續。輔助空間O(1),時間複雜度O(n).

 

 

效率:分塊>求逆>雜技

 


相關文章