1.数据结构:对大规模数据进行一个合理的规划,提高操作的效率
2.时间复杂度:描述算法的运行时间
假设算法要处理的数据总量时x,x足够大,算法为了达到某个目的 消耗的计算次数时y
(1)y=ax+b x足够大等价于y=x 时间复杂度O(n)
(2)y=ax^2+bx+c x足够大等价于 y=x^2 时间复杂度O(n^2)
(3)y=a x足够大等价于y=1 时间复杂度O(1)
(4)a^y=x y=logax a>=2 时间复杂度O(logn)
快慢 O(1) O(logn) O(n) O(n^2) (理想时间复杂度是前两个)
3.练习:
一.在长度为x的无序数组中找一个数据a,求时间复杂度
解:a在第一个比较一次结束,在第二个比较两次结束,在第三个比较三次结束……在x个比较x次, 求平均 y=x/2 时间复杂度O(n)
二.求1+2+3+4+……+n的值
解:法一:循环依次获取每一个数据,与sum做加法 计算次数y=x O(n)
法二:等差数列套公式sum=(1+x)/2 y=1 O(1)
三.冒泡排序:(将无序数组变成有序数组,前后两两数据进行比较,让小的数据往前走,大的数据往后走,一轮结束之后最大的数据到达正确位置)
解: 第一轮比较x-1次
第二轮比较x-2次
第三轮比较x-3次
……
第k轮运算1次
y=1+2+3+……x-1 =(1+x-1)*(x-1)/2 y=x^2 O(n^2)
四.二分查找法在有序数组中查找数据(left mid right)
第一轮left和right之间有x(x/2^0)个数据比较一次,
第二轮left和right之间有x/2(x/2^1)个数据比较一次,
第三轮left和right之间有x/2/2(x/2^2)个数据比较一次,
第四轮left和right之间有x/2/2/2(x/2^3)个数据比较一次
……
第k轮left和right之间有 x/2^(k-1)个数据比较一次
2^(k-1)=x k=log2x 比较log2x次 O(logn)
4.小技巧快速判断时间复杂度:
确定数据规模,直接对问题规模下手 遍历O(n) 循环减半O(logn) k层循环O(n^k)
5.无序数组存储数据O(n) ……降低时间复杂度 ……有序数组存储数据O(logn)
经历排序过程(时间复杂度为O(n^2) O(nlogn))
用数组通过某一算法决定数据要存储的位置
利用下标num%arr.length……O(1) 问题:两个不同数据计算出来在同一个位置(哈希冲突)
解决:1.加入链表(链表不长O(1),链表很长O(n)) 2.利用有序二叉树降低时间复杂度
树:(二叉树 一个节点最多分出两个叉 和多叉树 一个节点可以分出多个叉)
有序二叉树(节点左边的数值比当前节点小,节点右边的值比当前节点大)(不稳定)
时间复杂度:
第一层 1个数据
第二层 2个数据
第三层 4个数据
第四层 8个数据
……
第k层 2^(k-1)个数据
2^0+2^1+……+2^(k-1)=x k=log2x
时间复杂度为O(logn)
练习构建有序二叉树:5 7 4 2 0 3 1 6
平衡二叉树(节点左边的数值比当前节点小,节点右边的值比当前节点大)(一个结点的左右子树的高度差绝对值不超过一)
四种旋转:RR RL LL lR
练习构建平衡二叉树 5 7 4 2 0 3 1 6