目录

前言

一、时间复杂度

二、大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.时间复杂度相关推荐

  1. 【数据结构】时间复杂度_空间复杂度

    作者:旧梦拾遗186 专栏:数据结构成长日记 每日励志: 如果有一天,你的努力配得上你的梦想,那么你的梦想也绝对不会辜负你的努力. 前言: 小编带大家来学习数据结构中的复杂度问题. 目录 1.算法效率 ...

  2. 数据结构之时间复杂度和空间复杂度

    数据结构入门 文章目录 数据结构入门 前言 一.时间复杂度 1.定义 2.大O的渐进表示法 3.例题 1)Func3 2)冒泡排序 3)二分查找 4)阶乘递归 5)斐波那契递归 二.空间复杂度 1.定 ...

  3. 【数据结构】时间复杂度和空间复杂度的计算

    目录 一.数据结构 1.什么是数据结构 2.什么是算法 3.数据结构和算法的重要性 4.如何学好数据结构和算法 二.算法效率 三.时间复杂度 1.时间复杂度的概念 2.时间复杂度的表示方法 3.算法复 ...

  4. 【数据结构】—时间复杂度or空间复杂度以及基础题目练习

    小菜坤日常上传gitee代码:https://gitee.com/qi-dunyan ❤❤❤ 个人简介:双一流非科班的一名小白,期待与各位大佬一起努力! 推荐网站:cplusplus.com 目录 前 ...

  5. 【数据结构】时间复杂度和空间复杂度

    文章目录 前言 1. 什么是数据结构 2. 什么是算法 正文 1. 算法效率 1.1 如何衡量一个算法的优劣 1.2 算法的复杂度 2. 时间复杂度 2.1 定义 2.2 计算 2.3 大O的渐进表示 ...

  6. 408考研数据结构复习-时间复杂度与空间复杂度-附统考真题

    文章目录 一.时间复杂度 二.空间复杂度 三.相关题目 一.时间复杂度 一个语句的频度是指该语句在算法中被重复执行的次数.算法中所有语句的频度之和记为T(n),它是该算法问题规模n的函数,时间复杂度主 ...

  7. 数据结构的时间复杂度与空间复杂度、及相关证明

    0. 有向图无向图的时空复杂度 图的时空复杂度与其具体的表示形式有关,对于图的邻接表的表示形式,记 Adj[v] 为顶点 v 的出边构成的列表.为了考量其空间复杂度,首先需要记录全部的顶点,也即即使全 ...

  8. 数据结构(2)时间复杂度——渐进时间复杂度、渐进上界、渐进下界

    目录 2.1.概述 2.2.时间复杂度的计算 2.2.1.渐进复杂度 2.2.2.渐进上界 2.2.3.渐进下届 2.2.4.复杂度排序 2.2.5.举几个例子 2.1.概述 算法的基本定义: 求解问 ...

  9. 数据结构::递归时间复杂度的计算

    开篇前言:为什么写这篇文章?笔者目前在学习各种各样的算法,在这个过程中,频繁地碰到到递归思想和分治思想,惊讶于这两种的思想的伟大与奇妙的同时,经常要面对的一个问题就是,对于一个给定的递归算法或者用分治 ...

最新文章

  1. (转)I 帧和 IDR 帧的区别
  2. Oracle DBA课程系列笔记(19)
  3. Android全局对象Application的使用,以及如何在任何地方得到Application全局对象
  4. Docker的运行机制
  5. java comparator相等_详解Java中Comparable和Comparator接口的区别
  6. strictmath_Java StrictMath log10()方法与示例
  7. MySQL04WHERE关键字
  8. 【linux】linux 查找 或者 搜索 文件 find
  9. UIDevice获取设备数据以及如何获取应用信息
  10. java 文件读写 中文_java读写中文文件
  11. xsocks 64位平台下编译问题小记
  12. 高通8953 Android 9.0 打开user调试串口
  13. python如何获取图片的尺寸大小_Python获取图片的大小/尺寸
  14. php if相关标签,dedecms模板中运用dede标签时使用php和if判断语句的方法
  15. 比较大小教案计算机小朋友们,一年级数学下册第单元教案.doc
  16. mysql锁机制——乐观锁、悲观锁;共享锁、排他锁、行表锁、间隔后码锁、MVCC 与 thinkphp的lock解析
  17. GraphQL和RESTful的区别
  18. BBEdit 10.X for mac的lincese
  19. 2022-01-10:路径交叉。给你一个整数数组 distance 。 从 X-Y 平面上的点 (0,0) 开始,先向北移动 distance[0] 米,然后向西移动 distance[1] 米,向南
  20. APAD 7'“谷歌Android操作系统1.5无线触摸屏

热门文章

  1. android 实现QQ好友列表(扩展listview:ExpandableListView)
  2. 队列BlockingQueue
  3. 让线程实现暂停,重新启动,停止
  4. 2021NCTF-RE
  5. [SV]SystemVerilog压缩数组(Packed Array)和非压缩数组( Unpacked Array)
  6. 【KMP】Radio Transmission(最小循环子串)
  7. Win10如何更改C:\Users\下的用户名
  8. Linux下Socket编程之UDP原理
  9. weblogic修改密码
  10. linux上如何搭建Java环境