数据结构—1.时间复杂度
目录
前言
一、时间复杂度
二、大O表示法
三,实例介绍
例1:O(N^2)
例2:O(1)
例3:O(M +N)
(重点)例4:O(N)
例5:冒泡排序( O(N^2) )
例6:二分法查找(O(log2N))
例7:
(1)递归法(阶乘)O(N) | O(1)
(2)递归法(斐波那契数列)( O(2^N))
总结
前言
本文介绍数据结构的入门——时间复杂度。将会对时间复杂度进行剖析,通过例题讲解时间复杂度的应用范围和注意事项。
一、时间复杂度
概念:算法的时间复杂度是一个函数:(是数学含义上的函数)数据里面带未知数的函数式。
含义:算法在机器中运行所消耗的时间。
实际意义:算法中基本操作的执行次数。
作用和理解:降低占用内存和减少运行时间,提高效率。
好的算法相当于拿着筷子吃饭,差的算法相当于拿着竹竿吃饭,又长又麻烦。
二、大O表示法
大O符号(Big O notation):用于描述函数渐进行为的数学符号(描述时间复杂度)
推导大O阶方法:
1,用常数1取代运行次数中的所有加法常数;
2,在修改后的运行次数函数中,只保留最高阶项;
3,如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶;
含义:(保留最高阶的未知数,不保留常系数)。
三,实例介绍
例1:O(N^2)
找到某条基本语句与问题规模N之间的数学表达式,就是算出了算法的时间复杂度。
代码如下:
//请计算一下Func1中的++count语句总共执行了多少次? void Func1(int N) {int count =0;for(int i =0;i<N;++i){for(int j =0;j<N;++j){++count;}}for(int k = 0; k < 2*N; ++k){ ++count;}int M =10;while(M--){++count;}printf("%d\n",count);
Func1 执行的基本操作次数:F(N)= N^2+2*N+10 O(N^2)
- N =10 F(N) = 130
- N =100 F(N) =10210
- N = 1000 F(N) =1002010
- 随着N的变大,后两项的结果影响逐渐变小
- 当N无限大的时候,后两项对结果的影响可以忽略不计。
- 所以时间复杂度为O(N^2)。
例2:O(1)
代码如下:
void Func2(int N) {int count =0;for(int i =0;i<100;++i){ ++count;}
如果只是循环次数只是常数项的话者就直接是O(1)
例3:O(M +N)
代码如下:
void Func1(int N, int M) {int count =0;for(int i =0;i<N;++i){++count;}for(int k = 0; k < M; ++k){ ++count;}printf("%d\n",count);
虽然是不同的未知数,但是时间复杂度O只看阶数:所以为O(M)或O(N)
(重点)例4:O(N)
计算strchr的时间复杂度
const char* strchr(const char *str,int character);
whlie(*str)
{if(*str==chaeacter)return str;else++str;
}
return NULL;
此类时间复杂度是通过输入进去的数组的元素个数确定。
- 最好可以为1
- 最坏可以为N
- 但是时间复杂度一般取最坏的情况,所以此题的搜索数组数据的时间复杂度为O(N)
- 有些算法的时间复杂度存在最好,平均,最坏情况:
- 最坏情况:输入任意规模的最大运行次数(次数上限)
- 平均情况:输入任意期望的运行次数
- 最好情况:输入任意规模的最小运行次数(次数下限)
例5:冒泡排序( O(N^2) )
int Fib(int *a, int size_a) {for (int i =0;i<size_a -1;i++){for (int j = 0; j< size_a -1 -i;j++){int temp;if( a[j] < a[j+1] ){temp = a[j];a[j] = a[j+1]a[j+1] = temp;}}}}
例6:二分法查找(O(log2N))
我们要准确分析算法时间的复杂度,一定要去看思想,不能只去看程序是几层循环。
int BinarySearch(int*a, int n, int x) {assert(a); //排序int begin =0;int end =n;while (begin <end){int mid = begin +((end-begin)>>1);if(a[mid] < x)begin = mid+1;else if(a[mid]> x)end = mid;else return mid;}return -1; }
N(循环次数)X(查找次数)
通常运算级的大小在初始基数特别大的时候比较有优势。
例7:
(1)递归法(阶乘)O(N) | O(1)
时间复杂度计算·
1,每次函数调用为O(1),那么就看他的递归次数
2,每次函数调用不是O(1),那么就看他的递归调用中次数的累加
long long Fac (size_t N) {if(0 ==N)return 1;return Fac(N-1)*N; }
(2)递归法(斐波那契数列)( O(2^N))
long long Fib(size_t N) {if(N < 3)return 1;return Fib(N-1) +Fib(N-2); }
递归法算斐波那契数列是比较占用内存的一种方法,运行次数随着设定值呈指数性增长。
总结
1.本次讲了时间复杂度的基本认识。
通过对7例不同的时间复杂度的分析,我们可以得出以下结论:
(1)时间复杂度不局限与循环有关,核心是与算法思想有关。
(2)时间复杂度主要取其最坏循环次数。
(3)通过对时间复杂度的认识,能更好的对我们的程序进行优化。
数据结构—1.时间复杂度相关推荐
- 【数据结构】时间复杂度_空间复杂度
作者:旧梦拾遗186 专栏:数据结构成长日记 每日励志: 如果有一天,你的努力配得上你的梦想,那么你的梦想也绝对不会辜负你的努力. 前言: 小编带大家来学习数据结构中的复杂度问题. 目录 1.算法效率 ...
- 数据结构之时间复杂度和空间复杂度
数据结构入门 文章目录 数据结构入门 前言 一.时间复杂度 1.定义 2.大O的渐进表示法 3.例题 1)Func3 2)冒泡排序 3)二分查找 4)阶乘递归 5)斐波那契递归 二.空间复杂度 1.定 ...
- 【数据结构】时间复杂度和空间复杂度的计算
目录 一.数据结构 1.什么是数据结构 2.什么是算法 3.数据结构和算法的重要性 4.如何学好数据结构和算法 二.算法效率 三.时间复杂度 1.时间复杂度的概念 2.时间复杂度的表示方法 3.算法复 ...
- 【数据结构】—时间复杂度or空间复杂度以及基础题目练习
小菜坤日常上传gitee代码:https://gitee.com/qi-dunyan ❤❤❤ 个人简介:双一流非科班的一名小白,期待与各位大佬一起努力! 推荐网站:cplusplus.com 目录 前 ...
- 【数据结构】时间复杂度和空间复杂度
文章目录 前言 1. 什么是数据结构 2. 什么是算法 正文 1. 算法效率 1.1 如何衡量一个算法的优劣 1.2 算法的复杂度 2. 时间复杂度 2.1 定义 2.2 计算 2.3 大O的渐进表示 ...
- 408考研数据结构复习-时间复杂度与空间复杂度-附统考真题
文章目录 一.时间复杂度 二.空间复杂度 三.相关题目 一.时间复杂度 一个语句的频度是指该语句在算法中被重复执行的次数.算法中所有语句的频度之和记为T(n),它是该算法问题规模n的函数,时间复杂度主 ...
- 数据结构的时间复杂度与空间复杂度、及相关证明
0. 有向图无向图的时空复杂度 图的时空复杂度与其具体的表示形式有关,对于图的邻接表的表示形式,记 Adj[v] 为顶点 v 的出边构成的列表.为了考量其空间复杂度,首先需要记录全部的顶点,也即即使全 ...
- 数据结构(2)时间复杂度——渐进时间复杂度、渐进上界、渐进下界
目录 2.1.概述 2.2.时间复杂度的计算 2.2.1.渐进复杂度 2.2.2.渐进上界 2.2.3.渐进下届 2.2.4.复杂度排序 2.2.5.举几个例子 2.1.概述 算法的基本定义: 求解问 ...
- 数据结构::递归时间复杂度的计算
开篇前言:为什么写这篇文章?笔者目前在学习各种各样的算法,在这个过程中,频繁地碰到到递归思想和分治思想,惊讶于这两种的思想的伟大与奇妙的同时,经常要面对的一个问题就是,对于一个给定的递归算法或者用分治 ...
最新文章
- (转)I 帧和 IDR 帧的区别
- Oracle DBA课程系列笔记(19)
- Android全局对象Application的使用,以及如何在任何地方得到Application全局对象
- Docker的运行机制
- java comparator相等_详解Java中Comparable和Comparator接口的区别
- strictmath_Java StrictMath log10()方法与示例
- MySQL04WHERE关键字
- 【linux】linux 查找 或者 搜索 文件 find
- UIDevice获取设备数据以及如何获取应用信息
- java 文件读写 中文_java读写中文文件
- xsocks 64位平台下编译问题小记
- 高通8953 Android 9.0 打开user调试串口
- python如何获取图片的尺寸大小_Python获取图片的大小/尺寸
- php if相关标签,dedecms模板中运用dede标签时使用php和if判断语句的方法
- 比较大小教案计算机小朋友们,一年级数学下册第单元教案.doc
- mysql锁机制——乐观锁、悲观锁;共享锁、排他锁、行表锁、间隔后码锁、MVCC 与 thinkphp的lock解析
- GraphQL和RESTful的区别
- BBEdit 10.X for mac的lincese
- 2022-01-10:路径交叉。给你一个整数数组 distance 。 从 X-Y 平面上的点 (0,0) 开始,先向北移动 distance[0] 米,然后向西移动 distance[1] 米,向南
- APAD 7'“谷歌Android操作系统1.5无线触摸屏