Arrays LUA中阵列操作的时间复杂度
我正在用ComputerCraft(用于Minecraft)发现Lua,我需要2个功能:Arrays LUA中阵列操作的时间复杂度,arrays,lua,complexity-theory,computercraft,Arrays,Lua,Complexity Theory,Computercraft,我正在用ComputerCraft(用于Minecraft)发现Lua,我需要2个功能: 基数函数#foo(对于名为“foo”的给定表) 从表中弹出最后一个元素,例如:foo[#foo]=nil(有更好的吗?) 这些功能各自的复杂性是什么?我特别需要一个O(1)方法来弹出表的最后一个元素 抱歉英语不好,提前谢谢。#foo是O(n);它遍历able,直到找到nil,然后返回它前面的最后一个索引。将最后一个元素设置为nil确实是弹出的“正确”方式,因为nil是定义表长度的方式,除非您正在使用(在
- 基数函数#foo(对于名为“foo”的给定表)
- 从表中弹出最后一个元素,例如:foo[#foo]=nil(有更好的吗?)
#foo
是O(n);它遍历able,直到找到nil
,然后返回它前面的最后一个索引。将最后一个元素设置为nil确实是弹出的“正确”方式,因为nil
是定义表长度的方式,除非您正在使用(在Lua5.1中被弃用,在Lua5.2中被删除)
使其为O(1)的正确方法是将长度存储在其他位置,并在每次向表中添加或从表中删除内容时对其进行更新。根据(第3.4.7节),#t
是对数的,而不是线性的。
它是从Lua5.3开始明确编写的,但Lua5.1和5.2中可能也是如此。它在卢阿吉特也是对数的
但正如上面的另一个答案中所说,如果希望长度为O(1),则需要手动保存长度记录。\foo
是O(logn),而不是O(n)。