数据结构与算法复杂度计算

算法特征:
1、有输入,输出。
2、有基本操作构成
3、有穷性,正确性、可行性
4、不变性和单调性:随着算法程序的执行,单调性体现为向结果不断趋近。
5、退化和鲁棒性:鲁棒性解决取值极端问题能力,退化是算法的适用对象不够

以上特征都不是数据结构与算法研究的主要内容
主要内容是如何设计算法达到减少时间和空间的目的

时间复杂度:
衡量算法的指标,对于大规模的输入所耗费的最大时间
对于大规模:对于小规模时间本来耗费就不多,所以对小规模没有意义,
最大时间:规模一定,输入方式不同,如排序原数组的顺序不同,耗费时间不同,所以取各种输入方式所耗费的最大时间

对于不同的CPU,不同的语言,不同的平台,时间不同,无法表示算法好坏,于是提出了图灵机和RAM模型,将算法转化为最基本的操作,这些操作相当于一门语言,是最基本的操作,将不同语言转化为这种最基本的语言,就可以通过多少条语句(执行多少次指令)来表示算法的好坏,这样CPU也影响不了算法的比较。

图灵机:

在这里插入图片描述

RAM:
在这里插入图片描述

在这里插入图片描述
大O记号:描述算法复杂度的数学标尺
设上面的时间复杂度为T(n),即运算的次数为T(n),设T(n)<cf(n),n->无穷,f(n)可以称为T(n)的渐进上界,如下图:
在这里插入图片描述

f(n)存在的意义在于保证反应复杂度总体趋势下,尽可能的简化T(n)的表达式,T(n)
通常为比较复杂的表达式,简化方法如下:
T(n)<cf(n),n->无穷,可以将f(n)进行放大,最终得到一个比较漂亮的表达式-----6*n^1.5 。这个表达式在无穷时覆盖了T(n),记为O(n ^1.5)
在这里插入图片描述

既然有n^1.5 这种表达式,也有其他的表达式,比如logn、2的n次方等

下面看看表达式如何体现时间复杂度:
在这里插入图片描述
集合S有n个元素(这里是51个洲),是否存在吧元素分为两部分,这两部分的元素的和相等?
S有2^51个子集,所以要试2的51次方种情况。每一次包含的基本运算次数一定,所以复杂度可以记为2的51次方.

算法好坏排序:
O(1):
用一个常熟可以覆盖T(n)的f(n)记为O(1),此时相比于其他f(n),当n无穷时该常熟总是较小的,此时复杂度很低,算法很好。

O(logn):
比较接近常数,也是好算法
在这里插入图片描述
这里只看最高次,因为n无穷的时候低次的都可以忽略

O(n^c),c为常熟。
复杂度比较高,可以解

O(2^n)
复杂度很高,难解问题

算法复杂度分析:
C++中的基本语句可以理解为一次基本的RAM运算。
于是计算多少次成为了衡量复杂度的标准。
时间记忆:
一天=10^5s
300year=10^10s

迭代式算法(循环)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
statement;
运算次数:
n+n+…+n ,i决定有n个数相加,n 表示的是i的循环次数,每个数是n,表示的是j每一回合循环n次
n^2,复杂度为O(n的2次方)

for(i=0;i<10;i++)
for(j=0;j<i;j++)
statement;
运算次数:
0+1+2+…+(n-1)
复杂度为O(n^2)

更加复杂的算法如下:
已知运算次数的表达式,可以求和得到复杂度
在这里插入图片描述
在这里插入图片描述
这里的几何分布可能结果求和<1,但是仍然有意义。

在这里插入图片描述

递归式算法:
两种方法计算递归算法的复杂度:
1、直接罗列全部递归的从下往上的各个计算
在这里插入图片描述
以上罗列出了递归的全部实例,每个实例都是O(1)的时间

2、利用地推表达式进行求解

在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值