分治法举例之矩阵乘法
前言
矩阵按定义直接实现是比较直接简单的。时间复杂度也可以直接得出来是(O(n^3))
直接实现
class matrix:
'''
为了简单起见,没有对数据做校验。
假设矩阵就是nxn的。
'''
def __init__(self, data):
if not data or not hasattr(data, '__getitem__'):
raise ValueError("data not valid! %s" % data)
self.data = data
self.rows = len(data)
self.cols = max(map(lambda row: len(row), data))
def __mul__(self, another):
if self.cols != another.rows:
raise ValueError("not valid ddata ,only support mxn * nxp")
ret = matrix([[0 for _ in range(another.cols)] for _ in range(self.rows)])
for i in range(self.rows):
for j in range(another.cols):
num = 0
for k in range(self.cols):
num += self._getitem(i, k) * another._getitem(k, j)
ret._setitem(i, j, num)
return ret
def _getitem(self, i, j):
if i >= self.rows or j >= self.cols:
raise IndexError("index out of boundary,i=%d,j=%d, %s" % (
i, j, self.data))
try:
return self.data[i][j]
except Exception:
return 0
def _setitem(self, i, j, value):
if i >= self.rows or j >= self.cols:
raise IndexError("index out of boundary,i=%d,j=%d,value=%s, %s" % (
i, j, str(value), self.data))
if j >= len(self.data[i]):
fill = self.cols - len(self.data[i])
self.data[i].extend([0 for _ in range(fill)])
self.data[i][j] = value
def __str__(self):
return "(rows:%d, cols:%d)->%s" % (self.rows, self.cols, self.data)
直接应用分治法
很简单的想法是把矩阵分成n/2的4块。于是
A*B = C
变成
[
\begin{pmatrix}
a & b