In Place Algorithm
本篇是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