DS-006 順序表-迴圈左移p位
阿新 • • 發佈:2018-12-12
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
迴圈左移4位:
4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 2 | 3 |
題目:設將n(n>1)個整數存放到一維陣列R中。設計一個在時間和空間兩方面儘可能高效的演算法。將R中的序列迴圈左移P(0<P<n)個位置,即將R中的資料由(x0,x1,…,xn-1)變換為(xp,Xp+1,…,Xn-1,x0,x1,…,Xp-1)。要求:
(1)給出演算法的基本設計思想。
(2)根據設計思想,用程式設計語言描述演算法,關鍵之處給出註釋。
(3)說明你設計演算法的時間複雜度和空間複雜度。
分析:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0~p-1位逆置,p~n-1位逆置:
3 | 2 | 1 | 0 | 9 | 8 | 7 | 6 | 5 | 4 |
整體逆置:
4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 2 | 3 |
答:
(1)演算法思想:a代表前p個元素,b代表陣列中餘下的n-p個元素。可以將這個問題看成將陣列ab轉換成ba,現將a逆置得到a逆,再將b逆置得到b逆,最後整體逆置就得到了ba。(線性代數知識,DS-002 順序表--逆置所有元素有陣列逆置的實現)
(2)程式碼(這次不是虛擬碼):
void Reverse(int R[], from, to){
int i, temp;
for(i=0; i<(to-from+1)/2; i++){
temp = R[from+i];
R[from+i] = R[to-i];
R[to-i] = temp;
}
}
void Converse(int R[], int n, int p){
Reverse(R, 0, p-1);
Reverse(R, p, n-1);
Reverse(R, 0, n-1);
}
(3)時間複雜度:Reverse(R, 0, p-1);執行了3*(p/2)步,Reverse(R, p, n-1);執行了3*(n-p)/2 ,Reverse(R, 0, n-1);執行了3*(n/2),共3n步。該演算法的時間複雜度O(n)
只用到了一個額外的temp變數,所需輔助空間為常量。該演算法空間複雜度為O(1)。