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;}

⑤ 检验你的分析

⑥分析结果的准确性

数据结构与算法分析:算法分析相关推荐

  1. 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)     ...

  2. 数据结构:(5)算法分析基础

    算法时间复杂度分析 算法空间复杂度分析

  3. 数据结构与算法分析(C++版)(第二版)

    查看书籍详细信息: 数据结构与算法分析(C++版)(第二版) 内容简介 本书采用程序员最爱用的面向对象C++语言来描述数据结构和算法,并把数据结构原理和算法分析技术有机地结合在一起,系统介绍了各种类型 ...

  4. 数据结构与算法(C++)-- 算法分析

    数据结构与算法(C++)– 算法分析 算法分析包括:时间复杂度和空间复杂度分析.以下主要是时间复杂度的分析. 1.数学定义 O 表示前面是后面的下界,后面是前面的上界 Ω 表示前面是后面的上界,后面是 ...

  5. 《数据结构与算法:Python语言描述》一1.3算法和算法分析

    本节书摘来自华章出版社<数据结构与算法:Python语言描述>一书中的第1章,第1.3节,作者 裘宗燕,更多章节内容可以访问云栖社区"华章计算机"公众号查看 1.3算法 ...

  6. python数据结构与算法40题_Python数据结构与算法分析(笔记与部分作业)

    最近为了给写搬砖脚本增加一些算法知识,脑残的看起来算法书.Python数据结构与算法分析,本人英语比较差,看的是翻译版本的. 网上有免费的原版的:https://runestone.academy/r ...

  7. 装箱问题C语言报告,装箱问题C语言实现(算法分析).doc

    装箱问题C语言实现(算法分析) 算法分析 题 目: 装箱(Bin Packing)问题 院 别: 数学与计算科学学院 专 业: 信息与计算科学 姓 名: 蒋文明 学 号: 0800710313 指导老 ...

  8. 数据结构及算法学习——写在前面的话

    断断续续地,学过好几次了,一到困难的地方又中途放弃了,还总能找到一个好听的借口.这次又是狠下心来,准备好好学习一把,务必搞定它,这是门学科的水很深,我只取我所需,所想.本人非科班出身,没学过离散数学. ...

  9. 20172314 2018-2019-1《程序设计与数据结构》第一周学习总结

    教材学习内容总结 概述 软件工程:是一门关于高质量软件开发的技术和理论的学科,用来控制开发过程,实现高质量的软件. 软件工程的目标:正确性.可靠性.健壮性.可用性.可维护性.可重用性.可移植性.运行效 ...

  10. 数据结构之线性表的基本C语言语法

    一开始没做笔记,大家想看的话可以参考这里 [数据结构绪论] [数据结构(二)] [数据结构--算法和算法分析] [数据结构--渐进时间复杂度] [数据结构--初识线性表] [数据结构--线性表的顺序实 ...

最新文章

  1. abc类计算机,计算机科学ABC类会议分类表
  2. metasploit msfvenom使用实例
  3. 给FreeBSD加上了防火墙
  4. python画一束花_用python画一朵玫瑰花,拿去表白趴-Go语言中文社区
  5. c语言股票最大收益_金斧子股票配资:股票配资的时候有哪些事项需要注意呢...
  6. Tomcat Filter 源码分析
  7. 表单验证的初步实现和省市级联
  8. java netty socket_Netty对socket的抽象
  9. Linux平台下卸载ORACLE
  10. 转载 分布式协调技术 分布式锁
  11. 结构力学用计算机算的优势和不足,计算结构力学
  12. 自然语言处理之分词、命名主体识别、词性、语法分析-stanfordcorenlp-NER(二)
  13. 关于打印机状态的获取
  14. HeartBeat的一些介绍和功能上的一些总结
  15. Viddy排名App Store免费应用第二,力压InstagramDraw Sth
  16. 【渝粤教育】国家开放大学2018年秋季 1326T社区护理学(本) 参考试题
  17. dcos -1.7 都有哪些服务
  18. leetcode Revert Binary Tree
  19. img 图片 下边距 解决办法
  20. unity 字体添加边框颜色

热门文章

  1. Linux 添加管理员用户
  2. imx6q 转换LVDS为VGA输出
  3. 远程办公:常用的远程协助软件,你都知道吗?
  4. 74HC595在【8x8LED点阵】中的运用
  5. react 使用iconfont 图标
  6. 四川师范大学地信概论(3- 空间数据模型)90分以上版本
  7. 国自然的技术路线图?用PPT试试
  8. 土建中级工程师考试用书电子版_湖南土建中级职称教材1.pdf
  9. Proteus器件查找
  10. 读书笔记:程序员的工具箱之“代码片段”