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

看板C_and_CPP作者 (阿葉)時間10年前發表 (2014/10/21 16:11), 10年前編輯推噓3(309)
留言12則, 5人參與, 最新討論串2/6 (看更多)
假設已知序列有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 解決這個問題方法很多 你可以拿一個特殊的值去記錄這種情況=.= -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.166.83.80 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1413907898.A.DAC.html ※ 編輯: hardyyeh (218.166.83.80), 10/22/2014 00:13:27

10/22 00:16, , 1F
假設a[]陣列內每個元素(0,1)佔1bit,用來記錄的swap
10/22 00:16, 1F

10/22 00:16, , 2F
每個元素無法用1bit儲存,所以需要空間是大於N的,
10/22 00:16, 2F

10/22 00:20, , 3F
只記錄 n,m 兩個數字就能得到排序後的序列啊
10/22 00:20, 3F

10/22 00:21, , 4F
回樓上 我是假設他本來用不是用存啦(雖然只有0,1很浪費)
10/22 00:21, 4F

10/22 00:21, , 5F
如果是要押在 N bit內 那我目前還想不到方法
10/22 00:21, 5F

10/22 00:23, , 6F
To bibo大: 沒錯 但原PO的要求是還原回去本來的序列
10/22 00:23, 6F

10/22 00:25, , 7F
現在發現這個方法沒有省到記憶體 等等自刪
10/22 00:25, 7F

10/22 00:28, , 8F
XD C++版沒辦法刪文章喔
10/22 00:28, 8F

10/22 01:05, , 9F
(N - 1) ~ (N - logN/log2) 都還有可能. 可以到 logN 以下?
10/22 01:05, 9F

10/22 01:07, , 10F
可以的話, 應該蠻酷的~
10/22 01:07, 10F

10/22 01:22, , 11F
我想到件事... a --> (排序得) --> b , 可用 xor 去做?
10/22 01:22, 11F

10/22 01:22, , 12F
這樣從 2 個數字降到 1 個數字 ?
10/22 01:22, 12F
文章代碼(AID): #1KHeMwsi (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1KHeMwsi (C_and_CPP)