演算法思想 迴圈移動乙個陣列

2021-06-21 23:08:43 字數 1027 閱讀 5493

問題:如何將乙個陣列迴圈左移或者右移k位?

在下面的解決方案中,我們以迴圈左移為例。 我們最容易想到的是,將前k個元素複製到乙個臨時的陣列中,然後將剩下的n-k個元素向左移動k個位置,然後將之前的k個元素複製到剩下的位置。這種方法使用了k個額外的儲存空間。我們想到到另一種方法是,只借助乙個臨時空間,每次只向左移動1位,迴圈k次。這種方法產生了多於的執行時間。前面一篇文章中用程式實現了迴圈右移乙個陣列的演算法。前面提到的都是比較常規的演算法,下面從其它角度來考慮這一問題:

迴圈陣列x其實就是交換陣列x的子陣列a、b得到b、a。例如假設陣列x為int x=; int a=; int b=;那麼將x迴圈左移5位則是x1=;顯然就將陣列a,b交換後進行拼接在一起。當然這裡舉的是特例,是為了方便理解。下面是一般情況的分析:

假設陣列x為int x=; int a=; int b=;那麼將x迴圈左移3位則是x1=;因此移動k位,我們就假設a的大小是k位,剩下是b。如果直接交換,那就和上面提到的第一中方法一樣了。下面是一種新的交換方法:這裡假設a的元素比b少,則將b分為兩個陣列bl,br,其中br與a長度相同,bl為b的左邊部分,br為b的右邊部分。在上面例子中,bl=,br=。

則陣列x是由a,bl,br拼接而成。經過左移k位後,結果陣列x1是由bl,br,a拼接而成。因此這裡需要進行兩步交換,首先a與br交換,變成br,bl,a;然後br與bl交換,變成

bl,br,a。

上面問題的重中之重是進行交換。我們還可以這樣進行交換:我們定義a=的反為a'。那麼由ab變成ba,可以通過(a'b')'得到。因此我們可以寫乙個求反的子函式,用於求陣列中特定部分元素的反。先對a求反,再對b求反,最後對整體求反,就可以得到結果。這裡需要呼叫求反子函式3次即可。

本文提到的方法較常規的方法的優點是不用計算移動k位後應該到達的位置。本文提到的方法並不是最好的方法,只是說明我們可以這麼做,遇見乙個問題,我們可以找到多種方法解決。本文主要是介紹一種思路,程式比較簡單,就不具體實現了。

原文:

演算法9 在乙個迴圈有序的陣列裡查詢乙個數

採用中分方法進行查詢,考慮到是迴圈有序的陣列,存在一邊有序的情況,將中間值與最左邊值比較,檢視是否有序,則左有序,否則就是右有序。然後再確定待查詢值的區域。loopbuffer 迴圈有序陣列 length 迴圈有序陣列長度 value 待查詢的數 return 返回待查詢數在陣列中的位置 int b...

將乙個陣列追加到別乙個陣列

問題 將乙個陣列追加到別乙個陣列 方案 1 使用array merge 在使用這個合併陣列時如果使用數字鍵,那麼索引會重新編號.如果使用字串鍵,則會導致第二個陣列中的鍵 覆蓋第乙個陣列中的同名鍵 此時第乙個陣列中的值也就消失了 如果是兩種鍵則會表現出上述兩種特徵.r array 1 2 dd 3 4...

陣列 如何把乙個陣列迴圈右移K位

假設要把陣列12345678右移2位,變為78123456。比較移位前後陣列序列的形式,不難看出,其中有兩段序列的順序是不變的,即就是 78 和 123456,可以把這兩段看做兩個整體,右移k位就是把陣列的兩部分交換一下。時間複雜度為o n 步驟 1 逆序陣列子串行123456,陣列序列的形式為65...