最小化稀疏矩阵空间复杂度的算法?

时间:2009-10-23 20:07:09

标签: algorithm sparse-matrix

当在计算机上存储和操作稀疏矩阵(零和1)时,使用利用矩阵稀疏结构的专用算法和数据结构是有益的并且经常是必要的。使用标准矩阵结构和算​​法的操作很慢,并且在应用于大型稀疏矩阵时会消耗大量内存。稀疏数据本质上很容易压缩,这种压缩几乎总是导致内存使用量大大减少。

您将获得一个二维矩阵,其中行数是预先知道的(您可以选择30-256之间的任何数字)。列数非常非常大。你可以想到10个 6 列。每列恰好有1个值。

编写一种算法,最大限度地减少此矩阵的空间复杂度。您可以显示算法的工作方式,甚至可以编写程序。

4 个答案:

答案 0 :(得分:2)

提示(因为这是用于作业):每列只包含一个带“1”的字段,因此对于每个列,应该足以存储这种情况的行。现在考虑一种存储这些信息的好方法,考虑到行数是< = 256。

答案 1 :(得分:0)

稀疏矩阵在CS中以两种不同的方式存储。相邻矩阵或相邻列表: 我想你想要使用Matrices, 所以我们有几个选择: CSR,Jagged Diagonals,CSC等等: 推荐维基百科来学习算法。 它基本上将Matrix分解为3个不同的1-d阵列。

答案 2 :(得分:0)

我写了一个简单的算法来最小化表示稀疏矩阵所需的空间,我想你可能会发现它很有用:)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace sparse_matrix
{
    class Program
    {
        static void Main(string[] args)
        {
            /*
             * In this algorithm I store all the Sparse Matrix into single diminsion matrix of type byte, each row
             * in this matrix has a number that represent the position of the "1" in the original Sparse matrix.
             * By this way, I save a lot of space... and store the same matrix with the minimum space(I could reach)
             * Since I treat the digits as bits, and stored them into the byte, since the biggest number I will reach
             * will not exceed 255 bit.
             * I read about the byte data type from here:(http://msdn.microsoft.com/en-us/library/5bdb6693.aspx)
             * In this program, I run it on a (3 * 3) matrix, however it can work the same for (255 * 10^6)
             */
            int matrixRows = 3;
            int matrixColumns = 3;
            int[,] matrix;
            matrix = new int[matrixRows, matrixColumns];
            matrix[0, 0] = 0;
            matrix[1, 0] = 0;
            matrix[2, 0] = 1;
            matrix[0, 1] = 1;
            matrix[1, 1] = 0;
            matrix[2, 1] = 0;
            matrix[0, 2] = 0;
            matrix[1, 2] = 1;
            matrix[2, 2] = 0;

            byte []x = new byte [matrixColumns];
            Console.WriteLine("The Original Sparse Matrix:\n");

            for (int i = 0; i != matrixColumns; i++)
            {
                for (int j = 0; j != matrixRows; j++)
                {
                    if (matrix[j, i] == 1)
                    {                        
                        x[i] = (byte)j;
                    }
                    Console.Write(matrix[i, j] + " ");
                }
                Console.WriteLine();
                Console.WriteLine();
            }
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("The new representation for the Sparse matrix:\n");
            for (int k = 0; k != matrixColumns; k++)
            {
                Console.WriteLine(x[k] + "\n");
            }
        }
    }
}

我很乐意收到您的任何反馈。

答案 3 :(得分:0)

您正在处理严重受限制的问题,远远超出您看到的“常规”稀疏矩阵(例如)finite element code。特别是,可以利用这些项目,大多数时候人们都不能:

  1. 行数是,你可以选择它。
  2. 矩阵的任何单元格中出现的数字为1或0.
  3. 每列包含1且仅有1个非零值。
  4. 让我在这里暂停说这个矩阵出现在 close 这个表格的一个非常常见的情况:a permutation matrix,但在这些情况下,它总是一个方阵(相同的行数)作为专栏)。

    这是一个非常基本的压缩方案,易于实现,并且很容易记下存储大小 N x M (矩阵所需的确切字节数em> N 行, M 列)。设 N = 256,这意味着我们可以将一个行表示为0-255之间的数字,这正是一个无符号的8位数。将矩阵存储为1x M 无符号8位(1字节)整数数组,其中索引 i 的值是包含列中值1的行号EM> I 的。没有理由存储值本身(因为它始终为1),并且不需要显式存储列号,因为我们将其表示为数组索引。

    假设“密集”NxM矩阵存储4字节整数。这样的矩阵需要N * M * 4字节的存储器。使用我描述的压缩,它只需要M个字节的内存,如上所述是原始内存的1/1024!