【问题标题】:How does Lua 5.x represent sparse arrays?Lua 5.x 如何表示稀疏数组?
【发布时间】:2014-11-11 08:39:39
【问题描述】:

说,我有一个这样的数组:

T = {1,2,[1000] = 3, [-1] = -1}

我知道 1 和 2 将在连续数组部分,-1 将在哈希部分。 但我不知道3会在哪里。它将如何在“内部”Lua 中表示。 2 和 3 之间会有 997 个浪费的空间吗? 3 会被委派到哈希部分以提高效率吗?是否会有 2 个链接的连续表,一个从索引 1 开始,第二个从索引 1000 开始?

【问题讨论】:

  • 3 也将是一个哈希。
  • {[1]=1,[3]=3} 3 也会是哈希吗?规则是什么?

标签: lua


【解决方案1】:

这取决于你使用的 Lua 版本。在 Lua 4 中,表被严格地实现为哈希表。在 Lua 5 中,表是部分哈希表和部分数组,请参阅Lua Implementation,其中第 4 节介绍了表和稀疏数组

数组部分尝试存储整数键对应的值 从 1 到某个限制 n。对应于非整数键的值或 范围之外的整数键存储在哈希部分中。 ... 这 数组部分的计算大小是最大的 n 使得至少 1 和n 之间的一半块正在使用中......并且至少有 在n/2+1n 之间使用一个插槽。

在您的示例中,1000 可能在初始 n 之外,并且不会导致数组部分增长,因为它太稀疏了。

【讨论】:

  • 自从那篇论文写成之后,细节可能已经改变了。无论如何,细节应该无关紧要。
【解决方案2】:

您不必担心这些细节:只要相信 Lua 表是有效实现的,预期的恒定时间访问给定其键的条目即可。数组部分只是一个实现细节,通过不需要存储一些键来减少内存使用。

正如 rpattiso 所解释的,您的示例中没有内存浪费。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2010-11-18
    • 1970-01-01
    • 2018-08-22
    相关资源
    最近更新 更多