This commit is contained in:
ranwenjie
2021-10-11 10:35:23 +08:00
parent 0a43530e64
commit 8f0e12be15
5 changed files with 64 additions and 10 deletions
+3 -3
View File
@@ -314,14 +314,14 @@ final Node<K,V>[] resize() {
### JDK7 和 8 HashMap 有什么区别? ### JDK7 和 8 HashMap 有什么区别?
* JDK8 实现引入红黑树,优化链表过长的查询效率 * JDK8 实现引入红黑树,优化链表过长的查询效率;当链表长度大于8是链表的存储结构会被修改成红黑树的形式, 查询效率从O(N)提升到O(logN)。链表长度小于6时,红黑树的方式退化成链表。
* 1.7 采用头插法,1.8采用尾插法; 解决多线程中出出现链表成环的问题 ; (hashmap本来就是非线程安全的,为啥要在多线程中使用hashmap) * 1.7 采用头插法, 链表插入是从链表头部插入 ; 1.8采用尾插法, 因此在resize的时候仍然保持原来的顺序; 解决并发多线程中出出现链表成环的问题 ; (hashmap本来就是非线程安全的,为啥要在多线程中使用hashmap)
### 链表上使用的头插还是尾插方式? ### 链表上使用的头插还是尾插方式?
1.7 采用头插法,1.8采用尾插法; 解决多线程中出出现链表成环的问题 1.7 采用头插法,1.8采用尾插法; 解决多线程中出出现链表成环的问题, 因此在resize的时候仍然保持原来的顺序
### 多线程下死循环问题 ### 多线程下死循环问题
+1 -1
View File
@@ -19,7 +19,7 @@
#### 大整数乘法 #### 大整数乘法
如 26542123532213598*345987342245553677884 如 `26542123532213598*345987342245553677884`
+37 -5
View File
@@ -1,18 +1,40 @@
# 动态规划DP # 动态规划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. 划分问题 1. 划分问题
@@ -31,3 +53,13 @@
* 最短路径 * 最短路径
* 0-1 背包问题 * 0-1 背包问题
+17
View File
@@ -13,6 +13,23 @@
回溯法求解问题时,一般是一边建树,一边遍历该树;且采用非递归方法。 回溯法求解问题时,一般是一边建树,一边遍历该树;且采用非递归方法。
## 代码框架
```
result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
```
## 全排列问题 ## 全排列问题
> n 个不重复的数,全排列共有 n! 个 > n 个不重复的数,全排列共有 n! 个
+6 -1
View File
@@ -11,6 +11,10 @@
> 自顶向下的递归,自底向上是迭代 > 自顶向下的递归,自底向上是迭代
递归运行效率较低,因为有函数调用的开销,递归多次也可能造成栈溢出。
## 斐波那契数列 ## 斐波那契数列
fib(n)=fib(n-1)+fib(n-2) fib(n)=fib(n-1)+fib(n-2)
@@ -134,5 +138,6 @@ public static LinkedNode mergeSeqLink(LinkedNode l1, LinkedNode l2){
快速排序 快速排序
递归运行效率较低,因为有函数调用的开销,递归多次也可能造成栈溢出。