当前位置: 首页 > 面试题库 >

实现矩阵更有效-使用数组数组(2D)还是一维数组?

长孙雅志
2023-03-14
问题内容

使用数组实现Matrix构造时,哪一种效率更高?使用1D阵列还是2D阵列?

我认为2D效率更高,因为您已经拥有元素的X和Y坐标,而在一维实现中则必须计算索引。

编辑:正在使用Java实现


问题答案:

“高效”不是万能的。

就存储可能稀疏的数组而言,数组数组解决方案效率更高(即,您可以使用空指针表示全零的矩阵行)。这将是(在C中):

int *x[9];

每个都"int *"将单独分配。

2D数组(不一定是数组的数组)通常会更快(就速度而言是有效的),因为它可以用数学方法计算出存储位置,而不必取消对存储位置的引用。我说的是构造:

int x[9][9];

一维数组的形式为:

int x[81];

它不可能比等效的2D版本快,因为您仍然必须在某个时候进行计算才能找到正确的单元格(通常在代码中手动进行,而不是让编译器来完成)。

编辑后添加Java的要求:

我相信Java 2D数组属于各种数组数组(与1D数组相比,将需要两次内存访问),因此带有手动索引计算的1D数组可能会更快。因此,与其声明和使用:

int x[width][height];
x[a][b] = 2;

您可能会提高速度:

int x[width*height];
x[a*height+b] = 2;

您只需要注意不要在任何地方混淆公式(即,不要无意间交换4和7)。

这种速度差异是基于我认为Java是如何编码的,所以我可能是错的(但我对此表示怀疑:-)。我的建议是,一如既往地对优化问题进行 衡量,不要猜测!



 类似资料:
  • 问题内容: 我有一个像这样的数组: 我试图得到这样的数组: 每行(具有固定的任意宽度)都移动一个。A的数组是10k记录长,我试图在Numpy中找到一种有效的方法。目前,我正在使用vstack和for循环,这很慢。有没有更快的方法? 编辑: 问题答案: 实际上,有一种更有效的方法来执行此操作…使用etc的缺点是,您正在复制数组。 顺便说一句,这实际上与@Paul的答案相同,但我将其发布只是为了更详细

  • 本文向大家介绍python矩阵转换为一维数组的实例,包括了python矩阵转换为一维数组的实例的使用技巧和注意事项,需要的朋友参考一下 实例如下所示: 以上这篇python矩阵转换为一维数组的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我需要以正确的二维数组格式打印此内容。哎呀,这是错误的。需要从方法打印。我的输出似乎是一个无限循环。

  • 问题内容: 如何以矩阵框格式打印出简单的int [] [],就像我们在其中手写矩阵的格式那样。简单的循环运行显然无效。如果有帮助,我正在尝试在linux ssh终端中编译此代码。 问题答案: 产生:

  • 问题内容: 例如: 一个) 与 b) 最初以为我会为了简化而选择a)。 我知道Java不会像C那样在内存中线性存储数组,但是这对我的程序有什么影响? 问题答案: 通常,在搜索答案时,最好的办法是查看如何将选择编译到JVM字节码中: 这被翻译成: 因此,如您所见,JVM已经知道我们在谈论多维数组。 进一步说明: 这被转换为(跳过循环): 因此,如您所见,多维数组在VM内部进行处理,无用指令不会产生开

  • 1. 把数组中的 0 移到末尾 2. 改变矩阵维度 3. 找出数组中最长的连续 1 4. 有序矩阵查找 5. 有序矩阵的 Kth Element 6. 一个数组元素在 [1, n] 之间,其中一个数被替换为另一个数,找出重复的数和丢失的数 7. 找出数组中重复的数,数组值在 [1, n] 之间 8. 数组相邻差值的个数 9. 数组的度 10. 对角元素相等的矩阵 11. 嵌套数组 12. 分隔数组