随笔分类 - 算法数据结构
摘要:其先序序列的第一个元素为根节点,接下来即为其左子树先序遍历序列,紧跟着是右子树先序遍历序列,故根节点已可从先序序列中分离。在中序序列中找到确定的根节点,根据中序遍历特性,在巾序序列中,根节点前面的序列即为左子树的中序遍历序列,根节点后面的即为右子树的中序遍历序列。由左右子树的中序序列长度,在该二叉树的先序序列中即可找到左右子树的先序序列的分界点,从而得到二叉树的左右子树的先序序列。递归实现:递归函数输入:二叉树的先序序列和中序序列;返回-、建好的二叉树的根节点。算法思想:1)若二叉树空,返回空;2)若不空,取先序序列第一个元素,建立根节点;3)在中序序列中查找根节点,以此确定左右子树的先序序列
阅读全文
摘要:Strassen矩阵乘法矩阵乘法是线性代数中最常见的运算之一,它在数值计算中有广泛的应用。若A和B是2个n×n的矩阵,则它们的乘积C=AB同样是一个n×n的矩阵。A和B的乘积矩阵C中的元素C[i,j]定义为: 若依此定义来计算A和B的乘积矩阵C,则每计算C的一个元素C[i,j],需要做n个乘法和n-1次加法。因此,求出矩阵C的n2个元素所需的计算时间为0(n3)。60年代末,Strassen采用了类似于在大整数乘法中用过的分治技术,将计算2个n阶矩阵乘积所需的计算时间改进到O(nlog7)=O(n2.18)。首先,我们还是需要假设n是2的幂。将矩阵A,B和C中每一矩阵都分块
阅读全文
摘要:对于矩阵乘法 C = A × B,通常的做法是将矩阵进行分块相乘,如下图所示:从上图可以看出这种分块相乘总共用了8次乘法,当然对于子矩阵相乘(如A0×B0),还可以继续递归使用分块相乘。对于中小矩阵来说,很适合使用这种分块乘法,但是对于大矩阵来说,递归的次数较多,如果能减少每次分块乘法的次数,那么性能将可以得到很好的提高。Strassen矩阵乘法就是采用了一个简单的运算技巧,将上面的8次矩阵相乘变成了7次乘法,看别小看这减少的1次乘法,因为每递归1次,性能就提高了1/8,比如对于1024*1024的矩阵,第1次先分解成7次512*512的矩阵相乘,对于512*512的矩阵,
阅读全文