前言:
单独拎出这个来讲,是因为它很重要,通过算法的“时间复杂度”可以筛选出更高效的算法,提高处理数据和代码运行的效率,以及后续的优化
OS:之前看数据结构的时候,老是碰到这个时间复杂度,给我看的是一脸懵,于是才专门去研究了一下
正文:
时间复杂度的概念:
衡量算法运行效率的核心指标
简单来说就是你运行的代码有多费时间
常用的分类(时间复杂度鄙视链):
1.O(1) 常数时间
原理:无论数据多大,操作步骤(时间)不变
举例:你面前有100本书,在你已知位置的情况下,你想找到一本“程序猿的自我修养”的书,不需要一本一本找,直接走到书所在的位置拿
特性:无循环、无递进、直接操作
比如我随记1中所写的顺序表的随机(任意)访问就是O(1)的体现
结论:神仙级别,能用就不要犹豫,操作时间快得一批
2.O(log n)对数时间
原理:每次操作会将问题规模“砍半”,数据越大,效率优势越明显
举例:猜数字1→100,只需要从中间猜,最多7次就能猜中
特性:变量是指数级变化
结论:高手级别,每次将问题规模砍一半,数据量越大,优化效果越明显,通常都是高效算法
3.O(n)线性时间
原理:操作步骤(时间)和数据量成正比,数据量翻倍的同时,操作步骤翻(时间)翻倍
举例:从1数到100要数100次,数到1000要1000次
结论:普通选手,该遍历的就老老实实遍历
特性:单层循环遍历所有数据
4.O(n log n)线性对数时间
原理:核心策略是“先分再合”,先将数据分成小块处理(分治策略),每块处理时间为O(log n),总共有n块,直到将数据分到最后只剩一个元素
通俗易懂来讲👇🏻
先将数据砍一半,变成两组之后,两组分别再砍一半,以此类推,直到每个数组里面只剩下一个元素,然后再按照特定的规则合并两个相邻的元素
举例:有一组数字[9,1,6,4,3,8,7],按照从小到大的方法排序[]
1.先从中间砍两半,[9,1,6,4]和[3,8,7]
2.继续砍[9,1],[6,4],[3,8],[7]
3.直到砍到每个数组只剩下一个元素[9],[1],[6],[4],[3],[8],[7]
4.按特定的规则合并两个相邻的元素
[1,9],[4,6],[3,8],[7]
↓
[1,4,6,9],[3,8,7]
↓
[1,3,4,6,7,8,9]
结论:精英选手,属于是排序算法领域比较拔尖的,运到排序问题,记住“归并”和“快排”就够了
未完待续……
今天先总结到这里,剩下的后面再出一篇文章讲完,因为学的没有那么深的缘故,所以后面学习碰到相关的内容会加进来进行补充,文章有不对的地方,随时欢迎大家指出😊