写简历的时候,填写学过的课程,随手就写下了算法设计与分析,从来没想过为什么要起这么个名字。算法设计是给出算法的本质和设计流程,算法分析我只会几个大o,其他就不知道了。任何学科任何方向,当涉及到对一个研究对象进行评估的时候,就会出现各种各样的评估方案,即使是在算法上,即使是在每次选择题只能选几个大o的问题上。
给定一个归并排序,首先分解,分解到最底层,排序,之后归并;在平均情况和最坏情况下的时间复杂度都是O(nlogn)。首先看下这个算法的具体过程:对于一个含有n个元素的数组,给出递归树应该有 logn层,假设叶子节点是一对元素,经过一次比较就可以排好顺序。
mergesort(datalist &L)
{
datalist l1=left(l)
datalist l2=right(l)
return merge(mergesort(l1),mergesort(l2)
}
其中merge()需要o(n); 根据算法思路可以看出
T(n)=cn+2T(n/2)
T(1)=1
可以推出 o(nlogn)
或者画一个递归树,然后从叶子节点开始累加比较次数,每一层的节点数*一组merge节点的耗时,也可以得出同样结论
由于归并不存在随机选取(快速排序中的随机选择一个pivot),所以和数据初始状态无关,和过程选取无关,最好最坏最平均都是差不多的性能。
快速排序
quicksort(list)
{ partition((list)
quicksort(leftlist)
quicksort(rightsort)
}
在归并排序中,是近似等分两边子数组,然后在快排中,是否等分是个未知数,因此就存在了平均和最差性能的差异
算法分析一般分为概率分析 摊销分析 竞争分析
概率分析 以输入为变量,在不清楚输入的情况下,假设服从一定分布,然后分析完成任务的概率,算法的时间复杂度 空间复杂度等性能
摊销分析
和理解的平均分析还不一样,摊销分析更灵活一点,聚类分析:考虑综合消耗后,除以变量长度; 会计分析:可以积累消耗,以备后用;势能分析;摊销分析中主要考虑多次执行算法,但是和概率无关,而是从多次间的联系入手,利用限制条件 等降低消耗上限
竞争分析 给出了离线算法和在线算法的概念,通过和离线的最优算法比较,做出最佳策略,关注与最优间的差值,而不是自身从无到有的几个消耗过程。
待续