说说马工的算法优化

小城往事
楼主 (北美华人网)
我个人认为,算法那个big O, 只有在scale达到一定的大小的时候,才有意义。如果你做的那个东西根本就达不到那个scale,就没有意义。对google和meta那种有几十亿用户的大厂有意义的东西,对普通小厂很可能就根本没意义,因为你离那个scale差得远,你扯什么淡呢
再者,在这个世界上,并不是所有的东西,都有优化的空间,有些东西,它是啥就是啥,不管你高兴不高兴,你也没啥好办法能优化,起码没啥办法能用你刷的算法题里的那种套路来优化。
举个可能不恰当的例子,但意思大家get到就ok。比如九九乘法表这个东西,要背九九81组结果对吧,也就是说如果你用n进制(这里n=10)算数,需要背诵的乘法表就有(n-1)^2项,也就是复杂度为O(n^2)。这个big O好像有点高,但这东西需要优化吗,显然不需要,因为现代人类一般就用10进制,n一般不会比10更大。一些特殊场合顶多用到16进制,这就撑死最大了,谁会在任何场景下会吃饱了撑的用什么100进制,1000进制,1 trillion进制吗?再说就你想优化,你跟我讲讲怎么把九九乘法表这个东西的复杂度优化成O(log n)? 你能吗
再举个例子,假设人的体型是固定的,人身体的体积是身高的三次方,再假设人的密度是固定的,那么人的体重也是身高的三次方,再假设人体消耗的能量(不恰当的类比为系统的耗电量吧)是体重的正比,那身高是n的话,这个能耗就是O(n^3)啊,哇,这个算法也太不优化了。那怎么办,那是不是说明人这种生物就不应该存在?或者说你有办法把人压成相片,那复杂度就降低成O(n^2)了?或者你更牛叉,你能把人搓成长条,那就把复杂度降低成O(n)了,多好啊?哈哈哈。但这个管他三次方,还是四次方,五次方,有所谓吗?人最高能长多高,也就两米多,有人能长10米高,100米高吗?
虽然我举得这两个例子不是代码,但换成代码也是一个道理,首先不是所有代码都值得优化,其次也不是什么代码都有办法来优化。
你信吗
知道什么时候需要优化,什么时候没必要,什么时候能,什么时候不能优化,也是马公最基本的技能。拿到yi个问题,只知道brute force的马公就是不合格啊。只要需要优化,马公就该懂。这没错吧?系统设计不就是问什么时候优化,什么时候不用吗
你到底要说明啥,什么问题都能brute force,所以算法就不需要了?算法就是可以把笨马公的n^3变成n,nlogn这类的。
能优化,你非不做,因为可以用笨办法,这才是你的逻辑吧
不优化的,你还可以用算盘呢,用计算机干嘛
你也可以在山洞里吃生肉活着,为啥还要房子,炉子,洗衣机,冰箱
z
zhshthd
实际工作中当然需要权衡某个代码值不值得优化。这个没错。
面试中问你怎么优化是在考你思维能力(智商)。就像数学考试做题: “1+2+3.。。+10”等于多少,要是加到100, 1000,10000呢?你说“ 什么‘首项加末项乘以项数除以二”,有什么用? 手工加起来不就完了? 你生活中可能要加超过10的数字吗?所以啊,很多东西是不值得优化的。 考这个干嘛?我以后又不是数学家工程师,就去菜市场买买菜,我还有计算器呢”。
你说的乘法表不是一个algorithm, 是一个缓存机制(cache), 用来避免开销更大的计算。这时候如果你吃了某个药,其作用之一是让你的大脑从乘法表格里这个缓存里读取任何结果(就是1-9任何两个数相乘)慢了0.01秒,本来你脑子7x8=56是0.001秒反应,现在是0.011秒。你说不用去查这个药是谁开发的,谁让你吃下去的?
g
gokgs
当然了。要不Python Java golang 各种垃圾语言满天飞。
Scale 上去了,c++ 优势才发挥出来。

l
lnghng
关键是不是这些大厂的话,被考的没有机会在他被招的这份工作中用到优化,而考的那亇也没这亇机会优化。这首先流量要足够大,数据要足够多,而且你要正好有这亇机会接手新的project或分配你任务解决某亇优化问题, 或你的level巳高到允许你插手优化现有project而不至于得罪当初写原始code的那位。 结果是面试官和被面试的两个人就照着书本上的照本宣读一知半解来考,而真到实际工作中完全不会做,比如某亇真实case实际瓶颈是database或者network,然后你在优化big O,做了半天也快不了多少。
s
suixin111
看公司吧。一些公司能跑就行,因为人少工资低。大厂那么多人,才有心思搞这些
f
facet
回复 1楼小城往事的帖子
优化不仅仅是性能上的,同样重要的还有可读性和可维护性,对于中小公司,难道不应该更加注重代码可维护性吗?本来码工水平就差,雇的人还少,要是可维护性还差,那不是雪上加霜吗?
我们有个加拿大来的码工,100% smart and nerd, 闲着没事就琢磨代码重构,纯粹出于热情,他重构过的 pipeline 都非常好用,而且很漂亮,好的代码光是形式上就已经很赏心悦目了,排列整齐得就像长诗一样
B
BearPandaMonkey
谢谢分享,马可一下
b
bubikeqi
学习学习
一个用户
所以大厂马工50万一年,非大厂20万一年啊。