精華區beta CSSE 關於我們 聯絡資訊
※ 引述《jeunder ()》之銘言: : 就是將 x 的偶數項依序放到 x[0 ~ N-1], : 將 x 的奇數項依序放到 x[N ~ 2N-1]. : 希望能夠做到時間複雜度為 O(N), 這顯然很容易辦到. : 但是我又希望空間複雜度能夠是 O(1), 也就是不可以有隨 N 而變大的暫存變數. : 這是否有可能辦到? : 感覺上似乎和離散數學裡面的 permutation group 有關? : 想請教大家的想法. 謝謝. :) 如果只是不要有隨 N 變大的暫存變數,則可以用遞迴。 以下的方法應該是空間 O(logN), 時間 O(N*logN), 不使用變動大小的暫存變數。 但若站在技術性的實用的立場,可能還是我的上一個方法比較好。 而相對於那個漂亮的 space O(1), time O(N^2) 轉置矩陣方法,在 N = 1000 時 swap 數量為 8188 : 499500. --------------------------------------------------------------------- #include <stdio.h> #include <malloc.h> int* x; int n; int k = 0; void swap(int* d, int a, int b) { int t = d[a]; d[a] = d[b], d[b] = t; k++; } void p(int* d, int c) { int t = c / 2; int e = (t + 1) % 2; int i; for(i = 0; i < t; i += 2) swap(d, i, i + t + e); if(e) for(i = 0; i < c; i += 2) swap(d, i, i + 1); if(t < 3) return; p(d + e, t - 1 - e); p(d + t + 1, t - 1 - e); } void main(int argc, char* argv[]) { int i, t; if(argc < 2) return; sscanf(argv[1], "%d", &t); if(t <= 0) return; n = t * 2; x = malloc(n * sizeof(int)); for(i = 0; i < n; i++) x[i] = i; p(x + 1, n - 2); printf("swap number = %d\n", k); } -- ※ 編輯: semop 來自: 59.116.1.213 (11/23 01:29)