动态规划本质是不是就是递归算法,再加上记忆功能呢?
- [ ] 动态规划的本质 #share
动态规划本质是不是就是递归算法,再加上记忆功能呢?
动态规划常用来求解最优化问题,它们不仅包含重叠子问题,还具有另外两大特性:最优子结构、无后效性
非常好的问题。让我为您详细解释这些概念。
最优化问题是指在给定的约束条件下,寻找可能解中的最佳解(最大值或最小值)。例如: - 寻找最短路径 - 最大化利润 - 最小化成本
最优子结构是指问题的最优解包含其子问题的最优解。换句话说,可以通过组合子问题的最优解来构造原问题的最优解。
特点: - 问题可以被分解为更小的子问题 - 子问题的最优解能够用来构造原问题的最优解
例子:最短路径问题 如果从A到C的最短路径经过B,那么A到B的这段路径一定是A到B的最短路径,B到C的这段路径一定是B到C的最短路径。
无后效性是指某阶段的状态一旦确定,则此后过程的演变不再受此前各状态及决策的影响。
特点: - 当前状态仅与前一个状态有关,与更早的状态无关 - **未来的决策只依赖于当前状态,不依赖于如何达到当前状态 ** 例子:0-1背包问题 在考虑是否将第i个物品放入背包时,只需要考虑当前背包的剩余容量和第i个物品的价值,而不需要关心背包中已经放入了哪些物品。
让我们通过一个简单的例子来说明这些概念:
问题:计算从1到n的最大连续子数组和。
```python def max_subarray_sum(arr): n = len(arr) dp = [0] * n dp[0] = arr[0]
for i in range(1, n):
dp[i] = max(arr[i], dp[i-1] + arr[i])
return max(dp)
arr = [-2, 1, -3, 4, -1, 2, 1, -5, 4] print(max_subarray_sum(arr)) # 输出: 6 ```
在这个例子中:
最优化问题:我们在寻找最大的连续子数组和。
最优子结构:
最优解构造:原问题的最优解是所有子问题最优解中的最大值。
无后效性:
未来的决策不会影响当前的决策。
重叠子问题:
通过理解这些特性,我们可以更好地识别和解决适合使用动态规划的问题。这些特性使得我们能够将复杂问题分解为更小的子问题,并有效地重用子问题的解来构建最终的最优解。
动态规划也对问题进行递归分解,但与分治算法的主要区别是,动态规划中的子问题是相互依赖的,在分解过程中会出现许多重叠子问题。
您提出了一个很好的问题。我来解释一下动态规划和分治算法的区别,并通过一个简单的例子来说明。
动态规划和分治算法的主要区别:
分治算法:子问题通常是独立的。
重叠子问题:
分治算法:子问题通常不重叠。
解决方式:
让我们通过斐波那契数列的计算来举例说明:
斐波那契数列定义:F(n) = F(n-1) + F(n-2),其中 F(0) = 0, F(1) = 1
python
def fibonacci_divide_conquer(n):
if n <= 1:
return n
return fibonacci_divide_conquer(n-1) + fibonacci_divide_conquer(n-2)
这个实现会导致大量重复计算。例如,计算 F(5) 时:
F(5)
├── F(4)
│ ├── F(3)
│ │ ├── F(2)
│ │ │ ├── F(1)
│ │ │ └── F(0)
│ │ └── F(1)
│ └── F(2)
│ ├── F(1)
│ └── F(0)
└── F(3)
├── F(2)
│ ├── F(1)
│ └── F(0)
└── F(1)
可以看到,F(3)、F(2)等被重复计算了多次。
python
def fibonacci_dp(n):
if n <= 1:
return n
dp = [0] * (n + 1)
dp[1] = 1
for i in range(2, n + 1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]
这个实现避免了重复计算。我们只计算每个子问题一次,并将结果存储在 dp 数组中。
通过这个例子,我们可以看到:
这就是为什么在处理具有重叠子问题的问题时,动态规划通常比分治算法更有效。动态规划利用了问题的这种结构,通过存储和重用子问题的解来提高效率。
我们直接看解法
递归解法:
```Java class Solution { public ListNode mergeTwoLists(ListNode list1, ListNode list2) { if (list1 == null){ return list2; } if (list2 == null){ return list1; }
if (list1.val <= list2.val){
list1.next = mergeTwoLists(list1.next, list2);
return list1;
}
else{
list2.next = mergeTwoLists(list1, list2.next);
return list2;
}
}
} ```
哈希集合 HashSet
什么情况下会选择使用 HashSet 而不是 HashMap:
就是一定要用字符串的 equals 方法比较两个字符串是否相同,不要用 == 比较
==
是在比较是否是同一个对象
分布式系统 - 全局唯一ID实现方案
JDK8线程池-ThreadPoolExecutor动态调整corePoolSize与maximumPoolSize
Comparison method violates its general contract!
如何判断一个字符串是否经过base64加密过?
为什么在平均情况下快速排序比堆排序要优秀?
如何评价极客时间上王争的「数据结构与算法之美」的爆火?
研究者July在计算机和机器学习领域的水平怎么样?
LeetCode按照怎样的顺序来刷题比较好?
大数据开发像Hadoop、Spark需要很强的数学和算法功底吗?
什么才算是真正的编程能力?
的
为什么下面程序递归计算斐波那契数列java比c++要快?
函数式编程所倡导使用的「不可变数据结构」如何保证性能?
如何把任意的递归函数写成利用堆栈的非递归形式?
操作 AST 树都有哪些标准算法,各自的优缺点是什么?
如何在程序中将中缀表达式转换为后缀表达式?
有哪些算法惊艳到了你?
你见过最差的算法工程师能差到什么程度?
刷完 LeetCode 是什么水平?能拿到什么水平的 offer?
如何看待 Thomas Cormen 所说看完《算法导论》需要的时间?
如何正确地撸《算法导论》?
如何理解算法时间复杂度的表示法,例如 O(n²)、O(n)、O(1)、O(nlogn) 等?
程序语言中的取余是如何实现的?
有人没事儿玩Hackerrank网站都拿到多高的rank了?
函数式编程如何实现动态规划和记忆化搜索?
如何理解动态规划?
SICP换零钱迭代方法实现,是如何写的?
WeakHashMap中关于queue的疑惑 ?
graph convolutional network有什么比较好的应用task?
如何通俗的解释计算机中“合一(unification)”这个概念 ?
有没有简单易懂的算法来判定一个语言是/不是图灵完全的?
什么是动态规划(Dynamic Programming)?动态规划的意义是什么?
身份证号的末位校验码算法最后一步模11是基于什么考虑?
写尾递归函数有什么规律或技巧吗?
为什么说递归效率低?
推荐系统或信息发现领域,有哪些经典的论文?
一个算法工程师的日常是怎样的?
程序员必须掌握哪些算法?
想学好计算机算法,是否需要重新学数学呢?
首先分配一块内存空间做 bit 数组,数组的 bit 位初始值全部设为 0。 加入元素时,采用 k 个相互独立的 Hash 函数计算,然后将元素 Hash 映射的 K 个位置全部设置为 1。 检测 key 是否存在,仍然用这 k 个 Hash 函数计算出 k 个位置,如果位置全部为 1,则表明 key 存在,否则不存在。
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之
分治法的设计思想
linear regression, dis FULPLQDQWIXQFWLRQFODVVLāHUV1D°YH%D\HVFODVVLāHUV support vector machines, logistic regression classi āHUVDQGGHFLVLRQWUHHFODVVLāHU
linear regression, dis-criminant function classifiers, Naive-Bayes classifiers,support vector machines,logistic regression classi-fiers, and decision tree classifiers.
/DWHQW6HPDQWLF$QDO\VLV
隐含语义分析
“随机森林”机器学习算法
machine learning algorithms
机器学习算法。该算法使用两种类型的数据:(a)静态数据:人口统计数据,如年龄、性别、地理区域、先前教育;(b)行为数据:学生在VLE主办的课程中的互动。这些数据来源被证明是预测学生提交作业的重要指标。
Latent Semantic Analysis
The “Random Forest” machine learning algorithm
随机深林机器学习算法