上回我们看到通过随机,能够显著减少哈希冲突的例子。 今天,我们看看另一个随机发挥威力的地方。
问题: 给定三个n×n矩阵A, B, C, 怎么快速判别A×B 是否等于C?
最直接的想法,当然是先进行矩阵乘法得到矩阵D = A×B,然后再一一比较矩阵C和矩阵D是否相同?
比较两个n×n矩阵是否相同的时间复杂度为O(N^2),而矩阵乘法直接算法时间复杂度是O(N^3), 目前最快的矩阵乘法的时间复杂度是O(N^2.376)。综合来看,时间复杂度接近O(N^3)。
是否存在更快的方法呢?答案是肯定的,下面我们介绍一种技术 - Freivalds技术
先来看一个A*B=C的必要条件: 对于n×1向量r, A*B*r = C*r
注意,这并不是充分条件。如果A*B*r = C*r, 并不能推导出A*B一定等于C。但如果A*B*r = C*r不成立,那么A×B=C就一定不成立。
随机产生一个n×1向量r,r[i] = 0或1,A*B*r = C*r 但A*B不等于C的概率是多大呢?
可以证明,P{A*B*r = C*r, A*B != C} <= 1/2
Freivalds技术就是基于上述的必要条件和概率估计,采用Monto Carlo算法, 算法逻辑可以参考以下伪代码。
// 判断A*B=C是否成立
bool IsIdentical(A, B,