Lua中数组操作的时间复杂度

我正在使用ComputerCraft(为Minecraft)学习Lua,并且我需要两个函数:

  • 给定名称为“foo”的表格的cardinal函数#foo
  • 从表格中弹出最后一个元素,例如:foo[#foo] = nil(是否有更好的方法?)

这些函数各自的复杂度是多少? 我特别需要一种O(1)方法来弹出表的最后一个元素。

对于不好的英语,提前表示抱歉,谢谢。

点赞
用户13691762
用户13691762

#foo 是 O(n) 的;它遍历表直到找到 nil,然后返回它之前的最后一个索引。将最后一个元素设置为 nil 确实是弹出的“正确”方式,因为 nil 是表长度的定义,除非您使用 getn/ setn(在 Lua 5.1 中被弃用,在 Lua 5.2 中被删除)。

将其变为 O(1) 的正确方法是在其他地方存储表的长度,并在每次向表中添加或删除元素时更新它。

2020-07-07 22:03:57
用户1971216
用户1971216

根据lua 5.4参考手册 (第3.4.7节),#t是对数的,而不是线性的。自lua 5.3以来明确写出了这一点,但可能在lua 5.1和5.2中也是如此。在luajit中也是对数的。但是,正如上面的另一个答案中已经说过的,如果您希望它是O(1),则需要手动记录长度。

2020-07-09 04:13:32