【问题标题】:Time complexity of array manipulations in LUALUA 中数组操作的时间复杂度
【发布时间】:2020-10-28 05:40:14
【问题描述】:
我正在使用 ComputerCraft(用于 Minecraft)发现 Lua,我需要 2 个函数:
- 基数函数#foo(对于名为“foo”的给定表)
- 从表中弹出最后一个元素,例如:foo[#foo] = nil(有更好的方法吗?)
这些功能各自的复杂性是多少?我特别需要一种 O(1) 的方式来弹出表格的最后一个元素。
抱歉英语不好,在此先感谢。
【问题讨论】:
标签:
arrays
lua
complexity-theory
computercraft
【解决方案1】:
根据lua 5.4 reference(第 3.4.7 节),#t 是对数的,不是线性的。
它是从 lua 5.3 开始明确编写的,但在 lua 5.1 和 5.2 中可能也是如此。在 luajit 中也是对数。
但正如上面另一个答案中已经说过的那样,如果您希望它是 O(1),则需要手动记录长度。
【解决方案2】:
#foo 是 O(n);它遍历able直到找到nil,然后返回它之前的最后一个索引。将最后一个元素设置为 nil 确实是“正确”的弹出方式,因为nil 是定义表长度的方式,除非您使用getn/setn(在 Lua 5.1 中已弃用并在 Lua 5.2 中删除)。
使其成为 O(1) 的正确方法是将长度存储在其他位置,并在每次向表中添加或删除某些内容时更新它。