时间复杂度

时间复杂度是什么?
    可以理解为程序中的基本操作要执行的次数,而并非是真正以时间为单位的量,一般用默认是最坏情况下程序要执行的次数。时间复杂度用O(……)来表示。

时间复杂度的分类:
    O(1)常数型、O(n²)平方型、O(n³)立方型、O(log n)对数型、O(n*log n) 、O(n)线型、O(2^ n)指数型 。

时间复杂度的计算方法:
    1.循环嵌套,内外循环的最大次数相乘。例如:↓ 时间复杂度为O(n²)

for(i=1; i<=n; i++){//循环n次for(j=1; j<=n; j++)//循环n次ans = ans + i + j;
}

如果是↓     那么时间复杂度为O(n³)

for(i=1; i<=n; i++){for(j=1; j<=n; j++){for(k=1; k<=n; k++)ans =  ans + i + j + k;}
}

2.循环平行,相加。例如↓ 时间复杂度为O(n² + 2^n)

for(i=1; i<=n; i++){for(j=1; j<=n; j++)ans = ans + i + j;
}
for(k=1; k<=n; k++){for(m=1; m<=2^n; m++)ans =  ans + k + m;
}

3.常数忽略。例如↓ 时间复杂度为O(1),这里用的10举例,但如果这个数取了一个很大的数还要另外考虑。

for(i=1; i<=10; i++){ans = ans + i;
}

还有↓ 时间复杂度为O(n)不要认为是O(2*n + 1)

for(i=1; i<=2n; i++){for(j=1; j<=10; j++)ans = ans + i;
}

如果没有循环↓ 也就是说,算法的执行时间不随着问题规模n的增加而增长,那么它的时间复杂度是O(1)

int a = 1;
int b = 2;
int c;
a = a + b;
b = b + a;
c = a + b;

4.递归算法的时间复杂度 = 递归的次数 * 每次递归中循环的次数。例子是第5条n*log n的例子,因为快速排序应用了递归调用。

5.log n和n*log n是怎么出现的呢?先看第一个例子

while(i < 2^8){i *= 2;
}

这个循环会执行几次?3次,求法为:log2 8 = 3,那如果8是n呢?那就是log2 n次了,所以就会出现时间复杂度为log n的情况,那n*log n怎么回事?请看下面的例子:该例子是快速排序。数组num[n]默认已经初始化

void quicksort(int left, int right){int i, j, t, key;if(left > right)return ;key = num[left];i = left;j = right;while(i != j){while(a[j]>=key && i<j)j--;while(a[i]<=key && i<j)i++;if(i<j){t = a[i];a[i] = a[j];a[j] = t;}}a[key] = a[i];a[i] = temp;quicksort(left, i-1);quicksort(i+1, right);return ;
}

第一次递归遍历n个数,然后数组分为两个区域,每个区域再和每个区域内的key进行比较,比较的次数还是近似于n,所以递归中循环比较的次数近似为n,那么循环了几次呢?快速排序可以想象成与一个完全二叉树,而这个完全二叉树的树高就是循环次数,树高为log n,所以快速排序的时间复杂度为n*log n。

快速排序:

时间复杂度_《羊卓的杨的算法笔记》_Quentin相关推荐

  1. 0x3f3f3f3f_《羊卓的杨的算法笔记》_Quentin

    为什么要用0x3f3f3f3f? 我们有时需要取一个无穷大,但是我们该取什么值呢?     首先可以取int的最大值0x7fffffff,但是这个数只能用来进行大小比较.因为如果我们想正常进行运算,使 ...

  2. 《羊卓的杨的算法笔记》_Quentin

    羊卓的杨的算法笔记 说明:     我刚刚开始学习算法~,然后会把我学到的东西用博客记录下来,也就做出了这一个<羊卓的杨的算法笔记>专栏,欢迎广大网友斧正赐教.     算法博文部分以以下 ...

  3. 生成50道100以内加法/减法算式的习题_软件构造_羊卓的杨

    废话咱们就不多讲了,直接上代码,看完的老铁记得给个收藏关注❤~. 下面这两个平台也求一波关注,最近两年内有更新

  4. 6-7 拓扑排序 (10分)_数据结构实验6_羊卓的杨

    6-7 拓扑排序 (10分) 试实现拓扑排序算法.函数void FindInDegree(ALGraph G,int indegree[])实现图中各个顶点入度的统计:函数int Topologica ...

  5. 6-5 二叉树的层次遍历 (6分)_数据结构实验5_羊卓的杨

    6-5 二叉树的层次遍历 (6分) 本题要求实现给定的二叉树的层次遍历. 函数接口定义: void Levelorder(BiTree T); T是二叉树树根指针,Levelorder函数输出给定二叉 ...

  6. 6-2 统计二叉树结点个数 (10分)_数据结构实验5_羊卓的杨

    6-2 统计二叉树结点个数 (10分) 本题要求实现一个函数,可统计二叉树的结点个数. 函数接口定义: int NodeCount ( BiTree T); T是二叉树树根指针,函数NodeCount ...

  7. 冒泡和快速排序的时间复杂度_三分钟快速记住冒泡排序算法

    冒泡排序名字由来: 是因为越小的元素会经由交换慢慢"浮"到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名"冒泡排序". ...

  8. 数据库中的drop、truncate、delete有什么区别❓__羊卓的杨

    drop.truncate.delete区别❓

  9. b+树时间复杂度_前端大神用的学习笔记:线段树和树状数组

    全文篇幅较长,细心理解一定会有收获的♪(^∇^*). 1|0线段树 1|1一些概念     线段树是一种二叉搜索树,每一个结点都是一个区间(也可以叫作线段,可以有单点的叶子结点),有一张比较形象的图如 ...

最新文章

  1. .net连接mysql数据_.net连接MYSQL数据库的方法及示例!
  2. SSM项目搭建一(终)
  3. win10+python3.6+tensorflow-cpu+keras+Pycharm环境下的tensorflow配置方法
  4. c语言形参的隐含存储类型,C存储类型
  5. 伪类的使用之如何在一段文字前面添加一个点
  6. WxWidgets :一些古怪的源代码
  7. 刚刚!第七次人口普查出炉!男性比女性多3490万,老龄化进一步加深
  8. js获取当天0点和24点的时间戳
  9. Sogou input method on Ubuntu
  10. 02_函数定义及使用函数
  11. 计算机无限开机,电脑开机无限循环重启
  12. php相册照片批量修改,怎么批量修改图片尺寸 批量修改图片大小
  13. QT 添加 lib库
  14. XenDesktop HDX3D交付Seamless Application
  15. gta5一直服务器维护,gta5bawsaq总是维护 | 手游网游页游攻略大全
  16. 美国公派访问学者申请全过程
  17. Python+Vue计算机毕业设计网上书城系统t9avi(源码+程序+LW+部署)
  18. SKY65162-70LF射频功率放大器
  19. linux安装git
  20. 一个可以下载显示器调色icc文件的网站

热门文章

  1. windows7系统内存管理--Superfetch
  2. 视频聊天室如何成功赚钱分享攻略一
  3. VSCode:VSCode提供额外的环境变量
  4. N56背光键盘排线断裂修复
  5. Azkaban的使用
  6. Java集合(五)LinkedList底层扩容源码分析
  7. Java并发编程之CAS第三篇-CAS的缺点
  8. 我的网站需要什么SSL证书?
  9. 解决“无法停止‘通用卷’设备的方法
  10. 2021/11/13