2011-07-22 20:26:09Morris

[技巧] 兩陣列元素交換 不是O(n) 是 O(1)

在此, 先給大家看一個範例
        int Min1[1000] = {}, Min2[1000] = {}, tmin = 0;

        for(a = 0; a < U; a++) {
            for(b = a, c = L-(U-a); b <= c; b++) {
                Min2[b] = abs(IU[a]-IL[b]) + tmin;
                tmin = (tmin < Min1[b]) ? tmin : Min1[b];
            }
            for(b = a; b <= c; b++)
                Min1[b] = Min2[b];
            tmin = Min1[a];
        }
紅色的部分, 是要將 Min2 的值, 都給 Min1
這樣實在太慢了, 需要跑 a->c
        int Min1[1000] = {}, Min2[1000] = {}, tmin = 0;
        int *A = Min1, *B = Min2, *C;
        for(a = 0; a < U; a++) {
            for(b = a, c = L-(U-a); b <= c; b++) {
                B[b] = abs(IU[a]-IL[b]) + tmin;
                tmin = (tmin < A[b]) ? tmin : A[b];
            }
            C = A, A = B, B = C;
            tmin = A[a];
        }
這樣只需要 O(1), 就完成囉
切記交換的時候, 並不是 *C = *A, *A = *B, *B = *A;

以上的使用, 雖然很短, 一眼就可以看完了, 這速度可不容小覷
神犇就別看了又偷笑我, 我寫了那麼久才知道, 可見我多笨