谢谢! @Vinay Yadav 供您发表评论。正如 Vinay 所建议的,请访问链接以详细了解这一点:https://eli.thegreenplace.net/2015/memory-layout-of-multi-dimensional-arrays。
记住这一点,你永远不会弄错:
主要行:字典顺序
主要栏目:共字典序
如果您不知道什么是 Co-lexicographical 和 Lexicographical:请查看 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 ]
现在,您可以进行其余的计算,将您的 base 和 W 东西带入,以获得您需要的最终答案。