什么是 Tcl lindex 复杂度顺序?
What is Tcl lindex order of complexity?
我的印象是,当使用 lindex 时,Tcl 将其数据视为列表,而不是数组。
因此,搜索第 n 个元素的顺序是 O(n),因为 "everything is a string"。我凭经验发现,在几个我无法分享的测试用例中,事实并非如此。
lindex 的行为更接近于 O( log(n) ),甚至比它更低的复杂度!
这是有意的,还是 "pure luck"?
Tcl 列表是底层的 C 数组,因此您应该看到 O(1) 的索引访问。 Tcl 中没有内置链表结构(仅在扩展中)。
如果有闪烁,您可能会看到更高的复杂性(例如,当您有一个字符串表示形式需要在内部转换并在使用前解析为列表)。对于没有字符串表示的纯列表(就像你从 [list 1 2 3]
得到的那样,它应该是 O(1).
这是有历史意义的。如果您使用像 Tcl 7 这样的古老 Tcl,它不会在内部对象中缓存列表,而是重新解析字符串表示,您将看到项目访问的预期 O(N)
性能。但是对于任何在内部使用 Tcl_Obj
的现代 Tcl,情况已不再如此(除非您一直通过闪烁来回字符串来强制它)。
我的印象是,当使用 lindex 时,Tcl 将其数据视为列表,而不是数组。
因此,搜索第 n 个元素的顺序是 O(n),因为 "everything is a string"。我凭经验发现,在几个我无法分享的测试用例中,事实并非如此。
lindex 的行为更接近于 O( log(n) ),甚至比它更低的复杂度!
这是有意的,还是 "pure luck"?
Tcl 列表是底层的 C 数组,因此您应该看到 O(1) 的索引访问。 Tcl 中没有内置链表结构(仅在扩展中)。
如果有闪烁,您可能会看到更高的复杂性(例如,当您有一个字符串表示形式需要在内部转换并在使用前解析为列表)。对于没有字符串表示的纯列表(就像你从 [list 1 2 3]
得到的那样,它应该是 O(1).
这是有历史意义的。如果您使用像 Tcl 7 这样的古老 Tcl,它不会在内部对象中缓存列表,而是重新解析字符串表示,您将看到项目访问的预期 O(N)
性能。但是对于任何在内部使用 Tcl_Obj
的现代 Tcl,情况已不再如此(除非您一直通过闪烁来回字符串来强制它)。