什么';在OCaml中比较两个列表的复杂性是什么?

什么';在OCaml中比较两个列表的复杂性是什么?,ocaml,Ocaml,如果l1和l2是两个列表,那么成本是l1=l2O(N)还是O(1) 进一步的问题: 如果l1=l2,l1和l2是否共享相同的物理内存 弦呢?是否将s1=s2成本O(1)?对于结构比较=您至少需要查看所有数据,以便列表和字符串在最坏情况下(值相等)总是O(n)(几乎,请参见下面的注释)。物理比较==是O(1)您只需比较指针 但是请注意,在您自己的数据结构上,通过确保在值构造期间,没有两个结构上相等的值将使用不同的物理内存,可以将结构比较实现为物理比较。这被称为hash consing,您可以在本文

如果l1和l2是两个列表,那么成本是
l1=l2
O(N)还是
O(1)

进一步的问题:

如果
l1=l2
,l1和l2是否共享相同的物理内存


弦呢?是否将
s1=s2
成本
O(1)

对于结构比较
=
您至少需要查看所有数据,以便列表和字符串在最坏情况下(值相等)总是O(n)(几乎,请参见下面的注释)。物理比较
==
是O(1)您只需比较指针

但是请注意,在您自己的数据结构上,通过确保在值构造期间,没有两个结构上相等的值将使用不同的物理内存,可以将结构比较实现为物理比较。这被称为hash consing,您可以在本文()中找到更全面的解释


通常,对于列表,您无法从
l1=l2
推断它们共享相同的物理内存,因为这取决于它们的构造方式,因为OCaml不会散列列表。这也适用于字符串

我记得多态比较函数在构造之前进行物理比较。是的,这是一种优化,
a==b
意味着
a=b
(请参阅)。因此,如果
==
返回
true
,那么您就完成了,否则您无法推断任何内容,您需要沿着值进行操作(如果您的列表来自程序的两个不同部分,大多数情况下都会发生这种情况)。@DanielBünzli:除了
nan
:PRight。。。实际上
a==b
意味着
比较a b=0
,并且与
=
兼容,除了在处理
nan
s时