我正在尝试使用键、值对实现数据结构,并正在研究数组实现。
实现此目的的一种方法是为键和值声明单独的一维数组。
private int[] keys = new int[N];
private int[] values = new int[N];
但是,可以通过如下声明一个二维数组来实现同样的目的,并且不影响数据局部性吗?
private int[][] keysAndValues = new int[2][N];
Java 按行优先顺序实现多维数组似乎很重要?以这种方式声明数组是否有任何性能优势,或者这是否会降低代码的可读性?
Java中的2D数组实际上是一个对象引用数组,每个对象引用都指向一个1D数组。 2D 数组和每个 1D 数组都是单独的堆对象,并且(理论上)可以位于堆中的任何位置。
(有关原因的讨论,请参阅:为什么Java没有真正的多维数组? https://stackoverflow.com/questions/26318341/why-doesnt-java-have-true-multidimensional-arrays?rq=1)
但是,可以通过如下声明一个二维数组来实现同样的目的,并且不影响数据局部性吗?
是的,它可以。
两个版本之间的数据局部性差异很小,特别是如果我们可以假设N
相比而言较大2
。 (如果我们不能,那么数据局部性很可能是无关紧要的;即性能差异将太小而不会显着。)
Java 按行优先顺序实现多维数组似乎很重要?
这是一个问题吗?如果是,那么我想是的。这当然是相关的……尽管如果 Java 实现了它们的列优先,那么您只需翻转行和列并得到等效的解决方案
以这种方式声明数组是否有任何性能优势,或者这是否会降低代码的可读性?
性能问题可能并不重要。但如果它真的非常重要,那么最好的建议是在真实的输入数据集上为自己分析和优化代码。
至于可读性,那就由你来判断了。我无法预测你的代码会是什么样子。
如果您确实想控制内存局部性,那么最好的方法是使用单个一维数组,并以提供整体最佳局部性的方式映射索引。 (这取决于您的应用程序以及它如何引用数组中的数据。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)