如何将索引直接映射到值而不必迭代索引?
如果它非常复杂,我可以在哪里阅读更多内容?
答案 0 :(得分:5)
数组只是一个连续的内存块,从某个已知地址开始。因此,如果起始地址为p
,并且您想要访问i
- th元素,那么您只需要计算:
p + i * size
其中size
是每个元素的大小(以字节为单位)。
粗略地说,访问任意内存地址需要一段时间。
答案 1 :(得分:4)
基本上,计算机内存可以描述为一系列寻址的插槽。要创建一个数组,你可以预留一个连续的数组。因此,如果阵列中需要50个插槽,则可以从内存中留出50个插槽。在这个例子中,假设您将1019到1068之间的插槽留作一个名为A的阵列.A中的插槽0是内存中的插槽1019。 A中的插槽1是内存中的插槽1020。 A中的插槽2是存储器中的插槽1021,依此类推。所以,一般来说,要获得数组中的第n个插槽,我们只需要1019 + n。所以我们需要做的就是记住起始槽是什么并适当地添加它。
如果我们想确保我们不在数组末尾写入内存,我们可能还想存储A的长度并检查我们的n。同样的情况是,我们希望跟踪的所有值都不是相同的大小,因此我们可能有一个数组,其中数组中的每个项占用多个插槽。在这种情况下,如果s是每个项目的大小,那么我们需要将s乘以数组中的项目数量,并且当我们获取第n个项目时,我们需要将s时间n添加到开头而不是n 。但在实践中,这很容易处理。唯一的限制是数组中的每个项目大小相同。
答案 2 :(得分:1)
维基百科很好地解释了这一点:
http://en.wikipedia.org/wiki/Array_data_structure
基本上,选择了内存基础。然后将索引添加到基础。像这样:
if base = 2000 and the size of each element is 5 bytes, then:
array[5] is at 2000 + 5*5.
array[i] is at 2000 + 5*i.
二维数组乘以这种效果,如下所示:
base = 2000, size-of-each = 5 bytes
array[i][j] is at 2000 + 5*i*j
如果每个索引的大小不同,则需要进行更多计算:
for each index
slot-in-memory += size-of-element-at-index
因此,在这种情况下,几乎不可能在没有迭代的情况下直接映射。