TL; DR版本,对于那些不想要背景的人,是以下具体问题:
为什么Java没有真正的多维数组的实现?有坚实的技术原因吗?我在这里错过了什么?
Java在语法级别具有多维数组,可以声明
int[][] arr = new int[10][10];
Run Code Online (Sandbox Code Playgroud)
但似乎这真的不是人们所期望的.它不是让JVM分配足够大的连续RAM块来存储100 int秒,而是作为ints 的数组阵列出现:所以每个层都是一个连续的RAM块,但整体而言并非如此.arr[i][j]因此访问速度相当慢:JVM必须这样做
int[]存储的arr[i];int存储的arr[i][j].这涉及查询对象从一层到另一层,这是相当昂贵的.
在一个层面上,不难看出为什么这不能被优化为简单的扩展和添加查找,即使它们都被分配在一个固定块中.问题是arr[3]它本身就是一个引用,它可以被改变.因此,尽管数组具有固定大小,但我们可以轻松编写
arr[3] = new int[11];
Run Code Online (Sandbox Code Playgroud)
现在,由于这一层已经成长,因此缩放和加载是固定的.您需要在运行时知道是否所有内容仍然与以前相同.此外,当然,这将被分配到RAM中的其他地方(它必须是,因为它比它更换的更大),所以它甚至不适合扩展和添加.
在我看来,这并不理想,这有两个原因.
首先,它很慢.我使用这些方法运行的测试用于求和单维或多维数组的内容,对于多维情况(a 和a 分别填充随机值,运行1000000次,温度)几乎是两倍长(714秒对371秒)高速缓存).int[1000000]int[100][100][100]int
public static long sumSingle(int[] arr) {
long total = 0;
for (int i=0; i<arr.length; i++)
total+=arr[i];
return total;
}
public static long sumMulti(int[][][] arr) {
long total = 0; …Run Code Online (Sandbox Code Playgroud) 在C#中使用二维数组(type[,])或数组()数组会更高效type[][]吗?
特别是对于初始分配和项目访问
前段时间我问了一个问题,我被告知(在提交中)使用术语"多维数组"作为这样的结构:
int **a;
Run Code Online (Sandbox Code Playgroud)
初始化如下:
a = malloc(n * sizeof(*a));
for (i = 0; i < n; ++ i)
a[i] = malloc(m * sizeof(*a[i]));
Run Code Online (Sandbox Code Playgroud)
是误导,这是"只是一个多维数组的模拟".我不是英语母语人士,我很难搞清楚什么是正确的术语.不幸的是,抱怨这个术语的人自己也没有帮助.
果然,术语"多维阵列的仿真"太长,无法在文本/会话中实际使用.
总结一下:
问题:
注意:如果您的答案与参考文献相关联,我会很高兴.
编辑:我理解这个构造和之间的区别int a[n][m];.那不是问题.
分配的内存不一定是常规的.这种结构更精确:
a = malloc(n * sizeof(*a));
for (i = 0; i < n; ++ i)
if (needed[i])
a[i] = malloc(m[i] * sizeof(*a[i]));
else
a[i] = NULL;
Run Code Online (Sandbox Code Playgroud) 我正在尝试用Java制作一个类似扫雷的游戏,我已经完成了大部分工作,但我需要帮助的是FloodFill - http://en.wikipedia.org/wiki/Flood_fill.没有真正帮助......但有人可以解释它是如何工作的吗?我看过网上但我并不理解这个解释,所以我会在这里问一下会更容易.
在我的扫雷中,我有:
JButton[] btn = new JButton[100]//buttons being clicked and displaying the values/bombs
int[] mines = new int[100];//int array holding the values for each button.
Run Code Online (Sandbox Code Playgroud)
网格是10x10网格,所以说你点击的按钮是btn [14],
btn[4] // north of btn[14](14-10)
btn[24] // south of btn[14](14+10)
btn[13] // west of btn[14](14-1)
btn[15] // east of btn[14](14+1)
Run Code Online (Sandbox Code Playgroud)
回到这个问题,有人可以向我解释一下吗?
编辑: 我将我的代码更改为2D,而不是上面的代码现在是
btn[1][4]//row one, column 4
Run Code Online (Sandbox Code Playgroud)
单击该按钮时,我希望它检查名为mines [] []的变量,该变量具有值,如果该值等于0(在初始单击的周围),则更改BG
btn[x][y].setBackground(Color.GRAY);
Run Code Online (Sandbox Code Playgroud) arrays ×3
java ×3
performance ×2
algorithm ×1
c ×1
c# ×1
c++ ×1
declaration ×1
flood-fill ×1
int ×1
terminology ×1