【问题标题】:Best datastructure for matrix with lot of mutation具有大量突变的矩阵的最佳数据结构
【发布时间】:2015-04-18 00:39:22
【问题描述】:

我很难想到一个高效的data structure 来保存矩阵(它们的大小可能接近 75x75)。 1 是唯一重要的单元格,0 将始终为空且无用。如果我们不能将 0 加载到 data structure 中,我也更愿意。


        Col 1   Col 2  Col 3 Col 4  Col 5
Row 1       0       0      1     0      1
Row 2       0       1      0     0      0
Row 3       1       1      0     0      0
Row 4       0       0      0     0      0
Row 5       0       0      1     0      1

请记住,我将制定一个算法来对这个matrix 进行排序,我将在其中移动很多列和行。

我正在考虑一个包含行、列和值的表格。但我不确定这是否是最佳选择。老师让我看graph structure;它看起来很有希望保存数据,但移动行和列对我来说就像地狱一样。

data structures 有任何适合此目的的建议吗?

【问题讨论】:

标签: java matrix multidimensional-array data-structures graph


【解决方案1】:

对于稀疏数组,HashMap 是一个很好的选择。它相对较快 - O(1) 查找 - 并且相对节省空间。我说是相对的,因为有很多开销。

还有其他 Map 实现具有不同的行为 - 例如,TreeMapO(lg n) 中执行,但按键排序。

因此,虽然Map<Integer, Map<Integer, Integer>> 或类似的100x100 非常稀疏矩阵可能会为您节省空间,但我想int[][] 的效率不会低很多。

如果性能是一个问题,您绝对应该使用jmh 之类的方法对替代方案进行基准测试。在大多数情况下,我希望int[][] 的性能优于基于Map 的解决方案。

如果您使用 Guava,则可以使用 Table。我上面描述的两种选择基本上是HashBasedTableArrayTable。我不认为ArrayTable 会比原始int[][] 慢得多,但它会占用更多空间。

简而言之:

  1. 基准测试
  2. 基准测试
  3. 基准测试

【讨论】:

  • 我认为你应该澄清你的意思是HashMaps。还有其他具有不同运行时行为的地图。 Btw HashMaps 可以初始化一个大小以优化空间使用。
  • @LastFreeNickname 完成。要优化空间,您需要设置大小 和负载因子。这不会解决速度问题 - 它可能比数组访问慢。但是 OP 需要进行基准测试,看看速度差异是否超过了内存差异。
  • @BoristheSpider 非常感谢基准库,我刚刚设置了一个项目,以便能够对任何可能的解决方案进行基准测试,谢谢!
猜你喜欢
  • 2011-07-20
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多