diff --git a/3 Hash Table/HashMap in Java.md b/3 Hash Table/HashMap in Java.md index 4fa6590..f9854d3 100644 --- a/3 Hash Table/HashMap in Java.md +++ b/3 Hash Table/HashMap in Java.md @@ -314,14 +314,14 @@ final Node[] resize() { ### JDK7 和 8 HashMap 有什么区别? -* JDK8 实现引入红黑树,优化链表过长的查询效率 -* 1.7 采用头插法,1.8采用尾插法; 解决多线程中出出现链表成环的问题 ; (hashmap本来就是非线程安全的,为啥要在多线程中使用hashmap) +* JDK8 实现引入红黑树,优化链表过长的查询效率;当链表长度大于8是链表的存储结构会被修改成红黑树的形式, 查询效率从O(N)提升到O(logN)。链表长度小于6时,红黑树的方式退化成链表。 +* 1.7 采用头插法, 链表插入是从链表头部插入 ; 1.8采用尾插法, 因此在resize的时候仍然保持原来的顺序; 解决并发多线程中出出现链表成环的问题 ; (hashmap本来就是非线程安全的,为啥要在多线程中使用hashmap) ### 链表上使用的头插还是尾插方式? -1.7 采用头插法,1.8采用尾插法; 解决多线程中出出现链表成环的问题 +1.7 采用头插法,1.8采用尾插法; 解决多线程中出出现链表成环的问题, 因此在resize的时候仍然保持原来的顺序 ### 多线程下死循环问题 diff --git a/8 Algorithms Analysis/分治算法.md b/8 Algorithms Analysis/分治算法.md index 87aa1a2..832f8b1 100644 --- a/8 Algorithms Analysis/分治算法.md +++ b/8 Algorithms Analysis/分治算法.md @@ -19,7 +19,7 @@ #### 大整数乘法 -如 26542123532213598*345987342245553677884 +如 `26542123532213598*345987342245553677884` diff --git a/8 Algorithms Analysis/动态规划.md b/8 Algorithms Analysis/动态规划.md index ab5eca7..5e43aba 100644 --- a/8 Algorithms Analysis/动态规划.md +++ b/8 Algorithms Analysis/动态规划.md @@ -1,18 +1,40 @@ # 动态规划DP -动态规划(英语:Dynamic programming,简称 DP),通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 +动态规划(英语:Dynamic programming,简称 DP),通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。复杂问题不能分解成几个子问题,而分解成一系列子问题 ; -复杂问题不能分解成几个子问题,而分解成一系列子问题;DP通常基于一个递推公式及一个(或多个)初始状态,当前子问题解由上一次子问题解推出。 +DP通常基于一个递推公式及一个(或多个)初始状态,当前子问题解由上一次子问题解推出。 -状态 -状态转移方程 -递推关系 动态规划算法的关键在于解决冗余,以空间换时间的技术,需要存储过程中的各种状态。可以看着是`分治算法`+`解决冗余` 使用动态规划算法的问题的特征是`子问题的重叠性`,否则动态规划算法不具备优势 +动态规划的核心思想就是穷举求最值; 动态规划问题的一般形式就是求最值,动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说让你求最长递增子序列呀,最小编辑距离呀等等。 + + + +* 状态 +* 状态转移方程, 这一步最为困难 +* 状态压缩 + + + +### DP 解题模板 + + +``` +# 初始化 base case +dp[0][0][...] = base + +# 进行状态转移 +for 状态1 in 状态1的所有取值: + for 状态2 in 状态2的所有取值: + for ... + dp[状态1][状态2][...] = 求最值(选择1,选择2...) +``` + + ####基本步骤 1. 划分问题 @@ -31,3 +53,13 @@ * 最短路径 * 0-1 背包问题 + + + + + + + + + + diff --git a/8 Algorithms Analysis/回溯法.md b/8 Algorithms Analysis/回溯法.md index 92d908d..9599935 100644 --- a/8 Algorithms Analysis/回溯法.md +++ b/8 Algorithms Analysis/回溯法.md @@ -13,6 +13,23 @@ 回溯法求解问题时,一般是一边建树,一边遍历该树;且采用非递归方法。 +## 代码框架 + +``` +result = [] +def backtrack(路径, 选择列表): + if 满足结束条件: + result.add(路径) + return + + for 选择 in 选择列表: + 做选择 + backtrack(路径, 选择列表) + 撤销选择 +``` + + + ## 全排列问题 > n 个不重复的数,全排列共有 n! 个 diff --git a/8 Algorithms Analysis/递归.md b/8 Algorithms Analysis/递归.md index 794b88a..4834141 100644 --- a/8 Algorithms Analysis/递归.md +++ b/8 Algorithms Analysis/递归.md @@ -11,6 +11,10 @@ > 自顶向下的递归,自底向上是迭代 +递归运行效率较低,因为有函数调用的开销,递归多次也可能造成栈溢出。 + + + ## 斐波那契数列 fib(n)=fib(n-1)+fib(n-2) @@ -134,5 +138,6 @@ public static LinkedNode mergeSeqLink(LinkedNode l1, LinkedNode l2){ 快速排序 -递归运行效率较低,因为有函数调用的开销,递归多次也可能造成栈溢出。 + +