【问题标题】:Is there a way other than Array / ArrayList for saving elements of matrix除了 Array / ArrayList 还有其他方法可以保存矩阵的元素吗
【发布时间】:2015-03-05 17:41:33
【问题描述】:

假设我们有如下整数: (1, 2)=10, (2,3)=20, (3, 4)=30 等等……

这些整数分布在具有2000*2000 维度的矩阵中。

但我只需要该矩阵的 4000-6000 个元素及其索引(即它们的位置 (i, j))。矩阵中的其他元素为零。所以我不需要它们。 除了使用二维 Array/ArrayList 来保存这些元素及其索引之外,还有什么好的方法吗,因为我们可以轻松地调用和重用元素及其索引?

使用 Array/ArrayList 会消耗大量内存。

【问题讨论】:

  • 我自己会使用某种Map
  • 阅读稀疏矩阵实现。
  • 如果您说数组消耗大量内存,我认为没有其他数据结构可以帮助您。数组是 java 中非常基本的内存高效实现。

标签: java arrays matrix arraylist


【解决方案1】:

拥有这种大小的二维数组会浪费内存,因为它会有 4,000,000 个元素。因为您只需要 4000-6000 个元素,所以这个数组会非常稀疏。

您可以使用HashMapPoint 映射到Integer

Map<Point, Integer> points = new HashMap<>();

您需要确保您有一个 Point 类可以正确地覆盖 hashcodeequals

HashMap 只会将您put 的 4000-6000 点存储到其中。

【讨论】:

  • 使用Point 似乎是错误的——这实际上是用于图形的东西,它代表二维空间中的一个位置。我要么使用HashMap&lt;Pair&lt;Integer, Integer&gt;, Integer&gt;,其中Pair 是Apache Commons,要么使用HashMap&lt;Integer,HashMap&lt;Integer, Integer&gt;&gt;
  • @DavidWallace 我并不是指java.awt.Point。可以使用适当的hashCodeequals 方法轻松创建自己的Point 类。但是你是对的,使用Pair&lt;Integer, Integer&gt; 会起作用。
【解决方案2】:

使用 HashMap 的解决方案非常好且干净,但是如果您需要线性代数算法,那就不明智了。

您可以使用 la4j,纯 Java 开源线性代数库。它包含稀疏矩阵实现,如Compressed Row Storage 和许多矩阵算法,如排名、分解、线性系统求解等。

【讨论】:

  • 如果你正在研究代数,我强烈推荐这种方法。
猜你喜欢
  • 1970-01-01
  • 2015-06-26
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
相关资源
最近更新 更多