算法设计与分析——算法分析基础

article/2025/10/28 17:58:27

算法分析主要是时间复杂度和空间复杂度的两个方面的分析

此处带着问题小预告一把:

时间复杂度?空间复杂度?

大O、大\Omega和大\Theta分别表示什么?

如何得到递归方程?如何求解递归方程呢?

带着问题来探索吧~

目录

算法分析主要是时间复杂度和空间复杂度的两个方面的分析

一、时间复杂度分析

1.事后实验统计法——编写算法对应程序,统计其执行时间

2.事前分析估算法——渐近分析法(重点)

3.大O符号——渐近上界记号

4.大Ω符号——渐近下界记号

5.大​符号——渐近紧界记号

6.渐近记号性质

重要结论:

 二、渐近空间复杂度分析

 定义:

 三、递归算法复杂度分析

1.  建立递归方程

2.  求解该递归方程

一、时间复杂度分析

1.事后实验统计法——编写算法对应程序,统计其执行时间

利用计算机内的计时功能,编写算法对应程序,统计其执行时间。

对硬件、软件环境依赖强,不同的电脑设备对同一算法程序所得结果可能有一些偏差。

同一个算法不同的语言不同的编译程序在不同的计算机上运行,效率均不同——— 使用绝对时间单位衡量算法效率不合适(没办法,你的软硬件环境就是在里面起着一定作用。)

2.事前分析估算法——渐近分析法重点

所谓的渐近分析是指忽略具体机器、编程语言和编译器的影响,只关注在输入规模增大时算法运行时间的增长趋势。

1)算法的运行时间是问题规模n的函数,记作T(n)

2)用基本语句的执行次数表示T(n)

3)忽略低阶项和常系数,只考虑最高阶

4)用大O、大\Omega和大\Theta表示其渐近意义下的阶

时间复杂度是由嵌套最深层语句的频度决定的

3.大O符号——渐近上界记号

1)定义:如果存在两个正的常数c和n0,对于任意n≥n0,都有f(n)≤c×g(n),则记为f(n)=O(g(n)),即g(n)为f(n)的上界。

2)图助理解

大O符号用来描述增长率的上界,表示f(n)的增长率≤g(n)的增长率。即当输入规模为n时, g(n)为算法消耗时间的最大值

3)上界g(n)的阶越低,评估越准确,结果越有价值,通常将这个最有价值的g(n)称之为f(n)的“紧凑上界”或“紧确上界”。

4)例题:

5)总结:一般的,如果f(n)=a_{m}*n^{m}+a_{m-1}*n^{m-1}+...+a_{1}*n+a_0 , 有f(n) = O(n^{m})。

4.大Ω符号——渐近下界记号

1)定义:若存在两个正的常数c 和n0,对于任意n≥n0,都有f(n)≥c×g(n),则称f(n)=Ω(g(n)),即g(n)为f(n)的下界。

2)图助理解

\Omega符号用来描述增长率的下界,表示f(n)的增长率≥g(n)的增长率,即当输入规模为n时, g(n)为算法消耗时间的最小值。 

3)下界g(n)的阶越高,评估越准确,结果越有价值,通常将这个最有价值的g(n)称为f(n)的“紧凑下界”或“紧确下界”。

4)例题:

 5)总结:一般的,如果f(n)=a_{m}*n^{m}+a_{m-1}*n^{m-1}+...+a_{1}*n+a_0 , 有f(n) = \Omega(n^{m})。

5.大\Theta符号——渐近紧界记号

1)定义:若存在三个正的常数c1、c2和n0,对于任意n≥n0都有c1×g(n)≥f(n)≥c2×g(n),则称f(n)=\Theta(g(n)),即g(n)与f(n)同阶。

2)图助理解

f(n)=\Theta(g(n)),当且仅当f(n)=O(g(n)),f(n)=\Omega(g(n))

 3)例题:

 4)总结: 一般的,如果f(n)=a_{m}*n^{m}+a_{m-1}*n^{m-1}+...+a_{1}*n+a_0 , 有f(n) = \Theta(n^{m})。

6.渐近记号性质

重要结论:

