Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua5.x如何表示稀疏数组?_Lua - Fatal编程技术网

Lua5.x如何表示稀疏数组?

Lua5.x如何表示稀疏数组?,lua,Lua,比如说,我有一个这样的数组: T = {1,2,[1000] = 3, [-1] = -1} 我知道1和2将在连续数组部分,-1将在散列部分。 但我不知道3会在哪里。它将如何在Lua内部表示。 在2和3之间会有997个浪费的空间吗?为了提高效率,3会被委派去散列部分吗?是否会有两个链接的连续表,一个从索引1开始,另一个从索引1000开始?这取决于您使用的Lua版本。在Lua4中,表严格地实现为哈希表。在Lua5中,表是部分哈希表和部分数组,请参见第4节中介绍表和稀疏数组的内容 数组部分尝试存储

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

T = {1,2,[1000] = 3, [-1] = -1}
我知道1和2将在连续数组部分,-1将在散列部分。 但我不知道3会在哪里。它将如何在Lua内部表示。
在2和3之间会有997个浪费的空间吗?为了提高效率,3会被委派去散列部分吗?是否会有两个链接的连续表,一个从索引1开始,另一个从索引1000开始?

这取决于您使用的Lua版本。在Lua4中,表严格地实现为哈希表。在Lua5中,表是部分哈希表和部分数组,请参见第4节中介绍表和稀疏数组的内容

数组部分尝试存储与整数键对应的值 从1到某个极限
n
。与非整数键或 到范围外的整数键存储在散列部分。。。这个 数组部分的计算大小为最大n,这样至少 1和
n
之间的一半块正在使用中。。。至少有 在
n/2+1
n
之间使用一个插槽


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

您不必担心这些细节:只需相信Lua表是有效实现的,并且在给定项的键的情况下,对其进行预期的恒定时间访问。数组部分只是一个实现细节,通过不存储一些键来减少内存使用


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

3
也将是哈希。{[1]=1,[3]=3}3也将是哈希吗?规则是什么?自从那篇论文发表以来,细节可能已经改变了。不管怎样,细节都不重要。