复杂度与线性表
1.复杂度(Complexity)
衡量算法好坏的的时候,两个主要维度(时间|空间)
复杂度衡量算法好坏的一个尺度/标准
1)时间复杂度(重点)
2)空间复杂度
2.时间复杂度
第一反应:算法的运行时间
因为运行环境的不确定,所以,直接拿运行时间去衡量不合理
CPU主频 单位时间内,运行的指令个数
CPU每秒运行的指令个数是不变的
考察算法的运行时间------>考察算法运行需要的指令个数
算法运行的指令个数和因素(数据规模 n)有关系
冒泡排序(10/10000)
指令个数=F(n)
所以:
1.时间复杂度,求F(n)
大O渐进表示法(不求甚解的过程)
1)只保留最高次项
2)最高次的项的项数化为1
O(F(N))=O(N^2)
3.算法有多种情况需要考察
最好 平均 最坏
O(1) O(n) O(n)
二分查找:
1)最坏情况没找到
上次:区间内 1个数
再上 2个数
再上 4个数
时间复杂度 O(log(n));(一般默认为2为底)
常见的时间复杂度:O(1), O(log(n)), O(n), O(n*log(n)), O(n^2)
递归函数求阶乘:O(n)
递归斐波那契数:O(2^n)(时间复杂度就是计算结点个数,利用不求甚解的过程)
结论:如果一个算法是O(2^n),基本没有用
3.空间复杂度
算法执行过程中,占用的额外空间和数据规模n的关系的大O渐进表示法
开辟空间;
1)栈上的局部变量/形参
2)对上的对象(数组、其他对象)
3)如果是递归方法,考虑调用栈的占用情况
总结:复杂度(不求甚解即估算)
衡量算法好坏刻度,有两个维度
时间复杂度:通过算法的指令个数衡量
空间复杂度
大O渐进法 1.最高次保留2.系数=1
线性表
1.线性结构
2.树形结构
3.图形结构(不讲)
4.排序
1.线性结构
1)数据逻辑上有连续性,物理存储上也有连续性 顺序表
2)………………………,物理存储上不一定连续 链表
顺序表:
创建/销毁
*增/*删/查/改
访问第n个元素的时候,时间复杂度要求O(1)
增:头插/尾插/中间插入(给定下标)
删:头删/尾删/中间删除(给定下标)
查:indexOf(element)
改:set(int index,int value)
访问:get (int index)
array[空间的下标]=array[数据的下标]
2.扩容:
1)扩容的条件:在插入之前,size==array.length;
2)如何扩容(搬家)
(1)申请新房子(1.5倍-2倍) java中通常1.5倍
(2)把东西都搬过去
(3)朋友圈通知自己的新家
(4)把旧的房子推掉
3)所有插入都需要考虑扩容
时间复杂度
头插、头删、中间插入、中间删除 O(n)
尾插 平均 O(1) 均摊 O(1)
尾删 O(1)
会触发扩容的条件 O(n)