Re: [問題] 排序演算法 可逆式

作者: hardyyeh (阿葉)   2014-10-22 00:11:35
假設已知序列有N個值 包含n個0跟m個1
那排好的序列會長成 [0..n個..01..m個1..1]
我的想法是
從最初的序列去看 最少要做多少次0&1的swap才會得到排好的序列
Ex1: a[1 0 0 1 0] => 一次 swap(a[0],a[4]) 就好了
Ex2: a[1 0 1 0 0] => 兩次 swap(a[0],a[4]), swap(a[2],a[3])
每一個swap 就用兩個數字去存 ex: (0,4) (2,3)
這樣記錄所需要的記憶體 = min(n, m)*2
大部分的情況都會 < N
只有最壞的情況 就是0跟1的數量相同 然後排列完全相反 (ex: 111000)
所需要的空間剛好等於 (N/2) * 2 = N
解決這個問題方法很多 你可以拿一個特殊的值去記錄這種情況=.=
作者: flydragon198 (Richard)   2014-10-22 00:16:00
假設a[]陣列內每個元素(0,1)佔1bit,用來記錄的swap每個元素無法用1bit儲存,所以需要空間是大於N的,
作者: bibo9901 (function(){})()   2014-10-22 00:20:00
只記錄 n,m 兩個數字就能得到排序後的序列啊
作者: hardyyeh (阿葉)   2014-10-22 00:21:00
回樓上 我是假設他本來用不是用存啦(雖然只有0,1很浪費)如果是要押在 N bit內 那我目前還想不到方法To bibo大: 沒錯 但原PO的要求是還原回去本來的序列現在發現這個方法沒有省到記憶體 等等自刪
作者: flydragon198 (Richard)   2014-10-22 00:28:00
XD C++版沒辦法刪文章喔
作者: Feis (永遠睡不著 @@)   2014-10-22 01:05:00
(N - 1) ~ (N - logN/log2) 都還有可能. 可以到 logN 以下?可以的話, 應該蠻酷的~
作者: EdisonX (卡卡獸)   2014-10-22 01:22:00
我想到件事... a --> (排序得) --> b , 可用 xor 去做?這樣從 2 個數字降到 1 個數字 ?

Links booklink

Contact Us: admin [ a t ] ucptt.com