陣列迴圈移位

2021-06-06 23:01:18 字數 624 閱讀 7755

題目:設計乙個演算法,把乙個含有n個元素的陣列迴圈右移k位,要求複雜度為o(n),且只允許使用兩個變數

思考問題:

1)考慮原始解法:直接迴圈移動陣列k次,則演算法複雜度為0(n*k), 使用額外兩個變數完成,顯然複雜度依賴於k的值,如果k>=n,則演算法複雜度大於或等於o(n^2)

2)考慮改進:原始演算法複雜的原因在於移動次數過多,降低演算法複雜度的最根本的目標就是如何減少移動次數而達到需求;

3)根據2)中出發點,最直接的想法是:如果能夠直接讓每個元素放到最終位置,則是最完美的訪問,該方案存在麼?是否可以遞迴將第i個元素放置到第(i+k)%n,遞迴完成上述過程,直到全部移動完成;證明該方案可採用如下方法:從n個元素中仍取乙個,以k為步長,生成乙個群,證明該群是乙個迴圈群,如果是乙個迴圈群則可完成一次遞迴賦值,剩餘的未在群中的值在進行一次迴圈賦值,可證明該演算法應該在o(n)時間完成;

4)換一種看待串的方法,因為是迴圈移動,那麼可將陣列看成兩部分,前n-k和後k個值,右移k位即互動兩部分的位置,可分別對兩個部分求逆,然後對整體求逆;

方法4讓人想起矩陣乘法逆的運算即:((a^-1)*(b^-1))^-1=(b^-1)^-1 *(a^-1)^-1=ba;已陣列求逆轉結果貌似一樣,二者有何聯絡?

另外注意k>n情況,令k=k%n

陣列迴圈移位

陣列迴圈移位 對於存有n個整數的陣列,將其向左迴圈移動k個位置,x0,x1,xn 1 變換為 xk,xk 1,xn 1,x0,x1,xk 1 最直接的方法就是每次將首位的數放到乙個臨時的整型變數中,後面n 1個數一次左移,這樣需要k次才能完成,而每次的複雜度是o n 因此總共其複雜度是o k n 一...

陣列迴圈移位

問題描述 n個元素儲存於陣列a 0.n 1 中,求向右或向左迴圈移位 k k 0 位得到的新陣列a。1.迴圈右移 步驟 1 k k n 2 把序列分成前 n k 個數和後k個數兩組分別進行逆轉操作,如下圖 如下 void rightshift char a,int n,int k 其中reverse...

陣列迴圈移位

設計乙個演算法,把乙個含有n個元素的陣列迴圈右移k位,要求時間複雜度為o n 且只允許使用兩個附加變數。k可能大於n,但對k n就可。如下 reverse int arr,int b,int e for bint temp arr e arr e arr b arr b temp rightshif...