法则1:如果T1(n)=O(f(n)),T2(n)=O(g(n)),那么

        (a) T1(n)+T2(n)= O(f(n)+g(n)) (也可以写成 O(max(f(n),g(n)))   

        为什么这里的加和选最大可以等价呢,因为渐进分析法忽略低阶项和常系数,只考虑最高       阶,所以加起来取最高阶和直接选最高阶结果一样。

        (b) T1(n)*T2(n)= O(f(n)*g(n)) 

法则2:对任意常数k,≤ O(n)。 (说明n的增长要快于log2n的任意次幂)

法则3:若T(n)= a_{m}*n^{m}+a_{m-1}*n^{m-1}+...+a_{1}*n+a_0(a_{m}>0),则有T(n)=O(n^{m})        且 T(n)=\Omegan^{m}),因此有 f(n) = \Theta(n^{m})。

 常见函数的阶

  • 多项式阶算法(有效算法):T(n)=O(n^{k})
  • 常见的多项式阶有    
  • 指数阶算法: T(n)= (a^{n}),a>1
  • 常见的指数阶有   

 小例题练练手~

【例5】 求下列算法的时间复杂度
void InsertSort(SqList &L){     int i,j;for(i=2;i<=L.length; i++){      if( L.R[i].key<L.R[i-1].key)//将L.R[i]插入有序子表{     L.R[0]=L.R[i]; // 复制为哨兵j = i-1;do{    L.R[j+1]=L.R[j]; // 记录后移 j--;}while(L.R[0].key>=L.R[j].key))L.R[j+1]=L.R[0]; //插入到正确位置}}
}

参考解答:

 

 二、渐近空间复杂度分析

 定义:

        一个算法的存储量包括形参所占空间和临时变量所占空间。在对算法进行存储空间分析时,只考察临时变量所占空间。

空间复杂度是对一个算法在运行过程中临时占用的存储空间大小的量度,一般也作为问题规模n的函数,以数量级形式给出,记作:      

S(n)=O(g(n))、\Omega(g(n))\Theta(g(n))

其中渐进符号的含义与时间复杂度中的含义相同。

小例子理解一下~

 如果算法所需的辅助空间相对于问题的输入规模来说是一个常数,我们称此算法为原地(或就地)工作。

为什么算法占用的空间只考虑临时空间,而不必考虑形参的空间呢?

这是因为形参的空间会在调用该算法的算法中考虑,例如,以下maxfun算法调用上面的max算法:

maxfun算法中为b数组分配了相应的内存空间,其空间复杂度为O(n),如果在max算法中再考虑形参a的空间,这样重复计算了占用的空间。

 三、递归算法复杂度分析

1.  建立递归方程

递归方程是一个等式或不等式,它通过更小的输入上的函数值来描述一个函数。

当一个算法包含对其自身的递归调用时,可以用递归方程来表示其运行时间

例1.建立算法的递归方程
void Hanoi(int n,char A,char B,char C)
{   if (n==1)printf("将盘片%d从%c搬到%c\n“,n,A,C);else{	  Hanoi(n-1,A,C,B);printf("将盘片%d从%c搬到%c\n",n,A,C);Hanoi(n-1,B,A,C);}
}
参考解答(前面的代表括号,嘻嘻~):/T(n) = O(1)                当n=1时\T(n) = 2T(n-1)+O(1)        当n>1时例2.请给出斐波那契数列的递归算法并建立算法的递归方程
int Fib(int n)		
{  if (n==0 || n==1)return n;else{  int x=Fib(n-1);int y=Fib(n-2);return x+y;}
}
参考解答:
/T(n)=O(1)			        当n=1
\T(n)=T(n-1)+T(n-2)+O(1)	当n>1例3.建立算法的递归方程
int maxelem(int a[],int i,int j)
{   int mid=(i+j)/2,max1,max2;if (i<j){	max1=maxelem(a,i,mid);max2=maxelem(a,mid+1,j);return (max1>max2)?max1:max2;}else return a[i];
}
参考解答:
/T(n)=O(1)			    当n=1
\T(n)=2T(n/2)+O(1)		当n>1这一步很简单,从例子中找到他的解法规则吧~你一定可以的!

2.  求解该递归方程

1)迭代法

从初始递归方程开始,反复用递归方程右边的等式代入左边的函数,直到得到初值。

小例子走起~

________________________________________

求解递归方程
T(n) = O(1)                       当n=1时
T(n) = 2T(n/2)+ O(n)       当n>1时

参考解答:
T(n) = 2T(n/2)+cn
     =2*[2T(n / 2^{2})+cn/2]+cn
     =2^{2} * T(n / 2^{2})+2cn
     = 2^{3} * T(n / 2^{3})+3cn
     = …
     = 2^{k} * T(n / 2^{k})+kcn         //这里假设n=2^k,则k=\log _{2}n(重要处理思路!)
     = nO(1)+cnlog2n=n+cn\log _{2}n   
     = O(n\log _{2}n)

2)代入法

猜测解的形式;用数学归纳法证明(还是来一个例子,这个方法用的少)

