dee*_*pak 2 java arrays multidimensional-array
我正在尝试使用Key,Value对实现数据结构,并且正在研究数组实现.
实现此目的的一种方法是为Key和Values声明单独的1-D数组.
private int[] keys = new int[N];
private int[] values = new int[N];
Run Code Online (Sandbox Code Playgroud)
但是,通过声明如下的二维阵列并且不会在数据局部性上妥协,可以实现同样的目的吗?
private int[][] keysAndValues = new int[2][N];
Run Code Online (Sandbox Code Playgroud)
在这里,Java以行主顺序实现多维数组似乎很重要吗?以这种方式声明数组是否有任何性能优势,或者这是否会降低代码的可读性?
Java中的2D数组实际上是一个对象引用数组,每个对象引用都指向一维数组.2D数组和每个1D数组都是独立的堆对象,并且(理论上)可以在堆中的任何位置.
(有关原因的讨论,请参阅:为什么Java没有真正的多维数组?)
但是,通过声明如下的二维阵列并且不会在数据局部性上妥协,可以实现同样的目的吗?
是的,它可以.
两个版本之间的数据位置差异很小,特别是如果我们可以假设N与之相比较大2.(如果我们不能,那么数据局部性很可能无关紧要;即性能差异太小而不显着.)
在这里,Java以行主顺序实现多维数组似乎很重要吗?
这是一个问题吗?如果是,那我想是的.它肯定是相关的......虽然如果Java将它们实现为column-major,那么你只需翻转行和列并获得一个等效的解决方案
以这种方式声明数组是否有任何性能优势,或者这是否会降低代码的可读性?
性能问题可能微不足道.但是,如果它真的非常重要,那么最好的建议是为自己配置和优化代码......在REAL输入数据集上.
至于可读性,这取决于你判断.我无法预测你的代码会是什么样子.
如果您真的想要控制内存局部性,那么最好的方法是使用单个1D阵列,并以一种能够为您提供最佳局部性的方式映射索引.(这取决于您的应用程序以及它如何引用数组中的数据.)
| 归档时间: |
|
| 查看次数: |
1724 次 |
| 最近记录: |