6

マージソート(Haskell)のコードを書いていました。

2つのリストを順番に並べる機能について質問です。

(すなわち [1,4,7] [2,5,6] -> [1,2,4,5,6,7])

これは私のオリジナルのコードです。(xs、ys はパラメータで、zs はアキュムレータです。)

msort4 [] ys zs = zs ++ ys
msort4 xs [] zs = zs ++ xs
msort4 allx@(x:xs) ally@(y:ys) zs 
 | x <= y = msort4 xs ally (zs ++ [x])
 | otherwise = msort4 allx ys (zs ++ [y])

これは、オンラインで見つけたコードを参照して書いた 2 番目のコードです。

msort4 [] ys = ys
msort4 xs [] = xs
msort4 allx@(x:xs) ally@(y:ys)
 | x <= y = x :msort4 xs ally 
 | otherwise = y :  msort4 allx ys

この小さな違いだけで、私のコードは大幅に改善されました。

私は約 500 語のリストをソートしていましたが、元のコードでは約 2.5 秒かかりましたが、新しいコードでは平均で 0.4 秒以内にソートされます。

よく似ているのに、オンラインの方がはるかに高速であるのに、なぜ私のほうが遅いのか疑問に思っています。(私のものは行き来する必要がないので、私のものの方が速いとさえ思っていました。)

前もって感謝します。

4

1 に答える 1

6

リストの先頭 (:) は O(1)、(++) は O(n) で、n は左側のリストの長さです

zが大きくなると、1つの要素を追加するだけで毎回リスト全体をトラバースする必要があります[x]

于 2013-04-16T23:58:29.723 に答える