Functional programming 函数的空间复杂度,该函数在调用后构建n大小的数组

Functional programming 函数的空间复杂度,该函数在调用后构建n大小的数组,functional-programming,ocaml,space-complexity,Functional Programming,Ocaml,Space Complexity,我试图学习如何估计某些函数的内存复杂性。现在我有一个特殊的问题 假设我们正在构建一个函数,类似这样: let f x = (fun x -> x :: [1;2;3]);; 我们从不调用这个函数,我们只是在某个时候用另一个函数组合它,使用这个: let compose f g x = f (g x);; 所以问题是-在调用f之前和调用f之后,f需要多少空间?为了使这个问题更一般化,当f构建n大小的数组但未被调用时,它是否仍然占用O(n)空间,或者可能在调用它后开始占用这个空间?首先请注

我试图学习如何估计某些函数的内存复杂性。现在我有一个特殊的问题

假设我们正在构建一个函数,类似这样:

let f x = (fun x -> x :: [1;2;3]);;
我们从不调用这个函数,我们只是在某个时候用另一个函数组合它,使用这个:

let compose f g x = f (g x);;

所以问题是-在调用f之前和调用f之后,f需要多少空间?为了使这个问题更一般化,当f构建n大小的数组但未被调用时,它是否仍然占用O(n)空间,或者可能在调用它后开始占用这个空间?

首先请注意,
[1;2;3]
是一个不可变的列表,而不是数组。这会影响您的空间计算,因为列表可以共享结构。其次,为了简单起见,我将用“conses”来讨论问题,两个参数列表构造函数占用三个字的存储空间——实际上,OCaml程序是用许多算术构造函数编写的

查看
f
,它为每个调用生成一个新cons,并引用一个包含三个常量cons的列表。假设常量conse是静态分配的(使用
ocamlopt
它们是静态分配的),我们可以使用这些观察值来编写一个粗略的空间使用公式

conses_used = 3 + 1 * reachable-results-of f
“可达结果”是指由
f
产生并在程序中仍然可见的值。由于GC将回收无法访问的部分,因此将忽略这些部分

在进行这种估计时,请确保您了解cons在其所有部分都是常量时是常量(并且没有任何部分是可变的)。如果cons的尾部是包含任何非常量部分的列表,则cons是非常量的

也就是说,在下面

let f x = [1;2;3;x]
没有固定消耗-所有四个都将通过
f
重新分配