
文章前言
- 【一起学算法】专栏持续更新中,会在这里记录算法学习的过程
- 文末获取【一起学算法】
Github仓库手写算法源码
,一起跟着写一遍吧~- 【一起学算法】中所涉及的部分关于
leetcode
中的原题均可在leetcode官网的运行器通关~
递归
任何递归都可以转换为非递归
Master公式
形如 T(N) = a*T(N/b)+O(N^d) 其中的a、b、d都是常数的递归函数,可以直接通过Master公式来确定时间复杂度
1、如果log(b,a) < d,复杂度为O(N^d)
2、如果log(b,a) > d,复杂度为O(N^log(b,a))
3、如果log(b,a) ==d,复杂度为O(N^d*logN)
T(N) = 2*T(N/2)+O(1);
a=2,b=2,d=0; log(2,2)=1=d;
满足log(b,a)==d,复杂度为O(N^d*logN)
-
不属于T(N) = a*T(N/b)+O(N^d) 其中的a、b、d都是常数的递归函数这种形式的复杂度计算
递归取最大值时先取左边2/3再取右边2/3,这种情况下就是有一部分是重合的 此时T(N) = 2*T(N/3/2)+O(1); a=2,b=3/2,d=0 复杂度为 O(N^log(3/2,2))
Hash表(HashMap)
- 基础类型和非基础类型底层的区别
- 基础类型根据实际情况开辟具体空间进行存储,哪怕需要开辟的空间非常大
- 非基础类型会将引用的类型的内存地址,8字节
- Hash表中的原生基础类型都是按值传递 (其中包括String类型),如果是自定义的类型(非原生自带的)按引用传递
有序表(TreeMap)
-
有序表可用(红黑树、avl树,sb树、跳表)实现
-
Java中TreeMap使用红黑树实现
-
时间复杂度为O(logN)
-
有序表比Hash表多且强大的功能
TreeMap<Integer,String> treeMap = new TreeMap<>(); //最小key System.out.println(treeMap.firstKey()); //最大key System.out.println(treeMap.lastKey()); //<=4 查找离4最近的key System.out.println(treeMap.floorKey(4)); //>=4 查找离4最近的key System.out.println(treeMap.ceilingKey(4));
有序表对非基础类型进行排序时需要自己传一个比较器定义排序规则
源码获取地址
加油小伙伴~ 点击获取算法篇代码~