下个月开始要从事服务器工作了,于是捡起一些CS的基础课,巩固一下原先的知识。
先从算法开始,配合网易的公开课,传送门。
第一课介绍了两种排序算法,插入和归并。
1. 影响运行时间的因素:
·输入(比如已经排序好的输入)
·输入规模(输入6个数或输入6X10^9)
-将输入规模参数化
·运行时间的上限
-对用户的保证(比如运行时间少于3秒,这就是一个用户如何使用该程序的真实信息)
2.算法分析:
·最坏情况分析
-T(n)定义为输入规模n的最长运行时间
·平均消耗时间:
-T(n)此时定义为输入规模n的期望时间
3.渐近分析(Asymptotic analysis),即时间复杂度
·忽略硬件因素
·不关注实际运行了多少时间,而是关注了增长 (T(n), n->∞)
·Θ符号(即O(n)的O)代表忽略低阶项
特例:
如图有时候我们会对O(n^3)的算法感兴趣,因为n0可能是一个非常大的数,大到计算机无法处理,这时O(n^3)的算法就比O(n^2)的更优
4.插入算法和归并算法时间复杂度比较,并推导归并算法时间复杂度:
·插入排序分析
-最坏情况:O(n^2) 算术级数
-插入排序快吗: 规模n足够小时,比较快;但是规模n变大后就很慢了。
·归并算法分析:
-具体算法:
a.如果n为1,则结束排序 O(1)
b.递归操作,划分元素: 前一半元素 1到Ceil(n/2) 后一半元素 Ceil(n/2) + 1到n 2T(n/2)
c.合并当前两组元素:顺序或逆序比较两张表的元素大小,放入最后的结果表中 O(n)
-推导
T(n) = O(1) if n =1; 2T(n/2) + O(n) if n > 1
递归树:
解读:
a.每一层都是线性复杂度c*n
b.树的高度为lgn (n折半到1,复杂度lgn)
c.所有叶子节点的时间复杂度O(n)
d.总时间复杂度为 T(n) = (c*n)*lgn + O(n) 省略低阶项O(n)即为O(n*lgn)