【问题标题】: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) 的正确方法是将长度存储在其他位置,并在每次向表中添加或删除某些内容时更新它。

      【讨论】:

      • #foo 是 O(log n),不是 O(n)。
      猜你喜欢
      • 2012-03-17
      • 2014-04-06
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多