//1.算法简介:
简介
- 是指一组有穷的指令集,是解题方案的准确而完整的描述。算法不等于程序,也不等于计算方法。
特征
- 确定性:算法中每一步骤都必须有明确定义,不允许有多义性
- 有穷性:算法必须能在有限的时间内做完,既能在执行有限个步骤后终止
- 可行性:算法原则上能够精确的执行
- 拥有足够的情报
组成要素
- 一个算法由数据对象的运算和操作以及其控制结构这两部分组成
- 运算和操作:算术运算,逻辑运算,关系运算,数据传输
- 控制结构:顺序,选择,循环
- 设计方法:列举法、归纳法、递推、递归、减半递推技术
//2.算法的复杂度
简介
- 是算法效率的度量,时间复杂度和空间复杂度并不相关
- 时间复杂度:指执行算法所需要的计算工作量,包括编译时间和运行时间
- 空间复杂度:指执行算法所需要的内存空间,包括算法程序,输入的初始数据,和算法执行过程中所需的额外空间
输入数据大小 N
- 指算法处理的输入数据量;根据不同算法,具有不同定义
- 排序算法:N 代表需要排序的元素数量
- 搜索算法:N 代表搜索范围的元素总数,例如数组大小、矩阵大小、二叉树节点数、图节点和边数等
如何看出时间单元规律
-
例:int n = 100; for (int i=0; i<n; i++) {System.out.println(“Test”)}
-
花费两个时间单元:int n =100、int i = 0
-
花费n个时间单元:System.out.println(“Test”)、i++
-
花费n+1个时间单元:i<n
-
共花费3n+3个时间单元、程序消耗的时间和n成线性关系
-
时间复杂度:O(n)。当n非常大时,常数3和n的系数3对结果的影响很小。所以忽略最高次项,并忽略该项的系数,还有低阶项(n和n^2,n是低阶项)
类别:
复杂度 | 描述 |
---|---|
O(1) | 最低复杂度,耗时/耗空间与输入数据大小无关(常数阶) |
O(n) | 数据量增大几倍,耗时也增大几倍 |
O(n^2) | 对n个数排序,需要扫描n*n次 |
O(n^3) | 对n个数排序,需要扫描n*n*n次 |
O(log n) | 当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍) |
O(nlog n) | 就是n乘以logn,当数据增大256倍时,耗时增大256*8=2048倍。这个复杂度高于线性低于平方 |
O(2^n) | 对n个数排序,需要扫描2*2*2…的n次(n个2相乘) |
O(n^n) | 对n个数排序,需要扫描n*n*n…的n次(n个n相乘) |
O(m + n) | 等同于O(n) |
O(m * n) | 等同于O(n^2) |
线性函数 | 随着自变量的增大会呈线性增长、如O(n) |
对数函数 | 随着自变量的增大,因变量增长的很慢、如O(log n) |
比较,从小到大:
- O(1) < O(log n) < O(n) < O(nlog n) < O(n^2) < O(n^3) < O(2^n) <
O(n!) < O(n^n)
练习算法,那我肯定要推荐 LeetCode:
https://leetcode-cn.com/