順序表的迴圈右(左)移

2021-10-25 18:50:10 字數 1052 閱讀 5984

我們經常能在演算法題中看到如下題:這兩個題目其實本質上是相同的,都是對整個陣列的迴圈左移或右移。

注:陣列和順序表的概念類似但是不相同,陣列是邏輯結構,順序表是線性表採用順序儲存方式實現的,而順序儲存方式是物理儲存方式,所以二者不能混淆,即順序表指的是連續存放在記憶體中的線性表,陣列是記憶體中一串連續記憶體的名字。

其實我們平常思考很自然會有兩種演算法:

一:時間複雜度為o(n),空間複雜度為o(n)

即採取乙個輔助陣列,將原陣列中前p個存入陣列後p個位置中,然後將原陣列中的後n-p個元素存入前n-p個位置中,這樣實現了左移或右移,當然,也可以選擇儲存前p個元素,將原陣列中後n-p個元素前移,最後將前p個元素儲存回原陣列的後p個位置中。時間複雜度和空間複雜度相同

二:時間複雜度為o(mn),空間複雜度為o(1)

為了節省空間,我們直接在原陣列上進行操作,儲存b1,將a1-am右移,填入b1,儲存b2,將a1-am右移…,這樣很顯然我們通過n次m個元素的右移實現了迴圈右移,當然這個演算法的時間複雜度太高,我們除非沒有空間才考慮這個演算法哈哈哈

然而有乙個演算法可以實現時間複雜度為o(m+n)和空間複雜度為o(1),這就是逆置演算法,為了方便了解,我們來看這樣乙個例子:

a1 a2 a3 | b1 b2 b3 b4 b5  我們將其分為兩部分,即序列a和序列b,分別逆置得到

a3 a2 a1 | b5 b4 b3 b2 b1 然後我們實現整個序列的逆置得到

b1 b2 b3 b4 b5 | a1 a2 a3 怎麼樣,是不是就實現了迴圈右移?

而對於乙個長度為n的陣列進行逆置,顯然時間複雜度為o(n/2),那這個逆置的演算法的總時間開銷就是o(m/2) + o(n/2) + o((m+n)/2) = o(m + n)

最重要的是逆置演算法也同樣是在原陣列上進行操作的,只需要在逆置序列交換資料時有乙個temp變數即可,所以空間開銷僅為o(1)。理論上來說,這就是最佳演算法,因為時間複雜度不可能低於o(m+n)(m+n個資料的位置都變了),而空間複雜度也不能低於o(1)了,0也是o(1)

順序表迴圈左移

對於順序表 l a0 a1 an 1 迴圈左移 k位意味著將順序表變為 lk ak ak 1 an 1 a0 a1 ak 1 比如 長度為 8 的順序表 1,2,3,4,5,6,7,8 迴圈左移 3 位後的結果為 4,5,6,7,8,1,2,3 輸入格式 第一行輸入兩個整數 n 1 n 100 分別...

計蒜客 順序表的迴圈左移

順序表的構造 插入 擴充套件 查詢 刪除 遍歷這 6 種操作。一種新的操作 迴圈左移。對於順序表 l a 0,a 1,a l a 0,a 1,a n 1 迴圈左移 k位意味著將順序表變為 l k a k,a a a 0,a 1,a l k ak,a k 1,an 1,a 0,a1,a k 1 比如 ...

資料結構 順序表(陣列)迴圈左移

王道18頁,2010年計算機聯考真題 n n 1 個整數放到一維陣列r中,將r中儲存的順序序列迴圈左移p 0思想 動態建立大小為p的輔助陣列s,將r中前p個整數一次暫存在s中,同時將r中後n p個整數左移,然後將s中的p個數,依次放到r的後續單元中。cycleleft sqlist l,int p ...