【问题标题】:Building a sparse matrix in Java w/o using hashtables?使用哈希表在 Java 中构建稀疏矩阵?
【发布时间】:2011-04-25 22:23:17
【问题描述】:

在我的项目中,我正在尝试为图形构建邻接矩阵,出于空间和时间的考虑,我们应该使用稀疏矩阵,据我了解,使用哈希图最容易做到这一点。不幸的是,我们还必须实现一个邻接列表,我用所说的 hashmap 实现了它,并且由于我们的邻接矩阵在结构上必须不同,所以我不能对矩阵使用 hashmap。还有其他实现方式吗?

【问题讨论】:

    标签: java hashmap hashtable adjacency-list adjacency-matrix


    【解决方案1】:

    对于 n 维矩阵,您可以使用二叉树的变体。插入等时,您所做的是循环遍历维度,直到找到一片叶子。

    所以对于一个简单的二维数据集,比如 (2, 5), (10, 1), (5, 6), (3, 4) 按顺序插入,你会得到

     (2, 5)
        \
       (10, 1)
           \
          (5, 6)
            /
        (3, 4)
    

    (2, 5) 被插入到根目录。

    (10, 1) 正确,因为 10 > 2。

    (5, 6) 在 (2, 5) 的右边,因为 5 > 2。然后它在 (10, 1) 的右边,因为 6 > 1。

    (3, 4) 向右 3 > 2。然后向右 4 > 1。然后向左 3

    【讨论】:

      【解决方案2】:

      Sparse Matrices 上的维基百科页面列出了 6 个备选方案:

      • 密钥字典 (DOK)。
      • 列表列表 (LIL)
      • 坐标列表(COO)
      • 耶鲁格式
      • 压缩稀疏行(CSR 或 CRS)
      • 压缩稀疏列(CSC 或 CCS)

      另一种选择是Adjacency List

      最后,您还应该考虑将邻接矩阵表示为位图,将每个矩阵单元映射到特定位。 (典型的 JVM 将boolean[] 表示为一个机器字节数组,每个字节一个布尔值。)当您考虑 Java 哈希表和列表的空间开销时,邻接矩阵需要相当大......并且稀疏...... . 在更复杂的“稀疏”数据结构为您节省空间之前。

      【讨论】:

        【解决方案3】:

        【讨论】:

          【解决方案4】:

          尝试List<SparseIntArray>,使用ArrayList 作为List 实现,或者如果您知道大小,则使用普通数组SparseIntArray[]

          SparseIntArray 是一个来自 google android 的非常小的隔离类。

          Here is how 我利用它来表示具有常用操作的稀疏矩阵。它非常节省内存。

          【讨论】:

            猜你喜欢
            • 2015-03-19
            • 1970-01-01
            • 2021-09-22
            • 2012-05-25
            • 2018-08-12
            • 1970-01-01
            • 2017-02-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多