【问题标题】:Representation of binary matrix with space complexity of O(n)空间复杂度为 O(n) 的二进制矩阵的表示
【发布时间】:2017-06-18 23:21:56
【问题描述】:

我有 nxn 个二进制矩阵(即元素为 0 或 1 的矩阵)。使用二维数组(即存储每个元素的值)空间复杂度为O(n^2)。

有没有办法以空间复杂度为 O(n) 的方式存储它们?欢迎所有运算,如加法、减法等。

矩阵不是稀疏的,所以使用非零元素列表是没有问题的。

【问题讨论】:

  • 问题是如何在 O(n) 空间中存储 n^2 位?一般情况下是不可能的。
  • 如果矩阵是对称的,那么它可以有点完成。除此之外,唯一的途径是无法保证目标大小的压缩算法。
  • 那么我的“没有办法做到这一点”的答案是什么?它是经过数学证明、直观证明、常识,还是只是没有人想出办法做到这一点?
  • @LukeBriggs 对称矩阵有什么不同?。
  • @MuhammadNizami "数学证明,直觉证明,常识" 是的,三个都行:)。

标签: algorithm matrix data-structures


【解决方案1】:

我认为它不能保证你有 O(n) 空间,但你可以寻找一种称为 LZW (Lempel-Ziv-Welch) 的压缩算法。

它的代码非常简单,很容易理解它为什么以及如何工作,它应该非常适用于二进制数组,并且你的矩阵越大,压缩率就越好。


不管怎样,如果你知道一些关于矩阵的信息,你可以尝试在一个数组中表示它,你可以通过某种方式恢复它,例如:

如果你的矩阵是 32x32 维度,你可以得到它的任何一行并表示为一个 int,所以整行将变成一个数字,你可能有你的 O(n)

【讨论】:

    【解决方案2】:

    第一个proofn*n 位矩阵具有n*n 状态。但是,对于 n 位字符串,您只能存储 n 个状态。因此,除非n>=n*n(例如 n=1),否则无法在 n 位序列中编码n*n 位。

    第二个proof,不那么抽象但也不那么完整: 想象一下,你有一个 256 位的 16*16 矩阵,并且设法将它存储在 16 位中。 现在,当然,您可以使用您的算法将这 16 位存储在 4x4 矩阵中,得到 4 位。现在您将 4 位存储在 2x2 矩阵中并将它们压缩为 2 位。 --> 从本质上讲,这样的算法将能够将任何可以想象的数据量压缩为 2 位。虽然这不是一个实际的证明,但很明显这样的算法不存在。

    【讨论】:

      【解决方案3】:

      不,您不能在 O(n) 空间中存储 n x n 二进制矩阵。 证明只是pigeonhole principle

      假设您设计了一种存储任意 n x n 二进制矩阵的方法。 这种大小的二进制矩阵有 2n x n 个可能。 如果您使用 k 位进行存储,则您的存储可能有 2k 个内容。 现在,如果 k k nxn,根据鸽巢原理,存在两个不同的矩阵(例如,A 和 B),它们存储同样的方式(比如,X 被存储)。 因此,当您存储了 X 时,您不能说您实际打算存储的矩阵是 A 还是 B(或者可能是其他一些矩阵)。 因此,您无法将存储唯一地解码回存储矩阵的形式,这破坏了存储它的整个目的。

      【讨论】:

        猜你喜欢
        • 2015-05-25
        • 2021-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 2020-12-14
        相关资源
        最近更新 更多