Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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
C 将二维数组表示为一维数组_C_Performance_Arrays - Fatal编程技术网

C 将二维数组表示为一维数组

C 将二维数组表示为一维数组,c,performance,arrays,C,Performance,Arrays,可能的重复项: 前几天我在看我朋友的一个分子动力学代码库,他用一维数组表示了一些二维数据。因此,他不必使用两个索引,只需跟踪其中一个,但需要做一些数学运算,以确定如果是2D,它将处于什么位置。因此,在这个2D阵列的情况下: two_D = [[0, 1, 2], [3, 4, 5]] 其代表为: one_D = [0, 1, 2, 3, 4, 5] 如果他需要知道2D数组的位置(1,1),他会做一些简单的代数运算,得到4 使用一维阵列而不是二维阵列是否会提高性能。在计算

可能的重复项:

前几天我在看我朋友的一个分子动力学代码库,他用一维数组表示了一些二维数据。因此,他不必使用两个索引,只需跟踪其中一个,但需要做一些数学运算,以确定如果是2D,它将处于什么位置。因此,在这个2D阵列的情况下:

two_D = [[0, 1, 2],
         [3, 4, 5]]
其代表为:

one_D = [0, 1, 2, 3, 4, 5]
如果他需要知道2D数组的位置(1,1),他会做一些简单的代数运算,得到4

使用一维阵列而不是二维阵列是否会提高性能。在计算过程中,数组中的数据可以被调用数百万次

我希望数据结构的解释是清楚的…如果不让我知道,我会尝试更好地解释它

谢谢:)

编辑
语言是C

通常2D数组被实现为1D数组。有时二维数组由指向一维数组的指针的一维数组实现。与一维数组相比,第一种情况显然没有性能损失,因为它与一维数组相同。第二种情况可能会由于额外的间接性(以及额外的细微影响,如缓存位置的降低)而对性能造成轻微的损失

每个系统所使用的类型是不同的,因此如果没有关于您正在使用什么的信息,就真的无法确定。如果性能对你来说真的很重要,我建议你测试一下。如果表现不是那么重要,那就不用担心了


对于C,2D数组是带有语法糖的1D数组,因此性能是相同的。

请看一看

您没有提到这是关于哪种语言的,也没有提到2D数组将如何实现。在C中,2D数组实际上实现为1D数组,其中C会自动对索引执行算术以访问正确的元素。所以它会做你朋友在幕后做的事

在其他语言中,2d数组可能是指向内部数组的指针数组,在这种情况下,访问元素将是数组查找+指针解引用+数组查找,这可能比索引算法慢,但除非您知道这是一个瓶颈,否则不值得优化

oneD_index = 3 * y + x;

其中x是行中的位置,y是列中的位置。使用列宽而不是3。通过这种方式,您可以将二维坐标转换为一维坐标。

对于宽度为W、高度为H的二维数组,您可以将其表示为长度为W*H的一维数组,其中每个索引

 (x,y)
其中x是列,y是行,二维数组的

i=y*W + x
在一维阵列中。类似地,您可以使用反向映射:

y = i / W
x = i % W
。如果你把W设为2的幂(W=2^m),你可以使用hack

y = i >> m;
x = (i & (W-1))
其中,该优化仅限于W为2的幂的情况。编译器很可能会错过这个微优化,所以您必须自己实现它

模在C/C++中是一个缓慢的运算符,因此使其消失是有利的

此外,对于大型二维数组,请记住计算机将它们作为一维数组存储在内存中,并使用上面列出的映射基本上计算出索引


比确定这些映射的方式更重要的是如何访问数组。有两种方法可以做到这一点,主要是列和行。遍历的方式比任何其他因素都更为重要,因为它决定了您是否在使用缓存。请阅读。

2D数组的实现取决于语言。你可以在这里得到一些很好的答案:这里:注意:引用的SO问题属于C语言。这是真的,但如何计算指数不是问题。同样,这不是问题。+1对于如此好的回答!我知道这已经[很多]年了,但仍然是一条非常有价值的信息。谢谢,@ldog