performance - 编写无限列表以跳过 p 的每个因子?

标签 performance math haskell functional-programming arithmetic-expressions

如何有效地表示列表 [0..] \\ [t+0*p, t+1*p ..]

我已经定义:

Prelude> let factors p t = [t+0*p, t+1*p ..]

我想有效地表示一个无限列表,它是 [0..]factors p t 的区别,但是使用 \\ 中的 Data.List 需要太多内存,即使是中等大小的列表:
Prelude Data.List> [0..10000] \\ (factors 5 0)
<interactive>: out of memory

我知道我可以表示 t+0*pt+1*p 之间的值:
Prelude> let innerList p1 p2 t = [t+p1+1, t+p1+2 .. t+p2-1]
Prelude> innerList 0 5 0
[1,2,3,4]

然而,重复计算和连接 innerList 以增加间隔似乎很笨拙。

我可以在不为每个元素计算 [0..] \\ (factors p t)rem 的情况下有效地表示 mod 吗?

最佳答案

对于无限列表 [0..] \\ [t,t+p..]

yourlist t p = [0..t-1] ++ [i | m <- [0,p..], i <- [t+m+1..t+m+p-1]]

当然,如果您想删除其他一些因素,例如,这种方法根本无法扩展
[0..] \\ [t,t+p..] \\ [s,s+q..] \\ ...

在这种情况下,您必须使用 Daniel Fischer 的回答中提到的 minus 依次删除它们。这里没有 Elixir 。

但是 there's also a union ,上面变成了
[0..] \\ ( [t,t+p..] `union` [s,s+q..] `union` ... )

优点是,我们可以 arrange the unions in a tree ,并获得算法改进。

关于performance - 编写无限列表以跳过 p 的每个因子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18320391/

相关文章:

haskell - NamedFieldPuns,使用变量名称进行模式匹配

haskell - 如何使用reader monad的函数实例?

json - Crystal : slow json serialization of structs containing large strings

javascript - add、removeFirst、removeFirstN 数组操作的性能优化

c - 对具有固定数量的零的数组进行随机抽样

math - 计算圆环图的所有用户事件百分比

performance - 为什么通过分而治之对 Data.Sequence 求和更快,即使没有并行性?

c# - case 标签的顺序对 switch 语句的效率有多大影响?

database - 反规范化以何种方式提高数据库性能?

javascript - Math.sqrt(n) 与用于查找 N 个素数的埃拉托色尼算法相关的函数是什么?