为什么要单独说是否懂“算法”,程序中算法不是无时无刻都存在吗?

2020-04-14 13:41:16 +08:00
 zictos

·经常在网上看到“算法”这个词,有些招聘要求或者描述某个人的能力的时候甚至说“懂算法”之类的话。

·可是算法不就是程序中的一些计算方法吗?程序中算法无时无刻都在,大部分程序也都是在计算,在进行一些套路来达到目的,如果没有算法又怎么写程序呢?

·既然算法无时无刻都在,就应该代表每个程序员都是懂算法的,不然又怎么能写程序?那为什么又会有“懂算法”一说。去网上查“算法是什么”,很多人也说不清楚,也只是说是程序中的计算方法。

·当然我也知道可能有难易程度的区别,但也不是每个程序员都擅长任何算法吧?即便某个程序员水平低,但有些算法复杂的程序也不代表就写不出来吧?具体能否写出来应该是看情况的,不能一概而论,所以真正的判断标准不应该是是否能写出来吗?扯“算法”干什么?

5268 次点击
所在节点    程序员
54 条回复
ConradG
2020-04-14 13:45:48 +08:00
正常人都会说话,但是显然不是所有正常人都适合去做播音员啊。
artyhacker
2020-04-14 13:57:33 +08:00
可以把招聘相关场合下的“算法”理解成“算法题”.
HongJay
2020-04-14 14:03:18 +08:00
'既然算法无时无刻都在,就应该代表每个程序员都是懂算法的,不然又怎么能写程序?'

这个说的不对,而是

在大多数的软件岗位中都要求在面试的时候懂得底层数据结构和原理。大部分人都是直接调用 API 的,本质上没什么问题,只是不懂底层数据结构的话天花板可能会低一点,没有办法做太难的事情

所以你的论断存在错误。
kop1989
2020-04-14 14:03:52 +08:00
因为程序员的很多能力是很难短期,低成本量化的。
就跟你高考为何是“应试教育”而不是“素质教育”一样。因为“素质教育”没有一个合理且公平的评判体系。
zictos
2020-04-14 14:04:58 +08:00
补充:我个人觉得在写代码实现需要的功能时的 “套路” 是根据经验积累而来的,而不是学了算法就会各种各样的套路
jmc891205
2020-04-14 14:07:04 +08:00
举个傻一点的例子 在有序列表里查找 有的人就知道二分查找 有的人就只能想到遍历
对一些复杂的问题来说 也是这样
zictos
2020-04-14 14:10:21 +08:00
@jmc891205 我没单独学算法,但是当自己需要某些功能的时候会去网上搜索,然后很多人会说到二分查找,慢慢地就在心里知道了有这种办法,积累了很多经验。以后有处理类似有规则的并且数据量大的数据查找的需求的时候就自然会想到二分查找。这样也算是懂算法了吧?
hoyixi
2020-04-14 14:11:25 +08:00
从业人员素质参差不齐,举个类比例子,智能手机,有的人拿来过也不用学,很快就上手了,成为日常工具;有的人界面跳几下就晕了,用都用不利索。

没错,程序离不开算法,但是这一行得从业者不懂的多了去了,而且有些公司也的确不需要懂。
fancy111
2020-04-14 14:12:07 +08:00
在高级中,算法权重比较高。所以会问算法。
而中低级招聘,问算法的纯属装。
另外需要根据公司大小来具体
oahebky
2020-04-14 14:17:00 +08:00
你说的有一定道理。

这里面是有区别的。

比如会不会写程序就是实现:
- 从 1 打印到 100 到 console 上、从 1 打印到指定值 n 到 console 上。
- 找到一个数组中的最小值、指定值。
- 判断一个字符串是不是另一个字符串的子串。

等等,
能够写出这些程序其实就可以写程序了,没有任何问题。

至于
- 快速排序,归并排序
- 二分查找
- 二叉树几种遍历方式,二叉树插入
- 链表、栈、队列数据类型实现
- 归纳假设及增强归纳假设

这些本来就不是必须的。很多软件岗位是不需要这类算法的。
(比如嵌入式驱动层和应用层 99% 都不需要)
用不用,考不考完全看岗位需求。

到了更难的算法那就是专门的算法岗位了。不在我的工作范畴之内。更是不必说。

但是人家就是这么考察,这么整的,你能说怎么办呢?学呗。
no1xsyzy
2020-04-14 14:28:47 +08:00
只是用着用着成这副样子了,专指熟悉理解一些复杂精妙的算法
还有一种是指 “懂如何设计新算法”,而不仅仅是实现。
otakustay
2020-04-14 14:28:49 +08:00
@zhybzc 但我们就是需要你已经有这些经验,付你工资就没时间等你积累,所以就会要求你懂“算法”
其次也有很多人,他自己觉得遍历能解决,也就再也不会去研究有二分法这个事情了,所以它的设计的质量始终是不合格的
Perry
2020-04-14 14:39:07 +08:00
一个见到应用场景就能说出用什么算法最合适的人,和一个需要谷歌一段时间得出一个效率一般的算法的人,公司要招哪个?

