计算机性能
比性能更重要的是?
正确性、简介、可维护性、稳定性、健壮性、特性、功能性、模块化、安全、可扩展性、用户体验
性能的重要性?
性能的好与坏直接决定着可行、不可行。比如实时数据
有趣,我们向往速度。
排序问题?
输入:a1,a2,...an
输出:a1`<=a2`<=...<=an`
插入排序
算法复杂度 θ(n^2)
伪代码
INSERTION SORT A[1,2,3... n]
for j <- 2 to n
do key <- A[j]
i <- j-1
while i>0 and A[i]>key
do A[i+1]<-A[i]
i <- i-1
A[i+1] <- key
运行时间的决定因素
已排序程度
输入规模
运行的上界
平均值 涉及到每种情况出现的概率
运行的下界
计算机的计算能力(一般用两种算法在同一台计算机上的表现)
算法的大局观
渐进分析
1.忽略掉依赖于机器的常量
2.不去检查实际的运行时间,而是关注运行时间的增长
渐进符号
θ 读作Theta
写个公式,弃去它的低阶项,并忽略前面的常数因子
归并排序
merge sort A[1,2,3... n]
1.if n = 1 ,done
2.对 A[1,2,3,..n/2] 、 A[n/2,...n] 分别排序
3.把两个排好序的表归并
20 12
13 11
7 9
2 1
先比较2和1,1比较小,则为第一个,剩下2,
2去跟9比较,2比较小,为第二个,剩下9,
9跟7比较,7比较小,为第三个,剩下9,
9跟13比较,9比较小,为第四个,剩下13,
13跟11比较,11比较小,为第五个,剩下13,
13跟12比较,12比较小,为第六个,剩下13,
13跟20比较,13比较小,为第七个,剩下20,
20为最后一个,为第八个。
每一次比较只关注两个元素,挑出最小的,再把数组指针推进一位。
把两个表归并的时间为θ(n).
总时间T(n) = T(1,2,..N/2) + T(n/2,...n) + θ(n) (n>1)
T(n) = 2T(N/2) + θ(n) (n>1)
递归树
T(n) = 2T(n/2) + cn (用cn显式函数替换了隐式的θ(n) )
时间复杂度T(n)= θ(nlgn)
比性能更重要的是?
正确性、简介、可维护性、稳定性、健壮性、特性、功能性、模块化、安全、可扩展性、用户体验
性能的重要性?
性能的好与坏直接决定着可行、不可行。比如实时数据
有趣,我们向往速度。
排序问题?
输入:a1,a2,...an
输出:a1`<=a2`<=...<=an`
插入排序
算法复杂度 θ(n^2)
伪代码
INSERTION SORT A[1,2,3... n]
for j <- 2 to n
do key <- A[j]
i <- j-1
while i>0 and A[i]>key
do A[i+1]<-A[i]
i <- i-1
A[i+1] <- key
运行时间的决定因素
已排序程度
输入规模
运行的上界
平均值 涉及到每种情况出现的概率
运行的下界
计算机的计算能力(一般用两种算法在同一台计算机上的表现)
算法的大局观
渐进分析
1.忽略掉依赖于机器的常量
2.不去检查实际的运行时间,而是关注运行时间的增长
渐进符号
θ 读作Theta
写个公式,弃去它的低阶项,并忽略前面的常数因子
归并排序
merge sort A[1,2,3... n]
1.if n = 1 ,done
2.对 A[1,2,3,..n/2] 、 A[n/2,...n] 分别排序
3.把两个排好序的表归并
20 12
13 11
7 9
2 1
先比较2和1,1比较小,则为第一个,剩下2,
2去跟9比较,2比较小,为第二个,剩下9,
9跟7比较,7比较小,为第三个,剩下9,
9跟13比较,9比较小,为第四个,剩下13,
13跟11比较,11比较小,为第五个,剩下13,
13跟12比较,12比较小,为第六个,剩下13,
13跟20比较,13比较小,为第七个,剩下20,
20为最后一个,为第八个。
每一次比较只关注两个元素,挑出最小的,再把数组指针推进一位。
把两个表归并的时间为θ(n).
总时间T(n) = T(1,2,..N/2) + T(n/2,...n) + θ(n) (n>1)
T(n) = 2T(N/2) + θ(n) (n>1)
递归树
T(n) = 2T(n/2) + cn (用cn显式函数替换了隐式的θ(n) )
时间复杂度T(n)= θ(nlgn)