一、证明 任何以关键字比较为基础的分类算法,其最坏情况下的时间下界都为Ω(nlogn)。
用二元比较树来证明。
首先假设参加分类的n个关键字A(1),A(2),A(3),......A(n)互不相同。这样的话,任意两个关键字的比较会导致A(i)<A(j)或者A(i)大于A(j)的结果。
让我们以二元比较树来描述元素间的比较过程。
若A(i)<A(j),进入下一级的左分支。若A(i)>A(j)进入下一级的右分支。如此一直比较下去,算法会在某个外部结点终止。从根到某个外部节点的路径代表某个特定的排序序列。路径长度表示生成该序列代表的分类表(什么是分类表?)所需要的比较次数。最长的路径代表算法在最坏情况下的执行情况,该路径的长度即是算法在最坏情况下所作的比较次数。
所以,以比较为基础的分类算法的最坏情况下界等于该算法对应的比较树的最小高度(最小?)。
1.由于n个关键字有n!种可能的排序,所以二元比较树中将有n!个外部节点,每种排列对应于某种特定输入情况下的分类情况(比如你要分类1,2,3这三个数字,因为你会有6种可能的输入情况123,132,213,231,321,312),二元比较树中就会有6个外部节点)。
2.设一棵二元比较树的所有内节点的级数均小于或等于k,则该树中最多有2的k次方个外结点(这举个例子就可以看出来,比如k=3,内节点到第三级的话,最多也就7个内节点,那么它的下一级最多就8个,是2的3次方)。
记算法在最坏情况下所作的比较次数为T(n),则有T(n)=k,k为确定一种排列所需的比较次数。
根据1和2的分析,就有:n!<=2^T(n)。n!是外部结点个数,内节点所在的最后一层如果是满的,有n!=2^T(n),如果不满,有n!<2^T(n)。(不知我表达的是否清楚)。
化简:
当n>1时,有n!≥n(n-1)(n-2)…( n/2上取整 )≥(n/2)^n/2。
当n≥4时,有 2^T(n) ≥n! ≥(n/2)^(n/2)。
两边取对数log,T(n)≥(n/2)log(n/2)≥(n/4)logn。
所以,任何以比较为基础的分类算法的最坏情况的时间下界为: Ω(nlogn)。
总结:1是要知道n个关键字有n!个外部节点。2是要知道n!<2^T(n),T(n)=k,内节点的级数均小于或者等于k。用n!<2^T(n)进行缩放处理就可以得到结果。
二、证明 以比较为基础的有序检索问题最坏情况的时间下界FIND(n)>=log(n+1)上取整。
证明:从模拟求解检索问题算法的比较树可知,FIND(n)不大于树中从根到一个叶子的最长距离。而所有树中必定有n个内节点和x在A中的n种可能的出现相对应。如果一棵二元树的所有内节点所在的级数小于或等于k,则最多有(2^k)-1个内节点,故n<=(2^k)-1,也就是FIND(n)=k>=log(n+1)上取整。
总结:首先说明FIND(n)不会大于树中从根到叶子的最长距离,然后说明树中有n个结点和x的n种情况相对应,其次假设二元树二元树内节点级数小于等于k,得到最多2的k次方-1个内节点,所以n小于等于2的k次方-1,解出k。
三、斯特拉森矩阵乘法的思想和时间复杂度分析。
在谈论斯塔拉森矩阵乘法之前,我们先看看别的。
最基础的两个n乘n阶的矩阵A和B的乘积是另一个n乘n阶矩阵C,C的元素为 C(i, j)=∑kA(i, k)B(k, j),假如每一个C(i,j)都用这个公式计算的话,则每计算C的一个元素C【i】【j】,需要做n次乘法和n-1次加法。计算整个C矩阵需要的运算次数为n的三次方次乘法(整个矩阵有n的平方个元素,每个元素需要做n次乘法,n-1次加法,所以是n的三次方和n的平方乘(n-1)。
其次,我们来看看用分治法处理矩阵乘法。 2×2分块矩阵乘法:
abcd是A的n/2阶子矩阵,efgh是B的n/2阶子矩阵。这样的话,求解C矩阵的问题就变成了8个n/2阶子矩阵的乘法和4个n/2阶矩阵加法。
分治法得到的时间复杂度分析为:
T(n)=8T(n/2)+dn^2(dn^2是4个(n/2)阶矩阵加法的计算时间。)然后怎么得到的n^loga=n^log8=n^3 ⇒T(n)=Θ(n^3)???反正就是分治法没有得到好处。没有因为分治法使得复杂度降低。
接下来我们看看斯特拉森矩阵的思想。2*2阶矩阵相乘可以使用7次乘法就能得到结果。所以仅需要7次递归调用。
斯特拉森算法计算的是以下7个n/2阶矩阵P1-----P7:
得到这七个矩阵之后,就用8次(n/2)阶矩阵加/减法得到乘积矩阵C
比如求r,r = P5+P4–P2+P6 =(a+d)(e+h)+d (g–e)–(a+b)h+(b–d)(g+h) =ae+ah+de+dh+dg–de–ah–bh +bg+bh–dg–dh=ae+bg。
让我们来看看这种方法的时间复杂度分析:T(n)=7T(n/2)+an^2 n>2.
这里为什么是7T(n/2)呢?因为相乘的那两个n阶矩阵被分解成了8个n/2阶矩阵,我们用斯特拉森矩阵的办法需要用这8个矩阵来算出上述P1到P7这7个n/2阶矩阵,再用这7个矩阵进行加减运算得到原矩阵。这7个n/2阶矩阵如果不能直接求出,还需要用斯特拉森算法进一步把每个n/2阶矩阵分成n/4阶矩阵。所以是7T(n)。an^2代表把7个矩阵加减运算的时间。(我的表达能力目前就到这里了。。。)
我们来求解T(n)=7T(n/2)+an^2 n>2.这个递推公式,可以得到
T(n)=an^2(1+7/4+(7/4)^2+….+(7/4)^(k-1))+7^kT(1)
≤cn2(7/4)logn+7logn
=cn^(log4+log7-log4)+n^log7
=(c+1)n^log7=O(n^log7)
约等于 O(n^2.81)
在斯特拉森矩阵之后,又有许多算法改进了矩阵乘法的计算时间复杂性。目前最好的计算时间上界是 O(n2.376)。