| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 数据结构-第1节- 算法的时间复杂度和空间复杂度 -> 正文阅读 |
|
[数据结构与算法]数据结构-第1节- 算法的时间复杂度和空间复杂度 |
1.算法效率1.1.如何衡量一个算法的好坏
1.2.算法的复杂度
2.时间复杂度2.1.时间复杂度的概念
Func1 执行的基本操作次数 :
N = 10 F(N) = 130
N = 100 F(N) = 10210
N = 1000 F(N) = 1002010
实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法
2.2.大O的渐进表示法
实例1:
F(N)=2*N+10 复杂度:O(N) 实例2:
F(M,N)=M+N 复杂度:O(M+N) 实例3:
F=100 复杂度:O(1) 实例4:
复杂度:O(N) (最坏的预期,N是字符串的长度) 注: 1.strchr函数
实例5:
注: 1.这是一个冒泡排序法,如果每一次都需要交换,因此第一次交换N-1次,第二次交换N-2次,一直运行到倒数第二次交换2次,最后一次交换1次,这是一个等差数列,因此F(N)=(N-1+1)*(N-1)/2,这是最差的情况。如果已经有序了再用冒泡排序进行排序,从前往后两两比较,到最后发现不需要交换则break,因此F(N)=N-1 ?2.冒泡排序F(N)=,因此复杂度为O() 实例6:
注: 1. 最好的情况:第一次就找到即时间复杂度为O(1) 最坏的情况:找不到。二分查找本质上其实是逐渐缩短查找的范围,直到还剩一个元素为止,设总共有N个元素,每除以一个2,就查找了一次;反过来看,如果我们找了x次,那么总共有N=1*2*2......*2(x个2)=个元素,那么x=,因此时间复杂度为O(),在时间复杂度里面通常会把?O()简写成?O() 2.该代码是左闭右开的,也就是begin = 0,begin指向的是第一个元素,end = n,end指向了最后一个元素再后面的位置,如下图所示,那么后面都要保持左闭右开,当a[mid] < x时,begin = mid+1,当a[mid] > x时,?end = mid 当代码是左闭右闭的,也就是begin = 0,begin指向的是第一个元素,end = n-1,end指向了最后一个元素,那么后面都要保持左闭右闭,当a[mid] < x时,begin = mid+1,当a[mid] > x时,?end = mid-1,并且while (begin <=end)循环判断中应该是小于等于符号 如果不保持前后一致就有可能出现找不到或者死循环的情况 3.begin + ((end-begin)>>1:这种写法是为了防止begin+end计算的结果在除以2之前就溢出,其中>>1相当于除以2 4.我们要准确分析算法时间复杂度,一定要去看思想,不能只去看程序是几层循环 实例7:
复杂度:O(N) 注: 1.从N开始N,N-1,......,2,1,总共递归了N次,所以复杂度:O(N) 2.如果将上面代码改写如下,那么当为N时,里面循环N次,当为N-1时,里面循环N-1次,以此类推,F(N)=++......++,复杂度为O() ?3.递归算法时间复杂度计算: (1)每次函数调用是O(1),那么就看他的递归次数 (2)每次函数调用不是O(1),那么就看他的递归调用中次数的累加 实例8:
复杂度:O() 注: 1.这是一个斐波那契数列,假设每一层全满的情况下,第一层计算1个,第二层计算2个,第三层计算4个,第四层计算8个,依次类推,直到最后N-1层计算个(看这个斐波那契数列最左边的一个分层,第一个数是N,往下分解最左边为N-1......往下分解最后为2,从2到N总共有N-1个数,所以有N-1层)(真是情况下最后几层是不会全满的,因此要减一些,但是从整体上来看是可以忽略的) F(N)=1+2+4+8+......+ 复杂度:O()? 2.从这里我们可以看出,如果斐波那契数列用这种方法写其实效率是很低的 3.长整型打印用%lld 3.空间复杂度4. 常见复杂度对比5. 复杂度的oj练习5.1.消失的数字?思路: 1.排序+暴力查找/二分查找:? 冒泡排序复杂度O()? ? ? ?qsort快速排序复杂度O()? 因此不能进行排序 2.映射方式:开一个大小为n+1的数组,数组下标从0到n,将数组全部元素初始化为-1,先遍历一遍nums数组,将数组nums中的元素对应到新开的数组中(nums中元素大小与对应到的新数组下标相同);然后遍历一遍新开的数组,找到数组中-1对应的下标即可。该方法F(n)=2n,时间复杂度为O(n),符合题目要求 3.异或方式:用一个变量val初始化为0(val和val进行异或结果为0,因此可直接初始化为0),将val跟0~n的数字异或,再跟nums数组中每个元素异或,最后的val结果就是缺失的数字 4.等差数列公式:首先将1到n的n个数加起来( 1+2+3+......+n=((1+n)*n)/2 ),然后求和的结果减去nums中所有的数即可 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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/26 12:26:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |