假设我想用整数(x,y)坐标存储n个点。我可以使用2-d(2Xn)数组或使用列表/集合/或n个对象的数组,其中每个对象有2个整数字段来存储坐标。 据我所知,2d阵列选项速度更快,占用的内存更少,但我不知道为什么?详细解释或与细节链接表示赞赏。
答案 0 :(得分:0)
这是一个非常广泛的问题,有点很多部分。首先,这与您正在使用的语言有关。让我们以Java为例。
创建对象时,它继承自主对象类。创建对象时,开销来自用户定义的类继承自Object
的事实。编译器必须在内存中虚拟化某些方法调用,以便在您调用.equals()
或.toString()
时,程序知道要调用哪一个(即,您的类'.equals()
或{{1 } {s} Object
)。这是通过查找表完成的,并在运行时使用指针确定。
这称为虚拟化。现在,在java中,一个数组实际上是一个对象,所以你真的没有从数组数组中获得太多。实际上,您可以使用自己的类做得更好,因为您可以限制与之关联的元数据。 java中的数组存储有关其长度的信息。
然而,许多收藏品都有与之相关的开销。例如,.equals()
将自行调整大小并将有关自身的元数据存储在内存中,您可能不需要。 ArrayList
引用了其他节点,这是其实际数据的开销。
现在,我所说的只关于Java。在其他OO语言中,对象在内部的行为不同,有些可能效率更高/更低。
在像C ++这样的语言中,当你分配一个数组时,你实际上只是得到了一块内存,这取决于你想用它做什么。从这个意义上说,它可能会更好。如果使用覆盖(关键字LinkedList
),C ++与其对象的开销类似,因为它将在内存中创建这些虚拟查找。
答案 1 :(得分:0)
所有这些都取决于您将如何有效地使用存储空间以及您的访问要求。必须留出内存以容纳10,000 x 10,000阵列以仅存储10个点将是可怕的内存浪费。另一方面,如果您花费大量时间迭代列表以找到10,000,000存储中实际需要的那一点,那么通过将点存储在链表中来节省内存也将毫无意义。
两者的一些缺点都可以克服。稀疏数组,按一些规则对列表进行预排序,以便“需要”点浮动到顶部等等......
答案 2 :(得分:0)
在大多数语言中,使用多维数组表示AxB,你只有一大块内存足以容纳A * B对象,当你查找一个元素(m,n)时,你需要做的就是找到位置m * A + b处的元素。当你有一个对象列表时,每个列表都会产生开销,而且查找比简单的地址计算更复杂。
如果矩阵的大小是常数,则2D阵列是最快的选择。如果它需要增长和缩小,你可能别无选择,只能使用第二种方法。