一、哈希表、映射、集合
-
散列表(哈希表
-
Map
- HashMap和HashTable的区别
- HashTable全都加了Synchronized,而且都是数组加链表
- 但是hashMap在1.8以后引入了红黑树的数据结构和扩容优化,而HashTable没有
- HashMap可以键值可以存null,HashTable都不可以为null
- ConcurrentHashMap
- 是线程安全的 ,对桶进行了Synchronized优化
- HashMap和HashTable的区别
-
Set
-
HashSet和 TreeSet的区别
-
都是现成不安全的
-
HashSet是无序的
-
TreeSet是自然排序(默认升序)或定制排序(实现Comparable接口来定制)
-
HashSet可以存一个null,TreeSet不可以
-
-
ConcurrentSkipListSet是线程安全的有序的集合,适用于高并发的场景。
-
-
二、树
1、树的三种遍历
-
前根遍历:根左右 ABCDEFGHK
-
中根遍历:左根右 BDCAEHGKF
-
后跟遍历:左右**根 ** DCBAHKGFE
-
层级遍历:根左右 ABECFDGHK
2、二叉搜索树(二叉有序树、排序二叉树)
- 中序遍历:也就是升序遍历
红黑树:平衡二叉查找树
1、根节点是黑色
2、每个红色节点的两个子节点是黑色
3、最后的叶子节点(NIL)是黑色节点,这里的叶子节点指的是NIL或NULL的叶子节点
4、每个节点是红色或黑色
5、从任一节点到其每个叶子的所有路径的都包含相同数目的黑色节点
三、递归
1、递归规律
- 递归终结条件
- 处理当前层逻辑
- 下探到下一层
- 清理当前层状态(全局变量等需要修改状态的话)
public void recur(int level, int param) {
// terminator
if (level > MAX_LEVEL) {
// process result
return;
}
// process current logic
process(level, param);
// drill down
recur( level: level + 1, newParam);
// restore current status
}
2、递归思维
- 不要人肉进行递归(最大误区)
- 找到最近最简方法,将其拆解成可重复解决的问题(重复子问题)
- 数学归纳法
- 第一点:最简单的条件是成立的,例如:证明 n = 1; n = 2 条件成立,
- 第二点:证明当n 成立的时候,可以推导出 n + 1 也成立的
四、分治、回溯
分治代码模板
def divide_conquer(problem, param1, param2, ...):
# recursion terminator
if problem is None:
print_result
return
# prepare data
data = prepare_data(problem)
subproblems = split_problem(problem, data)
# conquer subproblems
subresult1 = self.divide_conquer(subproblems[0], p1, ...)
subresult2 = self.divide_conquer(subproblems[1], p1, ...)
subresult3 = self.divide_conquer(subproblems[2], p1, ...)
…
# process and generate the final result
result = process_result(subresult1, subresult2, subresult3, …)
# revert the current level states
PS:
因为时间关系。很多homework做得不好,希望有同学帮忙找出不好的地方,感谢!点击进入
因为时间关系。很多homework做得不好,希望有同学帮忙找出不好的地方,感谢!点击进入
因为时间关系。很多homework做得不好,希望有同学帮忙找出不好的地方,感谢!点击进入