LUA 中数组操作的时间复杂度
Time complexity of array manipulations in LUA
我正在使用 ComputerCraft(适用于 Minecraft)发现 Lua,我需要 2 个功能:
- 基本函数#foo(对于给定的 table 命名为“foo”)
- 从 table 中弹出最后一个元素,例如:foo[#foo] = nil(有更好的吗?)
这些函数各自的复杂度是多少?我特别需要一种 O(1) 方法来弹出 table.
的最后一个元素
抱歉英语不好,提前致谢。
#foo
是 O(n);它遍历 able 直到找到 nil
,然后 returns 它之前的最后一个索引。将最后一个元素设置为 nil 确实是弹出的“正确”方式,因为 nil
是 table 长度的定义方式,除非您使用 getn
/setn
(在 Lua 5.1 并在 Lua 5.2).
中删除
使其成为 O(1) 的正确方法是将长度存储在别处,并在每次向 table 添加或从中删除内容时更新它。
根据lua 5.4 reference(第 3.4.7 节),#t
是对数的,不是线性的。
它是从 lua 5.3 开始明确编写的,但在 lua 5.1 和 5.2 中可能也是如此。它在 luajit.
中也是对数的
但是上面的另一个答案已经说过,如果你想要它是 O(1),你需要手动记录长度。
我正在使用 ComputerCraft(适用于 Minecraft)发现 Lua,我需要 2 个功能:
- 基本函数#foo(对于给定的 table 命名为“foo”)
- 从 table 中弹出最后一个元素,例如:foo[#foo] = nil(有更好的吗?)
这些函数各自的复杂度是多少?我特别需要一种 O(1) 方法来弹出 table.
的最后一个元素抱歉英语不好,提前致谢。
#foo
是 O(n);它遍历 able 直到找到 nil
,然后 returns 它之前的最后一个索引。将最后一个元素设置为 nil 确实是弹出的“正确”方式,因为 nil
是 table 长度的定义方式,除非您使用 getn
/setn
(在 Lua 5.1 并在 Lua 5.2).
使其成为 O(1) 的正确方法是将长度存储在别处,并在每次向 table 添加或从中删除内容时更新它。
根据lua 5.4 reference(第 3.4.7 节),#t
是对数的,不是线性的。
它是从 lua 5.3 开始明确编写的,但在 lua 5.1 和 5.2 中可能也是如此。它在 luajit.
但是上面的另一个答案已经说过,如果你想要它是 O(1),你需要手动记录长度。