- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
第=1+1页共sectionpages11页
第一章算法基础
算法(algorithm)是什么?
一个算法是对特定问题求解步骤的一种描述,它是指令的有限序列。
算法的五个特征:
输入(input):算法有零个或多个输入量;
输出(output):算法至少产生一个输出量;
确定性(definiteness):算法的每一条指令都有确切的定义,没有二义性;
能行性(effectiveness):算法的每一条指令必须足够基本,它们可以通过已经实现的基本运算执行有限次来实现;
有穷性(finiteness):算法必须总能在执行有限步之后终止。
程序(Program)是算法用某种程序设计语言的具体实现。算法必须可终止,程序却没有这一限制。Windows是程序不是算法。
一个好的算法应具有以下4个重要特性:
正确性(correctness):算法的执行结果应当满足预先规定的功能和性能要求。
简明性(simplicity):算法应思路清晰、层次分明、容易理解、利于编码和调试。
效率(efficiency):算法应有效使用存储空间,并具有高的时间效率。
最优性(optimality):算法的执行时间已达到求解该类问题所需时间的下界。
第二章算法分析
渐近分析中函数比较
f(n)=O(g(n))≈f(n)≤g(n);(渐进上界)
f(n)=Ω(g(n))≈f(n)≥g(n);(渐进下界)
f(n)=Θ(g(n))≈f(n)=g(n);(紧渐紧界)
f(n)=o(g(n))≈f(n)g(n);(非紧渐进上界)
f(n)=ω(g(n))≈f(n)g(n).(非紧渐进下界)
传递性:都有
反身性f(n)=Θ(f(n));f(n)=O(f(n));f(n)=Ω(f(n)).,
对称性:f(n)=Θ(g(n))?g(n)=Θ(f(n)).
互对称性:f(n)=O(g(n))?g(n)=Ω(f(n));f(n)=o(g(n))?g(n)=ω(f(n));
算术运算:
O(f(n))+O(g(n))=O(max{f(n),g(n)});
O(f(n))+O(g(n))=O(f(n)+g(n));
O(f(n))*O(g(n))=O(f(n)*g(n));
O(cf(n))=O(f(n));其中c是一个正的常数;
如果g(n)=O(f(n))?则O(f(n))+O(g(n))=O(f(n))。
f=O(f)。
最常见的多项式时间算法的渐近时间复杂度
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)
最常见的指数时间算法的渐近时间复杂度
O(2n)<O(n!)<O(n^n)
求T(n)表达式:
T(n)=2T(n?1)+1
=2(2T(n?2)+1)+1
=2^2T(n?2)+2+1
=2^3T(n?3)+2^2+2+1
…
=2^(n?1)T(1)+…+2^2+2+1
=2^(n?1)+…+2^2+2+1
=2^n?1
第五章分治法
分治法的基本思想:
将一个复杂的问题分解成若干个规模较小、相互独立,但类型相同的子问题求解;然后再将各子问题的解组合成原始问题的一个完整答案。
一个问题能够用分治法求解的要素是:
1,问题能够按照某种方式分解成若干个规模较小、相互独立且与原问题类型相同的子问题;2,子问题足够小时可以直接求解;3,能够将子问题的解组合成原问题的解。
两路合并排序:
templateclassT
voidSortableListT::Merge(intleft,intmid,intright)
{T*temp=newT[right-left+1];
inti=left,j=mid+1,k=0;
while((i=mid)(j=right))
if(l[i]=l[j])temp[k++]=l[i++];
elsetemp[k++]=l[j++];
while(i=mid)temp[k++]=l[i++];
while(j=right)temp[k++]=l[j++];
for(i=0,k=left;k=right;)l[k++]=temp[i++];
}
templateclassT
voidSortableListT::MergeSort(intleft,intright)
{if(leftright)
{intmid=(left+right)/2;
MergeS
文档评论(0)