2.2 算法分析
一般的,对于算法来说,重点关注的是对算法的时间和空间度量,也就是时间复杂度和空间复杂度。
算法所需要的时间与输入的规模同步增长的,而时间复杂度就是衡量算法执行的基本操作数的一个函数。
对于插入排序来说,当需要排列的数组分别为顺序排列和逆序排列时,算法的时间复杂度是不一样的。
根据算法执行的每一步,每一步所执行的次数,得出一个时间衡量函数。
顺序排列:T(n)=an+b ,为n的线性函数
逆序排列:T(n)=an^2+bn+c ,为n的二次函数
上述分别为最佳情况和最差情况,一般考察算法的最差运行时间!一般的,平均情况下的运行时间一般与最差情况一样差!
当比较不同算法的效率时,如果一个算法的最坏情况运行时间比另一个算法的低,其效率认为更高。
课后习题:
1. 因为当n很大时,可以忽略低阶项的影响。
2. 选择排序伪代码
Input:A[a1,a2,…,an]
Output: Sorted A
for i = 1:n-1
for j = i+1:n
find min of A[i:n]
end
A[i] <--> A[min]
end
循环不等式,我们选择A[1,i-1]为已经排好序的数组,而剩余的元素比这些元素大,满足循环不等式。只循环n-1是因为剩余的第n个元素已经是最大的!
当所有元素按照升序排序时,
该算法按照降序排序也一样
因此舍去低阶项,该算法的时间复杂度可以记为:
3. 当查找数组中元素的可能性相等时,平均和最坏情况下都满足线性搜索
4. 比较合理的输入使得算法可以有最佳运行时间