1. 程式人生 > >In Place Algorithm

In Place Algorithm

sqrt ces posit CI for n) success amp 末尾

本篇是in place algorithm的學習筆記。目前學習的是in place merge與in place martrix transposition這兩個算法。

1.in place merge

論文鏈接:Practical in-place merging

論文討論的是如何O(n)時間復雜度,O(1)空間復雜度合並兩個相鄰的有序數組。

技術分享圖片

b) 將sublist1與sublist2按sqrt(n)進行block劃分, 余下的尾元素移到開頭作為buffer( buffer size >= sqrt(n),我們不關註buffer內的元素是否有序 )

c) 選擇排序( O(sqrt(n)*sqrt(n)) ), 將各個block排序,使得各個block的末尾元素呈非下降序列。

技術分享圖片

a) 找到首個block尾元素a[i],使得a[i] > a[i+1],顯然之前的滿足a[i] <= a[i+1]則之前的已成有序序列。劃分好series1和series2.

b) c) 將series1與series2通過buffer進行merge, 直到series1內的元素全部排到正確位置,如c) 所示。

  由於按段尾非下降排序各個block,顯然series1會先於series2排完。

技術分享圖片

a) b) c) 將series2當作series1,series2的下一個block當作series2,重復之前的操作。以上操作的總的時間復雜度尾O(n).

d) sqrt(n) <= buffer size < 2*sqrt(n), 冒泡排序/選擇排序,將buffer變為有序序列,時間復雜度O(sqrt(n)*sqrt(n)).

附: 論文中,buffer中的元素是最大的,最後一步操作sort buffer內的元素,即可。

個人想法: 我們需要保證 buffer元素 >= 非buffer元素,否則我們仍然需要insert sort。因此,本人認為在merge前需要進行處理,從sublist1和sublist2中摳出前sqrt(n)大的元素,作為buffer。但這樣可能會破壞block,導致某個block元素不夠。個人認為可以摳多一點,再補回去。比如先扣除前 3*sqrt(n) 大的元素。這樣補回到sublist1,至少還能余下sqrt(n)個元素。

總的時間復雜度為O(n). 可能常數略大。

2.in place matrix transposition

wiki: in place martrix transposition

技術分享圖片

技術分享圖片

對於非方陣,進行置換操作。對於一個Circle,記錄下初始節點,每次用前驅節點替換當前節點;用初始節點替換最後一個節點。

Non-square matrices: Following the cycles

for each length>1 cycle C of the permutation
    pick a starting address s in C
    let D = data at s
    let x = predecessor of s in the cycle
    while x ≠ s
        move data from x to successor of x
        let x = predecessor of x
    move data from D to successor of s

Improving memory locality at the cost of greater total data movement

reference to wiki

In Place Algorithm