既然面试要考察算法,就说明该公司需要擅长算法的人。你算发不强,不代表你水平低,只代表你可能不是那些考算法的公司需要的人。

感觉楼主说了很多话都没有逻辑,剩下的我没看懂楼主想要表达什么。
Perry
2020-04-14 14:39:42 +08:00
@zhybzc 学算法不就是累积经验的过程?
MisakaTang
2020-04-14 14:46:03 +08:00
我觉得首先 "算法无时无刻都在"不等于"每个程序员都是懂算法的"吧,你可以说代码无时无刻都在所以每个程序员都看得懂代码还说得过去.
你可以把掌握算法类比成掌握框架,那么不会某个算法就可以理解为不掌握某个框架,这些东西确实可以面向 Google 编程,在我需要的时候看就行了.
这就是一个知识积累的过程,面试的时候对算法,框架的考查不就是在考察你的知识积累吗
JerryCha
2020-04-14 14:48:36 +08:00
Conventionally, 懂算法的意思是学过数据结构与算法,并且学的还不错。
zictos
2020-04-14 14:56:05 +08:00
@Perry 我只是觉得有些误解,比如要求某人懂算法,那岂不是那个人有可能不懂算法?不懂算法还能写程序吗?我也没说一定是新手什么都没学过,什么都要去谷歌。假设某人已经有几年的经验,已经在实际经验中通过谷歌了解到不少算法,很多算法以后可以直接使用,并不需要再谷歌。但可能他从没专门去学过算法,那你能说他不懂算法吗?

另外很多编程语言的教程实际上也是在教各种各样的算法,就是举一些例子去教大家怎么实现。
Jooooooooo
2020-04-14 14:58:11 +08:00
有些人在讨论数据结构, 而有些人在讨论机器学习.
zictos
2020-04-14 15:03:23 +08:00
@Perry 而且比较复杂的功能提前谷歌一下并没坏处,防止走弯路,大致参考一下就行。谷歌搜到的结果只要是精准的,一般并不会是效率一般的,往往都是比较好的方法,不会走什么弯路。反倒是再牛的人单靠自己思考,也难免有走弯路的时候。网上发出来的东西往往都是走过弯路之后得出来的,或者已经参考过很多其他人写的东西后再写出来的,所以类似的功能在网上的实现思路都差不多,都很少走弯路。
AlghaPorthos
2020-04-14 15:07:56 +08:00
我是一位高中信息学竞赛选手。我们首先需要掌握基础结构(顺序,循环,分支),然后开始由浅入深地学习算法。

举一个例子:你需要在 0.01s 内,从 100 个元素中找到指定的一个。怎么写?

答:顺序结构,直接枚举。

第二个例子:你需要在 0.01s 内,从 1000000 个元素中找到指定的一个。怎么写?

答:我也不知道。

第三个例子:从 1000000 个元素中找到指定的一个叫做“单位操作”。保证数据是冷的,你需要执行 1000000 次“单位操作”,总共给你 1 秒钟,怎么写?

答:$\Theta(N log N)$排个序,然后二分查找。总时间复杂度$\Theta(N log N)$

第四个例子:从若干个元素中找到指定的一个叫做“单位操作”。但是这回不保证数据是冷的,也就是随时可能新加进来一个元素,或者被删除一个元素。每一次加入的元素是随机的,数据库中最多 1000000 个元素。你需要执行 1000000 次“单位操作”,总共给你 1 秒钟,怎么写?

答:维护一个二叉排序树。由于数据随机,期望树高是$O(log N)$级别的。总时间复杂度$\Theta(N log N)$

第五个例子:从若干个元素中找到指定的一个叫做“单位操作”。这回依然不保证数据是冷的,也就是随时可能新加进来一个元素,或者被删除一个元素。这回不保证每一次加入的元素是随机的,数据可能很恶心,数据库中最多 1000000 个元素。你需要执行 1000000 次“单位操作”,总共给你 1 秒钟,怎么写?

答:由于数据不随机,期望树高退化到$O(N)$级别的。我们需要使用 FHQ Treap (或者随便一个平衡树)来实现随机化。期望树高变回$O(log N)$级别,总时间复杂度$\Theta(N log N)$。

--------扯淡完毕--------

5 个例子中,第一个:5 行代码解决。第二个:我也不知道。第三个:15 行代码。第四个:30 行代码。第五个:60 行代码。(均指使用 c++实现程序的代码核心部分长度)

在我的理解中,这 4 个功能,难度越来越难,需求越来越大,越来越考验水平。如果按工时计费,你拿的钱越来越多。但是你不是按工时计费,你是按月计费。你可能需要在一个下午之内,解决一个类似第五个例子这样的数据库索引问题。请问老板是找一个只会前三个例子的人,还是 5 个例子都会的人?

算法当然重要。虽然在程序中不一定能随时体现,但是是你能力的体现,也是你老板找人的重要标准。985 本硕博连读的你和大专毕业 7 天速成算法的人怎么拉开差距?靠那张文凭,和你的算法实现能力。

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

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

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

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

© 2021 V2EX