| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 数据结构之——时间复杂度与空间复杂度 -> 正文阅读 |
|
[数据结构与算法]数据结构之——时间复杂度与空间复杂度 |
目录 一、什么是时间复杂度?1.时间复杂度的定义????????在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是每个算法都上机测试,这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,简单来说,算法中的基本操作的执行次数,就是算法的时间复杂度。注意这里计算的只是一个估算的次数,只能代表程序运行次数的数量级。 2.时间复杂度的计算方法我们现在来计算一下Func1基本操作执行了多少次?
Func1基本操作执行的次数:F(N) = N*N+2*N+10 N = 10,F(N) = 130 N = 100, F(N) = 10210 N = 1000,F(N) = 1002010
????????实际中我们计算时间复杂度时,其实并不一定要计算精确的执行次数,而只需要大概执行次
数,那么这里我们使用大O的渐进表示法。
推导大O阶方法:
使用大O的渐进表示法以后,Func1的时间复杂度为:O(N^2) N = 10,F(N) = 100 N = 100, F(N) = 10000 N = 1000,F(N) = 1000000
????????通过上面我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。
另外有些算法的时间复杂度存在最好、平均和最坏情况:
最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)
例如:在一个长度为N数组中搜索一个数据x
最好情况:1次找到
最坏情况:N次找到
平均情况:N/2次找到
????????在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)
3.常见时间复杂度计算举例? (1)? 计算循环次数
????????
这里基本操作执行了100次,通过推导大O阶方法,
这种固定次数运行的程序的时间复杂度为O(1)
。
(2)两个未知数?
????????
这里基本操作执行了M+N次,因为有两个未知数M和N,所以时间复杂度为O(N+M)。
(3)在字符串中查找字符
???? ? 该函数可以找到一个字符串中是否存在指定字符,存在则返回字符串中这个字符的地址,不存在则返回空指针。
这里基本操作的执行次数最好为1次,最坏为N次,时间复杂度一般看最坏,所以时间复杂度为O(N)。
(4)冒泡排序
????????如果待排序的数组为降序,在这里程序的运行次数为:(n-1)+(n-2)+(n-3)+…...+1次,根据等差数列求和公式最终结果为:N*(N-1)/2 = 0.5*N^2-0.5*N,保留最高项并舍去前面的系数,所以冒泡排序的时间复杂度为O(N^2)。 (5)二分法查找
? ? ? ? 二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间将缩小一半。 也就是说在最坏的情况下,直到begin和end之间只剩一个元素,每一次查找就会舍弃一半的元素。假设在N个数中查找,查找x次,则 ?????????可得,N = 2^x,x = logN,因此时间复杂度为 O(logN)。 ps:logN在算法分析中表示底数为2,对数为N。 (6)斐波那契数列递归
?????????这个程序在第一层递归中函数执行1次,为2的0次方;第二层递归中函数执行2次,为2的1次方;第三层递归中函数执行4次,为2的2次方……最后一层执行2的N-1次方次,但右边的一些递归分支会提前结束,设这些提前结束的分支有x个,则 Fib(N)= 2^0 + 2^1 + ...... + 2^(N-1) - x? ????????最后根据等比数列求和公式:Fib(N) = 2^N-1-x,因为x远小于2^N,所以该程序的时间复杂度为O(2^N)。 二、什么是空间复杂度?1.空间复杂度的定义
????????
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是算法运行过程中临时额外占用存储空间的变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法
。
2.常见空间复杂度的计算(1)冒泡排序
????????该程序在交换时只额外使用了一个临时的变量,个数固定,所以空间复杂度为O(1)。 (2)斐波那契数列
? ? ? ? 该程序动态开辟了N个空间,所以空间复杂度为O(N)。 ??(3)? 阶乘递归
? ? ? ? 该程序递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)。 注意:空间是可以重复利用,不累计的,而时间是一去不复返,累计的。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:39:34- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |