24h購物| | PChome| 登入
2011-07-22 20:26:09| 人氣1,166| 回應0 | 上一篇 | 下一篇

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

推薦 0 收藏 0 轉貼0 訂閱站台

在此, 先給大家看一個範例
        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;

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

台長: Morris
人氣(1,166) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: 解題技巧 |
此分類下一篇:Hash table %& 結論
此分類上一篇:優化輸入的函式

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文