私はHaskellの割り当てに取り組んでいました。私はコードを高速化する方法を考えていました。 たとえば、以下のmyファクタ関数は、整数の除数の数を求めます。haskellの長さランタイムO(1)またはO(n)
factors :: Int -> Int
factors x = length [n | n <- [1..x], mod x n == 0]
しかし、「長さ」の使用を避けることでコードを高速化できることがわかりました。
factors :: Int -> Int
factors x = go 1
where
go :: Int -> Int
go i
| i == x = 1
| mod x i == 0 = 1 + go (i + 1)
| otherwise = go (i + 1)
Haskellの長さの関数(1)は、JavaでString.lengthです()のようなCでSTRLENようなO(n)は()またはOである場合、私は思っていました。
また、自分のコードを書く方が効率的か、効率的ですか?
これは文字列ではありません。 –
ArrayList.size()はどうですか?ポイントは複雑さであり、特定のタイプではありません。 – cHao
コンパイラがこのコードを最適化した後、最初の 'factors'式の評価にはリストを作成することさえ含まれないようです。怠惰な評価がどのように機能するかを覚えておいてください。あなたは「リストを構築してから、そのサイズを数えない」ということです。 –