第2章 算法分析原理
2.1 函数增长类型(2013.7.23)
函数增长类型分为以下类型:
2.1.1 1(常数关系) :
大部分程序的大部分指令执行一次,或者至多执行多次。如果程序的所有指令都具有该性质,我们就说程序的运行时间为常数。
具有该时间复杂度的算法有:
l 基于键值索引的搜索算法,
l Hash法的理想情况。
2.1.2 logN(对数关系) :
当程序的运行时间具有对数属性时,则程序运行时间增长比N增长稍慢一些。将一个大问题转换成一系列小问题,每一步都把问题规模分解为恒定的小部分,这样的程序通常具有这种运行时间。
具有该时间复杂度的算法有:
l 对有序序列进行二分查找,
l 在堆中插入或者删除一个元素,
l BST(二叉搜索树)、随机BST或者分裂BST中搜索、插入或者删除某一个元素,
l 2-3-4树、红黑树、B树中搜索、插入、删除一个元素,
l 位搜索树、trie或者p-trie中搜索、插入、删除一个元素。
2.1.3 N(线性关系) :
当程序的运行时间为线性时,一般情况是,对每个输入元素只进行少量的处理。N等于106,运行时间也是这么多。只要N加倍, 运行时间也加倍。这种情况对于必须处理N个输入(或生成N个输出)的算法最理想。
具有该时间复杂度的算法有:
l 一般循环遍历算法(顺序搜索算法),
l 基于键值索引的计数排序算法(这个好像是我见到的唯一一种O(n)级别的排序算法,但是由于该算法对输入数据的大小敏感并且空间负责度也为O(n),所以不能普遍使用)。
2.1.4 NlogN (线性对数关系linearithmic):
当问题分解成较小的子问题,每个子问题独立解决,然后再综合这些解决方案时,解决此类问题的算法就具有NlogN运行时间。当N等于106时,NlogN约为2 * 107,当N加倍时,运行时间比其倍数更大( 但不会大很多)。
具有该时间复杂度的算法有:
l 希尔排序(Nlog2N):因为当N很大时Nlog2N更接近于NlogN而不是N2。
l 快速排序(一般情况),
l 归并排序,
l 堆排序,
l 基数排序、MSD基数排序、LSD基数排序,
l 二叉排序树。
l 求第K个最大或者最小值(时间复杂度为O(KlogN))
l 创建搜索树,例如:BST、分裂BST、随即BST、2-3-4树、红黑树、位搜索树,trie树,p-trie树,B树。
2.1.5 N2(平方关系) :
当算法的运行时间为二次性时,该算法只对相对较小的问题实用。处理所有数据项对的算法具有二次性运行时间(大概位于双重嵌套的循环中)。当N等于1000时,运行时间为106。只要N加倍,运行时间久增加4倍。
具有该时间复杂度的算法有:
l 插入排序,
l 选择排序,
l 冒泡排序。
2.1.6 N3(立方关系) :
与N2相似,处理三次方数据项的算法具有立方性运行时间(大概处于三层嵌套的循环中),这种算法只对于小问题实用。当N为100,运行时间为106。N加倍,运行时间增加到8倍。
具有该时间复杂度的算法有:
l
2.1.7 2N(指数关系):
具有指数关系运行时间的少数算法适合于实际应用,尽管这种算法是在使用蛮力手法解决问题时自然得出来的。当N等于20时,运行时间为106。N加倍,运行时间增加到原值平方!
具有该时间复杂度的算法有:
2.2 基本递推式
2.2.1 当程序循环遍历输入删除某个项,就会用到如下公式
CN = CN – 1 + N ,其中 N >= 2, C1 = 1
求解:CN约等于N2/2
适合于该递推式的算法有:
2.2.2 用一个步骤来对分输入的递归程序中用到递推式
CN = CN/2 + 1, 其中 N >=2,C1 = 1
求解:CN约等于lgN。
适合于该递推式的算法有:
l BST插入、BST查找、BST删除、BST合并,
2.2.3 对分输入,但也许必须检查输入中的每一项的递归程序要用如下递推式
CN = CN/2 + N ,其中 N >= 2,C1 = 0
求解:CN约等于2N。
l 适合于该递推式的算法有:
2.2.4 在等分输入之前,之中或之后,必须线性遍历输入的递归程序要用到如下递推公式
CN = 2CN/2 + N, 其中N>= 2,C1 = 0
求解:CN约等于NlgN。
l 适合于该递推式的算法有:
2.2.5 等分输入,然后执行其他定量工作的递归程序适用如下递推公式
CN = 2CN/2 + 1,其中N >= 2,C1 = 0
求解:CN约等于2N。
l 适合于该递推式的算法有:
参考文献:《C算法第一卷》