时间复杂度
算法中的基本操作的执行次数,被称为算法的时间复杂度。
我们会用大O符号表示法
T(n)=O(f(n))
举个例子
我们用一个单位时间来表示,第一行的耗时就是一个单位时间,第三行和第四行都是n个单位时间。(第二行和第五行都是符号,可以忽略)所以总时间是2n+1;即:T(n)=2n+1*单位时间。可以看出,这个算法的时耗是跟随着n的变化而变化的。如果当你无限大的时候,那么(2n+1)中的常数1和倍数2的意义并不大,因此可以直接简化为T(n)=O(n)。
常见的时间复杂度量级(从低到高)
常数阶O(1)
对数阶O(logn)
线性阶O(n)
线性对数阶O(nlogn)
平方阶O(n^2)
指数阶O(2^n)
阶乘阶O(n!)
最差与最佳时间复杂度
当num[?,...,1],当末尾元素为1时,需要历遍数组,此时达到最差时间复杂度O(N)
当num[1,...,?],当首位元素为1时,无论数组多长都不需要历遍数组,此时达到最佳时间复杂度O(1)
空间复杂度
算法相关空间
1.输入空间(输入数据)
2.暂存空间(暂存数据 栈帧空间 指令空间)
3.输出空间(输出数据)
常见类型
尾递归
函数在尾位置调用自身
特点
1.在尾部调用的是自身函数
2.使计算机占用常量栈空间
数据结构
数据结构是在计算机中组织与存储数据的方式
分类
主要分为逻辑结构与物理结构
数组
优点
访问元素速度高效
缺点
初始化后长度不可变
插入或删除元素效率低下
链表
一种线性数据结构,其中每个元素都是单独的对象,各个元素之间通过指针连接
优点
插入与删除节点操作效率高
缺点
链表访问终点效率低
链表的内存占用高
常见链表类型
单向链表
环形链表
双向链表