数据结构与算法分析:算法分析
1.数学模型
①4个重要的定义:如果存在正常数c和n使得N>=n时
,记作
,记作
当且仅当 且
有
如果 且
有
②
:f(N)是 T(N)的上界
:f(N)是T(N)的下界
③ 我们需要掌握的重要结论:
法则1:如果且
(a)
(b)
法则2:如果T(N)是一个k次多项式,
法则3:对任意常数k,。它告诉我们对数增长得非常缓慢
函数 | 名称 |
---|---|
c | 常数 |
|
对数级 |
|
对数平方根 |
N | 线性级 |
|
|
|
平方级 |
|
立方级 |
|
指数级 |
2.要分析的问题
影响着程序的运行时间的主要因素:所使用的算法以及对该算法的输入
①输入的大小
:最坏情况下的运行时间(通常情况,以这个为判别算法好坏的标准)
:平均运行时间
②最大的子序列和问题:
给定整数,
·····,
(可能有负数),求
的最大值。
3.运行时间的计算
①一般法则:从内向外展开(基本策略)
for循环:一次for循环的时间至多是该for循环内语句的运行时间乘以迭代的次数
嵌套的for循环:从里向外分析这些循环,运行时间为该语句的运行时间乘以改组所有for循环的大小的乘积
顺序语句:各语句的运行时间求和
if/else语句:不超过判断再加上if中的语句和else中语句中运行时间最长者的总的运行时间
②一个例子:
long int Fib(int N){if(N<=1)return 1;elseretrun Fib(n-1)+Fib(n-2);}
的运行时间公式:
可见这个程序的运行时间以指数的速度增长:注意在调用Fib(n-1)实际上计算了Fib(n-2)。这个信息被抛弃在第二次调用时又重新计算了一遍。
“计算任何事情不要超过一次”
③最大子序列和问题的解
算法1:穷举地尝试所有的可能
int MaxSequenceSum(const int A[],int N){int ThisSum,MaxSum,i,j,k;MaxSum=0;for(i=0;i<N;i++)for(j=i;j<N;j++){ ThisSum=0;for(k=i;k<=j;k++)ThisSum+=A[k];if(ThisSum>MaxSum)MaxSum=ThisSum;}return MaxSum;}
算法2:撤销一个for循环避免立方运行时间
int MaxSequenceSum(const int A[],int N){int ThisSum,MaxSum,i,j;MaxSum=0;for(i=0;i<N;i++){ThisSum=0;for(j=i;j<N;j++){ThisSum+=A[j];if(ThisSum>MaxSum)MaxSum=ThisSum;}}return MaxSum;}
算法3:“分治”的策略。把问题分成两个大致相等的子问题,然后递归地对它们求解。这是“分”的部分。“治”阶段将两个子问题的解合并在一起并可能地做少量的附加地工作
说明:递归过程的调用的一般形式是传递输入的数组以及左边界和有边界,它们界定了数组要处理的部分。
前半部分 | 后半部分 |
4 -3 5 -2 | -1 2 6 -2 |
不难得到前半部分最大子序列和为6,后半部分最大子序列和为8,横跨两部分的中间部分的最大子序列和则为11。
static int MaxSubSum(const int A[],int Left,int Right){int MaxLeftSum,MaxRightSum;int MaxLeftBorderSum,MaxRightBorderSum;int LeftBorderSum,RightBorderSum;int Center,i;/* Base Case */if(Left==Right){if(A[Left]>0)return A[left];else return 0;}Center=(Left+Right)/2;MaxLefeSum=MaxSubSum(A,Left,Center);MaxRightSum=MaxSubSum(A,Center,Right);MaxLeftBorderSum=0;LeftBorderSum=0;for(i=Center;i>=Left;i--){LeftBorderSum+=A[i];if(LeftBorderSum>MaxLeftBorderSum)MaxLeftBorderSum=LeftBorderSum;}MaxRightBorderSum=0;RightBorderSum=0;for(i=Center+1;i<=Right;i++){RightBorderSum+=A[i];if(RightBorderSum>MaxRightBorderSum)MaxRightBorderSum=RightBorderSum;}return Max3(MaxLeftSum,MaxRightSum,LeftBorderSum+RightBorderSum);/* Max3返回三者中的最大数 */
}int MaxSequenceSum(const int A[],int N){return MaxSubSum(A,0,N-1);}
得到运行时间的方程组:
解得
算法4:只对数据进行一次扫描,一旦A[i]读入并被处理,它就不再需要被记忆
int MaxSequenceMax(const int A[],int N){int ThisSum,MaxSum,j;ThisSum=MaxSum=0;for(j=0;j<N;j++){ThisSum+=A[j];if(ThisSum>MaxSum)MaxSum=ThisSum;else if(ThisSum<0)ThisSum=0;}return MaxSum;}
④运行时间中的对数
将对数最常出现的规律归纳为下列一般法则:
如果一个算法常用常数时间将问题的大小消减为其一部分,那么该算法就是
如果使用常数时间把问题减少一个常数,那么该算法就是
对分查找:
循环在High-Low=N-1开始,在High-Low>=-1时结束。每次循环后High-Low的值至少将该次循环前的值折半。于是循环的次数最多是
int BinarySearch(const ElementType A[],ElementType X,int N){int Low,Hight,Mid;Low=0;Hight=N-1;while(Low<=High){Mid=(Low+High)/2;if(A[Mid]<X)Low=Mid+1;else if([Mid]>X)High=Mid-1;else return Mid;}return NotFound;}
欧几里得算法:计算最大公因子
我们可以证明,在两次迭代后,余数最多是原始值的一半。
unsigned ind Gcd(unsigned int M,unsigned int N){unsigned int Rem;while(N>0){ Rem=M%N;M=N;N=Rem;}return M;}
定理2:
如果M>N,则M mod N < M/2;
幂运算:
计算最常见的方法就是使用N-1次乘法自乘。
long int Pow(long int X,unsigned int N){if(N==0)return 1;if(N==1)return X;if(IsEven(X)) return Pow(X*X,N/2);else return Pow(X*X,N/2)*X;}
⑤ 检验你的分析
⑥分析结果的准确性
数据结构与算法分析:算法分析相关推荐
- Java数据结构习题_算法分析
2.设T1(N)=O(f(N)),T2(N)=O(f(N)),则: T1(N)-T2(N)=o(f(N)) False,若1位2N,2为N T1(N)/T2(N)=O(1) ...
- 数据结构:(5)算法分析基础
算法时间复杂度分析 算法空间复杂度分析
- 数据结构与算法分析(C++版)(第二版)
查看书籍详细信息: 数据结构与算法分析(C++版)(第二版) 内容简介 本书采用程序员最爱用的面向对象C++语言来描述数据结构和算法,并把数据结构原理和算法分析技术有机地结合在一起,系统介绍了各种类型 ...
- 数据结构与算法(C++)-- 算法分析
数据结构与算法(C++)– 算法分析 算法分析包括:时间复杂度和空间复杂度分析.以下主要是时间复杂度的分析. 1.数学定义 O 表示前面是后面的下界,后面是前面的上界 Ω 表示前面是后面的上界,后面是 ...
- 《数据结构与算法:Python语言描述》一1.3算法和算法分析
本节书摘来自华章出版社<数据结构与算法:Python语言描述>一书中的第1章,第1.3节,作者 裘宗燕,更多章节内容可以访问云栖社区"华章计算机"公众号查看 1.3算法 ...
- python数据结构与算法40题_Python数据结构与算法分析(笔记与部分作业)
最近为了给写搬砖脚本增加一些算法知识,脑残的看起来算法书.Python数据结构与算法分析,本人英语比较差,看的是翻译版本的. 网上有免费的原版的:https://runestone.academy/r ...
- 装箱问题C语言报告,装箱问题C语言实现(算法分析).doc
装箱问题C语言实现(算法分析) 算法分析 题 目: 装箱(Bin Packing)问题 院 别: 数学与计算科学学院 专 业: 信息与计算科学 姓 名: 蒋文明 学 号: 0800710313 指导老 ...
- 数据结构及算法学习——写在前面的话
断断续续地,学过好几次了,一到困难的地方又中途放弃了,还总能找到一个好听的借口.这次又是狠下心来,准备好好学习一把,务必搞定它,这是门学科的水很深,我只取我所需,所想.本人非科班出身,没学过离散数学. ...
- 20172314 2018-2019-1《程序设计与数据结构》第一周学习总结
教材学习内容总结 概述 软件工程:是一门关于高质量软件开发的技术和理论的学科,用来控制开发过程,实现高质量的软件. 软件工程的目标:正确性.可靠性.健壮性.可用性.可维护性.可重用性.可移植性.运行效 ...
- 数据结构之线性表的基本C语言语法
一开始没做笔记,大家想看的话可以参考这里 [数据结构绪论] [数据结构(二)] [数据结构--算法和算法分析] [数据结构--渐进时间复杂度] [数据结构--初识线性表] [数据结构--线性表的顺序实 ...
最新文章
- abc类计算机,计算机科学ABC类会议分类表
- metasploit msfvenom使用实例
- 给FreeBSD加上了防火墙
- python画一束花_用python画一朵玫瑰花,拿去表白趴-Go语言中文社区
- c语言股票最大收益_金斧子股票配资:股票配资的时候有哪些事项需要注意呢...
- Tomcat Filter 源码分析
- 表单验证的初步实现和省市级联
- java netty socket_Netty对socket的抽象
- Linux平台下卸载ORACLE
- 转载 分布式协调技术 分布式锁
- 结构力学用计算机算的优势和不足,计算结构力学
- 自然语言处理之分词、命名主体识别、词性、语法分析-stanfordcorenlp-NER(二)
- 关于打印机状态的获取
- HeartBeat的一些介绍和功能上的一些总结
- Viddy排名App Store免费应用第二,力压InstagramDraw Sth
- 【渝粤教育】国家开放大学2018年秋季 1326T社区护理学(本) 参考试题
- dcos -1.7 都有哪些服务
- leetcode Revert Binary Tree
- img 图片 下边距 解决办法
- unity 字体添加边框颜色