【问题标题】:element address in 3 dimensional array3维数组中的元素地址
【发布时间】:2015-11-01 15:04:07
【问题描述】:

我正在寻找公式来查找 3-D 数组中元素的内存位置,用于行专业和列专业。使用我的逻辑后,我得到了以下公式。 说数组是A[L][M][N]

行专业:Loc(A[i][j][k])=base+w(M*N(i-x)+N*(j-y)+(k-z))
专栏:Loc(A[i][j][k])=base+w(M*n(i-x)+M*(k-z)+(j-y))

其中 x、y、z 是 1st(L)、2nd(M) 和 3rd(N) 索引的下限。 我尝试了这个公式并得到了正确的结果,但是当我将这个公式应用于书中的一个问题时,答案不匹配。请任何人都可以帮我解决这个问题。

【问题讨论】:

标签: arrays data-structures


【解决方案1】:

3D 数组公式

行主要顺序:

地址

A[I, J, K] = B + W * [(D - Do)*RC + (I - Ro)*C + ( J - Co)]

列主要顺序:

地址

A[I, J, K] = B + W * [(D - Do)*RC + (I - Ro) + (J - Co)*R]

地点:

  • B = 基地址(起始地址)
  • W = 权重(存储在数组中的一个元素的存储大小)
  • R = 行(总行数)
  • C = 列(总列数)
  • D = 宽度(深度方向的单元总数)
  • Ro = 行的下界
  • Co = 列的下限
  • Do = 宽度下限

【讨论】:

  • 以下是How do I write a good answer? 的一些指南。提供的这个答案可能是正确的,但它可以从解释中受益。仅代码答案不被视为“好”答案。来自review
【解决方案2】:

正确的是:

row-major:Loc(A[i][j][k])=base+w(N*(i-x)+(j-y)+M*N(k-z))
column-major:Loc(A[i][j][k])=base+w((i-x)+M*N(k-z)+M*(j-y))

【讨论】:

  • 我认为列专业的公式是base + w((i-x) + L*(j-y) + L*M*(k-z))。还是我错了。
【解决方案3】:

谢谢! @Vinay Yadav 供您发表评论。正如 Vinay 所建议的,请访问链接以详细了解这一点:https://eli.thegreenplace.net/2015/memory-layout-of-multi-dimensional-arrays

记住这一点,你永远不会弄错:
主要行:字典顺序
主要栏目:共字典序

如果您不知道什么是 Co-lexicographicalLexicographical:请查看 this 维基百科页面了解更多信息。让我为您强调重要的部分,请阅读:

词典中的单词(在某种语言中使用的一组单词)有一个 字典和百科全书中使用的传统排序,即 取决于用于的符号字母表的基本顺序 建立的话。字典顺序是形式化的一种方式 给定基础符号的顺序的词序。

正式的概念始于一个有限集 A,通常称为 字母表,它是完全有序的。也就是说,对于任意两个符号 a 和 A 中的 b 不是同一个符号,要么 a

A 的单词是来自 A 的有限符号序列,包括 长度为 1 的单词包含单个符号,长度为 2 的单词包含 2 符号等,甚至包括没有符号的空序列 varepsilon 一点也不。字典式的 order 在所有这些有限词的集合上将词排序为 如下:

给定两个相同长度的不同单词,例如 a = a1a2...ak 和 b = b1b2...bk,两个词的顺序取决于两个词不同的第 i 个符号的字母顺序 (从单词的开头开始计算):a

在此之后,您可以从上面提到的同一个维基百科页面了解共同词典顺序。上面引用的部分直接取自上述维基百科页面的动机和定义标题部分。访问一次,您将对两者都有更好的了解。

您只需要在数组中所有可能的 (foo1, foo2, foo3) 中找到 (i, j, k) 的字典和共字典位置A你的:

foo1 -> L possibilities: [Lower Bound x, Upper Bound x + L - 1]  
foo2 -> M possibilities: [Lower Bound y, Upper Bound y + M - 1]  
foo3 -> N possibilities: [Lower Bound z, Upper Bound z + N - 1]  

基于这些知识,您将得到:
1)。元素A[foo1][foo2][foo3] (foo1, foo2, foo3) 出现在元素A[i][j][k] (i, j, k) 之前的数量在行主要顺序或字典顺序中是:[ (i - x)*M*N + (j - y)*N + (k - z) ]

2)。列主要顺序或共字典顺序中元素 A[i][j][k] (i, j, k) 之前存在的元素 A[foo1][foo2][foo3] (foo1, foo2, foo3) 的数量是:
[ (i - x) + (j - y)*L + (k - z)*L*M ]

现在,您可以进行其余的计算,将您的 baseW 东西带入,以获得您需要的最终答案。

【讨论】:

    猜你喜欢
    • 2016-02-05
    • 2023-03-21
    • 1970-01-01
    • 2014-04-19
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多