随机的力量(2) - 矩阵比较
来源:互联网 发布:sql数据库软件 编辑:程序博客网 时间:2024/05/22 09:38
上回我们看到通过随机,能够显著减少哈希冲突的例子。 今天,我们看看另一个随机发挥威力的地方。
问题: 给定三个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, C) {
for (int iter = 0; iter < K; iter++) {
r = RandomVector()
// 判断A*B*r = C*r是否成立
if(false == IsIdentical(A, B, C, r)) {
// 不满足必要条件,必定不成立
return false;
}
}
return true;
}
每次必要条件测试A*B*r = C*r的计算时间复杂度为O(N^2)。(计算A*B*r = A*(B*r)采取从右往左计算顺序)
每次测试的错误概率小于等于1/2, 那么采取Monto Carlo算法后,K次都错误的概率会下降到1/(2^K)。
综合来看,时间复杂度为O(K*N^2), 而准确概率提升到1 - 1/(2^K)
- 随机的力量(2) - 矩阵比较
- 随机的力量(1) - The power of random two choices
- 【BZOJ 2396】神奇的矩阵 矩阵+随机
- 矩阵内的随机点
- 比较常用的随机函数
- 非负矩阵分解:数学的奇妙力量
- 非负矩阵分解:数学的奇妙力量
- zz非负矩阵分解:数学的奇妙力量
- Matlab与线性代数 -- 均匀分布的随机矩阵
- Matlab与线性代数 -- 正态分布的随机矩阵
- Matlab与线性代数 -- 均匀分布的随机矩阵
- 数组随机求和比较的Java算法
- OpenCV的一些操作,如生成随机矩阵,高斯矩阵,矩阵相乘之类的
- 大卫谈学习2:习惯的力量
- 大卫谈学习2:习惯的力量
- POJ3104 Drying (二分的力量2)
- 随机生成01矩阵
- 随机颜色矩阵 matlab
- 34岁,重新开始!
- 解决浏览器缓存问题
- IName对象的理解
- 再回递归调用
- 修改查看MySQL编码格式【转载】
- 随机的力量(2) - 矩阵比较
- CentOS7配置Apache多站点VirtualHost
- Android BroadcastReceiver
- Java多线程(十)之ReentrantReadWriteLock深入分析
- 记录——《C Primer Plus (第五版)》第十章编程练习第八题
- 设计模式 一一一 装饰模式
- 乘法逆元
- java中为什么要给类使用代理?它有哪些好处?
- 对C++中string类型的总结