Redian新闻
>
感觉careercup的作者对DP的理解有问题
avatar
感觉careercup的作者对DP的理解有问题# JobHunting - 待字闺中
J*a
1
看过第五版的人说说 是不是这样
她的所谓DP都是把中间结果存在一个hashTable里
下次算之前看看那里面有没有
但真的DP有两个要点
1)保存子问题的结果
2)子问题有序
但是作者几乎从没注意第二个问题 所有的还按递归算法那么算,就多加个hash
所以很多题依然是指数复杂度的 (部分题真DP是可以降到n^2或n^3)
大家觉得呢
avatar
d*t
2
子问题自然就有序了的吧。再说有序无序对复杂度也没影响。

【在 J*****a 的大作中提到】
: 看过第五版的人说说 是不是这样
: 她的所谓DP都是把中间结果存在一个hashTable里
: 下次算之前看看那里面有没有
: 但真的DP有两个要点
: 1)保存子问题的结果
: 2)子问题有序
: 但是作者几乎从没注意第二个问题 所有的还按递归算法那么算,就多加个hash
: 所以很多题依然是指数复杂度的 (部分题真DP是可以降到n^2或n^3)
: 大家觉得呢

avatar
J*a
3
不是啊 她还是按递归那个顺序算
比如背包问题 dp的矩阵应该一行一行的算 矩阵每个元素只要遍历一次
比如断字问题 就应该先算对角线 向左上方向遍历
而且DP都是先算小子问题 在算大子问题 顺序都是精心安排才能最大限度降复杂度
但是她还是按照递归算法访问那些子问题 所以先碰到的是大问题 因此就肯定有很多
mismatch (在hashtable里找不到) 所以复杂度肯定高了啊

【在 d********t 的大作中提到】
: 子问题自然就有序了的吧。再说有序无序对复杂度也没影响。
avatar
s*1
4
那个本来也是DP,用MEMO实现的DP,实现方式不同而已,而且这种写起来简单,在有些
情况下还能避免求解无用的子问题。lz可能只是以前没见过这个吧,没问题的。但是那
本书本身质量不高是真的。
avatar
b*7
5
同意shaoshuai321。
memoization方式处理DP问题,这样可以让DP按top-down的方式递归实现。
在有些bottom-up方式难处理的场合,用这种技术可以很方便的写出code。
比如个人认为这个题用memoization难度会降低很多,也容易bug free
http://www.geeksforgeeks.org/largest-independent-set-problem/
avatar
t*d
6
只要子问题没有循环依赖就应该没问题

★ 发自iPhone App: ChineseWeb 7.8

【在 J*****a 的大作中提到】
: 看过第五版的人说说 是不是这样
: 她的所谓DP都是把中间结果存在一个hashTable里
: 下次算之前看看那里面有没有
: 但真的DP有两个要点
: 1)保存子问题的结果
: 2)子问题有序
: 但是作者几乎从没注意第二个问题 所有的还按递归算法那么算,就多加个hash
: 所以很多题依然是指数复杂度的 (部分题真DP是可以降到n^2或n^3)
: 大家觉得呢

avatar
p*2
7
作者对DP的理解局限了。不过她的理解对于初学DP也算是挺有用的。面试这么干也可以
。更容易bug free。
avatar
J*a
8
er。。。。
我还是持保留意见
比如17.14的答案就有问题,而且她的所谓dp算法复杂度明显比传统Bottom up的DP高(
有指数次递归调用)
avatar
J*a
9
我承认这样写起来简单
但是这样做,有些本可降到n^2或者n^3的题,用这种方法还是需要指数复杂度,因为有
指数次函数调用

【在 s**********1 的大作中提到】
: 那个本来也是DP,用MEMO实现的DP,实现方式不同而已,而且这种写起来简单,在有些
: 情况下还能避免求解无用的子问题。lz可能只是以前没见过这个吧,没问题的。但是那
: 本书本身质量不高是真的。

avatar
b*n
10
memoization啊,clrs里面也有,时间复杂度上没有问题的,
最大问题是space complexity,及有可能stack overflow

【在 J*****a 的大作中提到】
: 看过第五版的人说说 是不是这样
: 她的所谓DP都是把中间结果存在一个hashTable里
: 下次算之前看看那里面有没有
: 但真的DP有两个要点
: 1)保存子问题的结果
: 2)子问题有序
: 但是作者几乎从没注意第二个问题 所有的还按递归算法那么算,就多加个hash
: 所以很多题依然是指数复杂度的 (部分题真DP是可以降到n^2或n^3)
: 大家觉得呢

avatar
s*1
11
你理解错了,不会有指数复杂度,因为每个子问题只算一次,后面就有答案了

【在 J*****a 的大作中提到】
: 我承认这样写起来简单
: 但是这样做,有些本可降到n^2或者n^3的题,用这种方法还是需要指数复杂度,因为有
: 指数次函数调用

avatar
J*a
12
我知道每个子问题只算一次
但是递归调用还是可能有指数次 比如第17章最后一题的答案
因为它没有按子问题从小到大的顺序计算,所有查hash表有很多次是查不到的,查不到
就要调用
就算每次递归调用是O(1) 所以解法还可能是指数复杂度

【在 s**********1 的大作中提到】
: 你理解错了,不会有指数复杂度,因为每个子问题只算一次,后面就有答案了
avatar
J*a
13
ok 不是指数次 比Dp稍高 但不是指数
avatar
t*a
14
memoize是相当聪明而且省事的办法。它只算需要算的,复杂度不会比递推高。
建议楼主耐心下来把两种方法都做做看以后再下结论。
avatar
t*a
15
space complexity是个问题,有些问题不需要保存所有中间计算结果的。如果语言级别
提供比较聪明的memoize方式,可以有选择的遗忘,就好办了。
stack overflow的事情很讨厌。by default, stack内存就只有1M,相对现在的机器容
量而言太少了。JVM可以自己调节stack分配大小,从而可以递归很多次。

【在 b******n 的大作中提到】
: memoization啊,clrs里面也有,时间复杂度上没有问题的,
: 最大问题是space complexity,及有可能stack overflow

avatar
p*2
16

支持大牛。很多时候dfs反而更快

【在 t****a 的大作中提到】
: memoize是相当聪明而且省事的办法。它只算需要算的,复杂度不会比递推高。
: 建议楼主耐心下来把两种方法都做做看以后再下结论。

avatar
f*r
17
计算的overhead在于hash function和hashmap access,这两个忽略的话topdown方法的
复杂度<=bottom up方法的复杂度吧。

★ 发自iPhone App: ChineseWeb 7.8

【在 J*****a 的大作中提到】
: ok 不是指数次 比Dp稍高 但不是指数
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。