Haskell中Euler空间复杂性的筛选

Haskell中Euler空间复杂性的筛选,haskell,functional-programming,primes,space-complexity,sieve,Haskell,Functional Programming,Primes,Space Complexity,Sieve,我得到了两个用Haskell编写的不同算法,目的是生成第一个k素数。正如标题所示,它们是埃拉托希内斯和欧拉的筛子 我试图理解为什么Euler实现使用了如此多的内存。到目前为止,我认为生成的流的数量会很快地使内存饱和,但据我所知,它们应该等于2k-1,其中k是我们想要的素数的索引。 所以应该还有其他的主要问题 我试着通过GHC的调试器运行代码,结果表明分配的大部分内存来自减号函数,所以我认为流肯定是问题的一部分 这里,减号从tcs中删除p的每一个倍数,从p*p开始,它是到目前为止找到的每个素数(p

我得到了两个用Haskell编写的不同算法,目的是生成第一个k素数。正如标题所示,它们是埃拉托希内斯和欧拉的筛子

我试图理解为什么Euler实现使用了如此多的内存。到目前为止,我认为生成的流的数量会很快地使内存饱和,但据我所知,它们应该等于2k-1,其中k是我们想要的素数的索引。 所以应该还有其他的主要问题

我试着通过GHC的调试器运行代码,结果表明分配的大部分内存来自减号函数,所以我认为流肯定是问题的一部分

这里,减号从tcs中删除p的每一个倍数,从p*p开始,它是到目前为止找到的每个素数(p除外)的互质,并最终生成一个传递给下一个eulersive递归调用的新流

minus :: [Int] -> [Int] -> [Int]
minus xs@(x:txs) ys@(y:tys)
  | x < y = x : minus txs ys
  | otherwise = minus txs tys

eulerSieve :: [Int] -> [Int]
eulerSieve cs@(p:tcs) = p:eulerSieve (minus tcs (map (p*) cs))
减号::[Int]->[Int]->[Int]
减xs@(x:txs)ys@(y:tys)
|x[Int]
欧拉夏娃cs@(p:tcs)=p:eulersive(减去tcs(map(p*)cs))
通过阅读,我发现这个空间是以O(k^2)为界的,但它不能准确地解释为什么。
如果您有任何建议,我们将不胜感激。

这(可能)与您的问题主题无关,但无论如何:请养成习惯,始终在顶级绑定中添加类型签名。它使我们更容易理解正在谈论的内容。@LeftAround关于你是对的!我在两个函数中都添加了类型签名为什么在第二个分支中根本不使用
ys
?那是打字错误吗?函数
减号的作用是什么?(以两个排序列表的集差为例?这些东西应该在问题中指定。)@user202729是的,这是一个打字错误。我添加了一个关于负号作用的小说明。