什么';在OCaml中比较两个列表的复杂性是什么?
如果l1和l2是两个列表,那么成本是什么';在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
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时