Re: [问题] 多维阵列 VS 一维阵列

楼主: callmei (挨)   2012-09-30 00:52:03
PS,我刚打完才发现我举的例子中A是一维阵列,B是三维阵列,跟你原文相反...
※ 引述《iohan (iohan)》之铭言:
: 假设
: integer A(10,10,10)
: integer B(1000)
: 结构上看起来用的内存要一样
: 但是我听到有种说法是A使用的内存会比B还来的大!?
: 实际上是???
: 另外就是B的元素在内存上的分布是连续的这点不用质疑
: 那么A呢??
也是连续的阿
假设B阵列是2*2*2的大小
那B阵列在内存里的排列顺序,以FORTRAN来说就是
B(1,1,1)、B(2,1,1)、B(1,2,1)、B(2,2,1)、B(1,1,2)、B(2,1,2)、B(1,2,2)、B(2,2,2)
至于使用的内存大小,我不太确定
至少在储存阵列内的元素值所占用的内存大小是一样的
但是有听说阵列会另外储存阵列维度上下限的值
所以DEBUGER才能检查出是否有呼叫到超出当初阵列宣告时大小的阵列元素
一维阵列只要记录一个方向的上下限,以A阵列来讲就是纪录1跟1000两个数字
三维阵列要记录三个方向的上下限,以B来讲就是纪录1、10、1、10、1、10六个数字
所以说三维阵列用到的内存会比一维阵列大一些
不过这点我是真的很不确定,只是听说的
因为实际上DEGUGER检查程式里是否有呼叫到超出阵列大小的元素的功能是可以关掉的..
而且不同语言的可能作法也不同
: A(i,j,k)
: 书上说按照 i -> j -> k 的顺序下去读是连续的
: 但是听到上面第一种的说法害我开始怀疑B的连续性...
: 假如真的是连续的
: 那么A从1读到1000
: 跟B从(1,1,1)读到(10,10,10)
: 速度上会有差?? ( 我在实际应用上的矩阵B可能是300*300*300
我自己认为还是有差的
因为所谓的阵列,其实只是一个指标而已
这个指标纪录了阵列第一个元素在电脑内存里的位址
我们呼叫阵列里某个元素时,电脑只是根据这个阵列第一个元素的内存位址,
去计算出我们呼叫的元素在哪个内存位址里,再去该内存位址取值
譬如你举的例子,A是大小1000的一维阵列,B是大小10*10*10的三维阵列
对电脑而言,A这个变量,他记录的是A(1)在内存里的位址
B这个变量,他纪录的则是B(1,1,1)在内存里的位址
电脑要呼叫A(10)的值,他必须去计算A(10)所在的内存位址跟A(1)之间的关系
找到A(10)的内存位址,才能取出该内存位址的值,也就是A(10)的值
譬如如果我们同样呼叫两个阵列第一个元素所在位址的后面第500个元素
在A阵列就是A(500)的值,B阵列就是B(10,10,5)这个元素的值
理论上电脑一开始并不会知道A(500)跟B(10,10,5)都是阵列的第500个元素
那电脑在呼叫A(500)时,
因为电脑只记录A(1)的位址,所以为了要得知A(500)所在的内存位址
他必须要做计算:A(500)所在内存位址 = A(1)内存位址 + 500 - 1
也就是一个加号的计算跟一个减法
而电脑要得知B(10,10,5)的内存位址,他必须要做计算:
B(10,10,5)所在内存位址 = B(1,1,1)内存位址 + (5-1)*100 + (10-1)*10 + (10-1)
他必须要做2个乘法、3个加法、3个减法的计算,才能取得B(10,10,5)的值
在评估计算速度时,
为了简化,我们通常会假设乘/除速度远远大于加减,所以只考虑乘/除的计算
因此可以很明显看出,明明都是呼叫第500个元素的值,
三维阵列B所需要的时间会比一维阵列A多
因此理论上三维阵列的呼叫会比一维阵列慢
这是我自己的见解,若有误,还请其他版友纠正
: 补个计概问题
: 请问一下电脑在执行指令时
: 不同的动作之间的速度比大概是怎么样的一个情况呢?
: ex.
: 浮点相乘: xxx Hz / s
: 浮点相除: ooo Hz / s
: 逻辑判断: !!! Hz / s
: 读内存: ??? Hz / s
: 写内存: @@@ Hz / s
: 扫内存: ... Hz / s
作者: iohan (iohan)   0000-00-00 00:00:00
感谢解答

Links booklink

Contact Us: admin [ a t ] ucptt.com