使用哈希表在Java中构建稀疏矩阵?

时间:2011-04-25 22:23:17

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

在我的项目中,我正在尝试为图形构建邻接矩阵,出于空间和时间的考虑,我们应该使用稀疏矩阵,根据我的理解,它最容易使用散列图完成。不幸的是,我们还必须实现一个邻接列表,我用所述hashmap实现,并且因为我们的邻接矩阵必须在结构上不同,所以我不能使用hashmap作为矩阵。有没有其他方法可以实现一个?

4 个答案:

答案 0 :(得分: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>然后它在(10,1)的右边,因为6> 1。

(3,4)右3> 2.然后右4>然后离开3< 5。

答案 1 :(得分:1)

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

  • 键字典(DOK)。
  • 清单清单(LIL)
  • 协调列表(COO)
  • 耶鲁格式
  • 压缩稀疏行(CSR或CRS)
  • 压缩稀疏列(CSC或CCS)

另一种选择是Adjacency List

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

答案 2 :(得分:0)

答案 3 :(得分:0)

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

SparseIntArray是Google android的一个非常小的隔离类。

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