例.求解递归方程   T(n) = 2T(n/2+5)+ n

用代入法求解 (1)猜测解的形式:T(n)=O(n\log _{2}n)

                      (2)用数学归纳法求出解中的常数,并证明解是正确的

3)递归树法

  • 展开递归方程,构造对应的递归树  

        递归树的构造方法 递归树是一棵结点带权值的树,每个结点表示一个单一子问题的代价,子问题对应某次递归函数调用。 初始的递归树只有一个结点,它的权标记为T(n);然后按照递归树的迭代规则不断进行迭代,每迭代一次递归树就增加一层,直到树中不再含有权值为函数的结点。  

  • 将树中每层中的代价求和,得到每层代价,再将所有层的代价求和,得到总的递归调用代价

小例子再次走起~

________________________________________

 

 解答(图片演示~):

 

 

 

 

 

4)主方法

主方法适用于求解下面的递归形式:

 

其中a≥1,b>1为常数, f(n)为渐近正函数

先来将抽象的递归式进行展开

 

小例子再再次走起~

________________________________________

求解递归方程  T(n)=4T(n/2)+O(n)

对于红色部分,主方法无能为力


http://chatgpt.dhexx.cn/article/iR3YLXhL.shtml

相关文章

算法设计与分析(1)——基础知识

写完 Java 的我又开始对 算法设计与分析 下手了(✿◡‿◡) 内容主要是以 北京大学 屈婉玲老师的 MOOC 视频来写的&#xff0c;视频共是十周的内容&#xff0c;我决定用 五 篇博客完成。 温馨提示&#xff1a;这个课程不仅适用于 算法设计与分析 的学习&#xff0c;也非常适用…

算法设计与分析——算法基础初步了解

算法的概念 算法:一个有计算步骤构成的序列&#xff0c;可以将一组输入值转换成相应的输出值。或可以用例解决一个明确的问题。 问题&#xff1a;输入及相应输出的描述&#xff1a; 算法的特点&#xff1a;确定性、可行性、输入和输出及有穷性。 正确的算法&#xff1b;停机并…

算法设计与分析基础知识

一、算法设计基础 算法是&#xff08;algorithm&#xff09;是对特定问题求解步骤的一种描述&#xff0c;是指令的有限序列。 算法的五个特性&#xff1a; 输入&#xff1a;一个算法可以有零个或多个输入。 输出&#xff1a;一个算法有一个输出或多个输出。 有穷性&#xff08;…

为你的股票绘制趋势图

手里有一点点公司的股票&#xff0c; 拿不准在什么时机抛售&#xff0c; 程序员也没时间天天盯着看&#xff0c;不如动手写个小程序&#xff0c; 把股票趋势每天早上发到邮箱里&#xff0c;用 python 的 pandas, matplotlib 写起来很容易&#xff0c; 几十行代码搞定。 准备环…

用PYTHON画图 看股票/数字货币的趋势分析 带你直观理解指标 K线图

用PYTHON画图 看股票/数字货币的趋势分析 带你直观理解指标 本文章将用PYTHON 画图 以比特币&#xff08;BTC&#xff09;为例 进行画图分析 &#xff08;小白向&#xff09; Pycharm平台编写 所用到的python库 import requests from lxml import etree import math import …

Plotly中绘制三种经典的股票交易图表(含视频讲解)

作者&#xff1a;Lemon 来源&#xff1a;Python数据之道 Plotly中绘制三种经典的 股票交易图表&#xff08;含视频讲解&#xff09; 大家好&#xff0c;我是 Lemon 。 背景 前一段时间&#xff0c; Lemon 发了一期视频&#xff0c;分享了 Plotly 和 Dash 在投资领域的应用案例。…

如何在股票软件画波浪?波浪原理?初级应用画线

如何在股票软件画波浪&#xff1f;波浪原理?初级应用画线 听语音 浏览&#xff1a;1|更新&#xff1a;2018-03-13 10:07|标签&#xff1a;股票 1 2 3 4 5 6 7 分步阅读 波浪理论最主要特征就是它的通用性&#xff0c;在股市中是一个十分重要的技术研究方向&#xff0c;一旦成…

使用Python生成股票K线图

可视化股票数据&#xff0c;这里只做简单的处理&#xff0c;只显示k线图。选取的是海通证券&#xff08;600837&#xff09;2020年1月1日之后150个交易日的数据。这里代码不多&#xff0c;没有封装成方法&#xff0c;代码如下。数据是提前获取的&#xff0c;获取方法见&#xf…

Python获取股票数据并绘制相应K线图,看这个就够了!

