当 GCC 允许我这样做时,我感到很困惑:
int t[10][10][10][10][10];
我意识到int i[N][N]
是一个NxN
矩阵,其中第一个N
表示行,第二个表示列。此外,第三个N
表示int i[N][N][N]
深度,为我们提供了一个 3d 维数组。
我不明白什么int i[N][N][N][N]
和超越的意思。
第四个维度是时间,但这不适用于这里。
那么,这是否意味着当我到达第三个时,我可以让逻辑消失?
当 GCC 允许我这样做时,我感到很困惑:
int t[10][10][10][10][10];
我意识到int i[N][N]
是一个NxN
矩阵,其中第一个N
表示行,第二个表示列。此外,第三个N
表示int i[N][N][N]
深度,为我们提供了一个 3d 维数组。
我不明白什么int i[N][N][N][N]
和超越的意思。
第四个维度是时间,但这不适用于这里。
那么,这是否意味着当我到达第三个时,我可以让逻辑消失?
我发现一个库类比对于可视化多维数组非常有用:
在数学世界中,维数无关紧要。它最终会达到一个无法再想象它的地步。
尺寸就是您想要制作的任何尺寸。例如,只有在处理这些概念时,深度和时间才有意义。
它不一定是关于空间和时间的。事实上,C++ 标准称它们为extents。
假设您有十种不同的奶酪,并且您想评估某人以某种特定顺序偏爱它们的可能性。您可以将其存储在您int t[10][10][10][10][10];
的 , 中分别表示:最喜欢的奶酪、第二喜欢的奶酪、第三喜欢的奶酪、第四喜欢的奶酪、第五喜欢的奶酪和最不喜欢的奶酪。某人喜欢按 5-4-6-3-2-1 顺序排列的奶酪的可能性将表示为t[5][4][6][3][2][1]
。
关键是,该语言没有将域语义附加到范围。这取决于你。
N 维数组不仅仅是 C++ 的东西。它出现在数学、物理学、其他各种科学等领域。
这是一个示例:假设您想按位置 (x,y,z)、时间和“哪个用户生成数据”来索引数据。对于在 x1、y1、z1、time1 收集并由 user1 生成的数据点,您可以将其保存为dataArray[x1][y1][z1][time1][user1] = myNewData
.
在编程中,不要从传统几何的角度来考虑多维数组,除非您直接尝试表示世界。最好将每个连续的“维度”视为另一个包含数组的数组。有几个用例可能会出现这种情况。但是,如果您使用超过三个维度,我将不再将其视为数组甚至“数组数组”,我更喜欢树,因为它们更接近于您对需要超过 3 层深度的东西进行编程的方式。
一个例子是一棵树,你有一个根节点,它的节点也有节点。如果你想对某样东西进行排序,那么一棵树是一个很棒的工具。假设您想对一堆随机出现的数字进行排序。您将输入根中的第一个数字。如果第一个数字是 5,下一个数字是 7,那么您将把 7 放在根节点 5 的“右侧”。如果您得到一个 3,然后是 4,您将把 3 插入到5 的“左”,然后是 3 的“右”的 4。如果您按顺序遍历这棵树(总是从树的左边向下走,只有在没有新节点时才返回,然后向右走),你最终会得到一个排序列表:3、4、5、7。
5
/ \
3 7
\
4
在这里,您可以看到树状结构。如果您在 C 中执行此操作,您将使用结构,它看起来像这样(我使用的是伪代码):
struct Node{
int val;
Node left;
Node right;
}
有很多关于二叉树的材料(我一直在解释),但主要是我希望你摆脱数组“就像空间中的维度”的概念,而不仅仅是可以存储元素的数据结构. 有时二叉树或其他数据结构过于复杂,5 维或更多维数组可能更方便存储数据。我现在想不出一个例子,但它们以前被使用过。
作为物理 3 维存在,我们无法“可视化”第 4、第 5、第 6(或更高)物理维度所代表的内容。
第四维度会将我们的感知扩展到第四方向,该方向与我们自然感知的高度、宽度和深度方向正交。
是的 - 几何变得很奇怪!
为了让我们对这个想法有一种感觉,在这段视频中, 卡尔萨根想象了一个完美平坦的 2d 生物(一个小正方形),生活在 2d 世界中,遇到一个神秘的 3d 生物会是什么感觉。
这个 3d 生物(怀疑类似于苹果)主要存在于这个小方块无法“看到”的神秘 3d 维度中。它只感知苹果与它的二维平面世界相交的点,即它的投影......
以今天的标准来看,这段视频看起来已经过时了,但就物理/几何而言,它仍然是我见过的最好的解释。