我目前有一种算法,它在大小为n乘m的邻接矩阵上运行。在我的算法中,我需要一次将整个行或列清零。我的实现目前是O(m)或O(n),具体取决于它是列还是行。
有没有办法在O(1)时间内将列或行归零?
答案 0 :(得分:3)
基本上这取决于您正在处理的芯片架构。对于大多数CPU来说,不可能在运行时将整个存储器清零,因此无论您的编程语言提供什么设施,每个字都需要单独的存储器操作。
如果你的内存与内存访问时间相邻,那将非常有帮助,因为刚刚访问的内存旁边的内存将被缓存,随后的访问将访问缓存,从而实现快速性能。
这样做的结果是,如果您的矩阵很大,一次将一行归零或一次归零可能会更快,而不是相反,这取决于您的数据是按列还是按列写入行。
编辑:我假设你的矩阵不是稀疏的,或者是三角形的,或者说是特殊的,因为你谈到“归零整行”。如果你知道你的矩阵基本上是空的或者某种方式适合特殊模式,你将能够以不同的方式表示你的矩阵(不是简单的nxm数组),故事会有所不同。但是如果你现在有一个nxm矩阵,那就是这种情况。
答案 1 :(得分:0)
距离指标是否是指向的图表? (在这种情况下,矩阵是对称的)。在这种情况下,您可以在整个程序中操作下三角矩阵或上三角矩阵。通过这种方式,您只需要输出一行(如果您处理上三角形,则为列)。即便如此,它也不会是一整排,平均只有一半。
答案 2 :(得分:0)
这取决于你的矩阵是如何实现的。
如果你有一个数组数组的表示,你可以指向一个共享的归零元素数组,只要你检查你不随后写它。这意味着行或列中的一个可以在O(N)中归零,并且在所有其他写操作上具有恒定成本。
你也可以有几个数组 - 一个用于行,一个用于列 - 用于缩放矩阵中的值。在其中任何一个中加零都是O(1)操作来掩盖行或列,代价是每次读取的额外处理;但是,如果这是一个常见的用例,它可能值得暂时从图中删除一个节点。它还保持矩阵的原始版本不变,因此您可以并行化算法(假设它所需的唯一操作是将所有边缘修剪成节点或从节点中删除)。