Python对股票的K线可视化 前言说明注意 数据获取Tushare获取股票数据获取医疗器械板块数据&#xff08;代码部分&#xff09;获取股票数据&#xff08;代码部分&#xff09; 数据预处理变量中文化&#xff08;代码部分&#xff09; K线绘制代码部分结果展示 写在最后 前言 说明…

使用mpl_finance画股票K线图

使用mpl_finance画股票K线图 前言正文 前言 今天给大家介绍一下如何利用 python 中的 mpl_finance 模块画股票K线图。 该模块在 matplotlib 2.0之前是叫做 matplotlib.finance 但此之后是叫做 mpl_finance。 详细介绍请看https://matplotlib.org/api/finance_api.html 。具体用…

Python画图实战之画K线图【附带自动下载股票数据】

关于Python画图的基本知识可以先查看下面这篇文章Python画图&#xff08;直方图、多张子图、二维图形、三维图形以及图中图&#xff09;https://blog.csdn.net/weixin_41896770/article/details/119798960 对于股民来说&#xff0c;K线图是最常见的一种参考&#xff0c;使用Pyt…

一步一步教你写股票走势图——K线图二(图表联动)

目录 一步一步教你写股票走势图——分时图一&#xff08;概述&#xff09; 一步一步教你写股票走势图——分时图二&#xff08;自定义xy轴&#xff09; 一步一步教你写股票走势图——分时图三&#xff08;对齐图表、自定义柱状图高亮&#xff09; 一步一步教你写股票走势图…

如何对走势图进行画线分析

现货黄金投资入门与技巧&#xff0c;如何都绕不开这个问题&#xff0c;那就是画线分析。画线分析是技术分析一个重要的流派&#xff0c;也是我们分析市场必不可少的手段&#xff0c;掌握画线的方法&#xff0c;对我们掌握现货黄金投资入门与技巧有很大的帮助。 一、支撑线和压力…

使用Python绘制精美绝伦的股票行情K线图

PythonPyQt2.74 本文简单介绍了如何从Tushare获取某支股票的价格数据&#xff0c;并根据价格数据画出相应的日K线图。 # -*- coding: utf-8 -*-import sys import talib import numpy as np import pandas as pd import tushare as ts import datetime as dt import pyqtgraph …

缠论 公式 自动画线 画笔 中枢 买卖点 源代码

显示效果 跨级别区间套演示 板块演示 个股演示 期货演示 源码如下&#xff1a; {三角形中枢}时间:4;A:HHHV(H,时间*5) AND HHV(H,时间*5)>REF(HHV(H,时间*5),1);B:LLLV(L,时间*5) AND LLV(L,时间*5)<REF(LLV(L,时间*5),1);CC1:DRAWLINE(A,H,B,L,0);CC2:DRAWLINE(B,L,A,H…

利用 python numpy +matplotlib 绘制股票k线图

一、python numpy matplotlib 画股票k线图 # -- coding: utf-8 -- import requests import numpy as np from matplotlib import pyplot as plt from matplotlib import animationfig plt.figure(figsize(8,6), dpi72,facecolor"white") axes plt.subplot(1…

一步一步教你写股票走势图——K线图三(添加均线)

目录 一步一步教你写股票走势图——分时图一&#xff08;概述&#xff09; 一步一步教你写股票走势图——分时图二&#xff08;自定义xy轴&#xff09; 一步一步教你写股票走势图——分时图三&#xff08;对齐图表、自定义柱状图高亮&#xff09; 一步一步教你写股票走势图…

[逐笔数据分析工具分享]如何分析股票逐笔数据

工具分享链接&#xff1a;https://pan.baidu.com/s/1fbDoPM2NzSBEn31gDBZnpQ 提取码&#xff1a;v0sm ​1. 配置stocklist.txt和datelist.txt stocklist为要分析的股票号码&#xff0c;可为任意个 datelist为要分析的日期&#xff0c;可为任意个 以上都为空时&#xff0c;则…

【K线绘图】教你用python绘制带有买卖点的股票K线图(附送鳄鱼指标、顾比均线指标、dataframe格式化输出)

提示&#xff1a;文章内买卖点不构成交易依据&#xff0c;请根据情况自行决策。 教你用python绘制带有买卖点的股票K线图&#xff08;附带鳄鱼指标、顾比均线指标、dataframe格式化输出&#xff09; 前言一、自己绘图&#xff0c;是不是疯了&#xff1f;二、分步说明1. 准备工作…

股票K线图绘制

股票K线图绘制 文章目录 股票K线图绘制前言一、股票K线图基础知识二、用Python绘制股票K线图总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都…