理解不了动态规划会对后端程序员职业发展有哪些影响?

2021-05-17 19:06:14 +08:00
 zhoudaiyu

普通后端程序员,非算法岗

4927 次点击
所在节点    程序员
33 条回复
ysn2233
2021-05-17 19:07:35 +08:00
没影响
werls
2021-05-17 19:07:41 +08:00
平时就 crud 。有什么影响?
secsilm
2021-05-17 19:11:02 +08:00
这和是否算法岗( AI )无关吧,
index90
2021-05-17 19:13:12 +08:00
被面试虐了?用来在众多合适的候选人中,继续筛选用的。
LeeReamond
2021-05-17 19:29:45 +08:00
如果你指不能设计 dp 算法的话,没什么影响,应该大多数人不具备这个能力。如果你指不能理解个别算法的话,应该没什么影响。如果你无法照本宣科实现?那似乎发展会非常受限?
WhereverYouGo
2021-05-17 19:52:20 +08:00
有概率无法通过字节、阿里、腾讯 or 其他公司的某一轮面试😼
Sasasu
2021-05-17 20:24:13 +08:00
你先撇开状态转移方程那一堆。

假设你需要实现一个阶乘 API,输入一个数,输出这个数的阶乘.

然后,假设你的机器硬件层面运算 * 特别慢,你给 f(x) 加上了个缓存。
每次先看看缓存里有没有结果,有就直接返回。

这就是一维动态规划了,开一个数组作为缓存,T[n] 中 n 就是输入 T[n] 就是结果,转移方程:
f(x) = f(x-1) * 1, f(0) = 1

这和你无脑加缓存有啥区别
powerman
2021-05-17 20:31:38 +08:00
@Sasasu 这只是动态规划的另外一种实现方式,实际上递归调用是与迭代递推是等价的,而且前者比后者更容易理解与实现,

DP 的难点不是编程,难点是推导出递推方程式,而且推导递推公式非常难,而且不是那么显然,而用递归缓存子问题的结果是比较容易理解的方式,实现起来比较容易,维护比较简单,从工程的角度来讲,迭代的递推编程是不可取的,可维护性与可读性都很差。
mckelvin
2021-05-17 20:49:12 +08:00
其实你能理解的,就是高中数学里讲的「数学归纳法」。但是理解了数学归纳法不代表每一道这类题目都会做,做得少不会做也很正常。日常写后端最常见的用处就是面试,实际工作中几乎不会遇到。如果不喜欢为了面试而刻意学习动态规划,那就躲开上来就刷算法题的公司吧!
opengps
2021-05-17 20:57:04 +08:00
hr 最喜欢问的无聊问题,问你人生规划,答不上来的瞎判定为没目标的摸鱼党
zhoudaiyu
2021-05-17 20:57:22 +08:00
@ysn2233
@werls
@secsilm
@index90 确实是面试受虐了…
@LeeReamond 照本宣科是背题么
@Sasasu 有点恐惧动态规划,而且我理解算法本身就很慢,归并排序都看了很久,就是递归没学明白啊
@powerman 现在都理解不了例题….
@mckelvin 很少有不问算法的了吧,面个小公司都问个不停
ClericPy
2021-05-17 21:54:37 +08:00
#10 楼经典...

我的人生规划就是动态规划, 走一步看一步
learningman
2021-05-17 22:02:57 +08:00
@ClericPy 那算不上动态规划,动态规划是有严格的公式的。。。
emSaVya
2021-05-17 22:08:11 +08:00
@ClericPy 人生必然是 greedy 的 要能 dp 那可太爽了
yogogo
2021-05-17 22:11:26 +08:00
@opengps 实在是想不明白 hr 这么问对公司来说有啥意思
namelosw
2021-05-17 22:15:36 +08:00
> 有点恐惧动态规划,而且我理解算法本身就很慢,归并排序都看了很久,就是递归没学明白啊

动态规划可以简单约等于递归,你没明白动态规划是因为你没明白递归。

写动态规划步骤:
1. 忘记其他的所有东西,状态转移方程之类的,只练写低效递归,保证逻辑正确
2. 用字典缓存参数对应的函数结果,这个叫 memoization,如果用 Python 就是直接加个 @lru_cache 就行了
3. 用写好的函数打印前几个结果,找一下规律,然后把内外翻过来,从自顶向下翻译成自底向上就是 DP 了

专心练第一步就行,熟悉了之后后面两部手到擒来。DP 和 memoization 是方向相反效果类似的,先写 memoization 要比 DP 容易很多。


> 归并排序都看了很久

不光是递归没明白,如果你只熟悉递归看明白归并其实还是很困难,算法有很多套路的。

归并是二叉树后序遍历,因为是后合并,所以就是后序遍历,你把二叉树后序遍历练几遍就会发现代码形状是一样的。
反过来快排就是二叉树前序遍历,因为是先交换,交换完后面就没事了,所以是前序。

你感觉很多人看起来理解力爆炸,其实只是他们练得多,而不是聪明。你看一段代码要从 0% 理解到 100%,他看一段代码识别一个模板就等于看完 80%了,再把 20%关键点看一下就懂了。
namelosw
2021-05-17 22:16:52 +08:00
@ClericPy 你要是不说后半句可能还不会露馅得这么明显……
ilovekobe1314
2021-05-17 22:17:54 +08:00
@namelosw 我也是 对面试题非常恐惧 感觉大佬说的很有道理,学习下
opengps
2021-05-17 22:20:13 +08:00
看了半天怎么感觉“动态规划”说的有歧义啊,这到底是技术问题还是职业发展问题?
ClericPy
2021-05-17 23:10:45 +08:00
@learningman
@namelosw

前半句是之前看到 "人生不可动态规划" 直接反向引用调戏 HR, 后半句确实理解偏了, 太久没关注 DP 了(以前偶尔刷题遇到), 只有点递归和记录子问题最优解的印象, 刚才又搜搜引擎复习了一遍...

@emSaVya
如果人生在走下坡路, 前一步总是最优... 现在越活越丧气

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/777499

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX