算法基础概念
概念
1. 运算
2. 排序
3. 查找
4. 在计算机领域里,算法是一系列程序指令,用于处理特定的运算和逻辑问题。衡量算法优劣的主要标准是时间复杂度和空间复杂度。
时间复杂度(计算代码运行的时间成本)
1.运行的时间长度
2.基本操作执行次数
3.基本操作执行次数的函数 T(n)
**渐进时间复杂度**
若存在函数 f(n),使得当 n 趋近于无穷大时,T(n)/f(n) 的极限值为不等于零的常数,则称 f(n) 是 T(n) 的同数量级函数。记作 T(n)=O(f(n)),称为 O(f(n)),O 为算法的渐进时间复杂度,简称为时间复杂度。因为渐进时间复杂度用大写 O 来表示,所以也被称为 大 O 表示法
4.如何推导出时间复杂度呢?有如下几个原则。
- 如果运行时间是常数量级,则用常数 1 表示
- 只保留时间函数中的最高阶项
- 如果最高阶项存在,则省去最高阶项前面的系数
5.时间复杂度是对一个算法运行时间长短的量度,用大 O 表示,记作 T(n)=O(f(n))。常见的时间复杂度按照从低到高的顺序,包括 O(1)、O(log n)、O(n)、O(n log n)、O(n^2)等
空间复杂度(计算代码运行的空间成本)
1.程序占用空间大小的计算公式记作 S(n)=O(f(n)),其中 n 为问题的规模,f(n) 为算法所占存储空间的函数
2.常见的空间复杂度有下面几种情形
常量空间:当算法的存储空间大小固定,和输入规模没有直接的关系时,空间复杂度记作 O(1)
线性空间:当算法分配的空间是一个线性的集合(如数组),并且集合大小和输入规模 n 成正比时,空间复杂度记作 O(n)
二维空间:当算法分配的空间是一个二维数组集合,并且集合的长度和宽度都与输入规模 n 成正比时,空间复杂度记作 O(n^2)
递归是一个比较特殊的场景。虽然递归代码中并没有显式地声明变量或集合,但是计算机在执行程序时,会专门分配一块内存,用来存储「方法调用栈」。
递归空间:「方法调用栈」包括进栈和出栈两个行为。当进入一个新方法时,执行入栈操作,把调用的方法和参数信息压入栈中。当方法返回时,执行出栈操作,把调用的方法和参数信息从栈中弹出,最终,「方法调用栈」的全部元素会一一出栈
由上面「方法调用栈」的出入栈过程可以看出,执行递归操作所需要的内存空间和递归的深度成正比。纯粹的递归操作的空间复杂度也是线性,如果递归的深度是 n,那么空间复杂度就是 O(n)
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,用大 O 表示,记作S(n)=O(f(n))。常见的空间复杂度按照从低到高的顺序,包括O(1)、O(n)、O(n^2)等。其中递归算法的空间复杂度和递归深度成正比