V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zictos
V2EX  ›  程序员

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

  •  1
     
  •   zictos · 2020-04-14 13:41:16 +08:00 · 5240 次点击
    这是一个创建于 1688 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    这个说的不对,而是

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

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

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

    这里面是有区别的。

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

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

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

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

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

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

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

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

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

    举一个例子:你需要在 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 天速成算法的人怎么拉开差距?靠那张文凭,和你的算法实现能力。
    AlghaPorthos
        21
    AlghaPorthos  
       2020-04-14 15:08:57 +08:00
    Markdown 被吃了,抱歉。
    oatw
        22
    oatw  
       2020-04-14 15:09:18 +08:00
    网上看到的“算法”指的是一些公知的算法吧,比如二叉树遍历,快速排序,动态规划什么的。而不是广义上说的程序员的自己设计的解决问题的方法和步骤。广义上讲,在 for 循环里写 sql 删除操作也可以说是一种“算法”,但是这样的选手你能说他懂算法吗?
    AlghaPorthos
        23
    AlghaPorthos  
       2020-04-14 15:11:46 +08:00
    勘误:第五个例子中的“期望树高为$O(N)$”应该是“最大树高为$\Omega(N)$”
    AlghaPorthos
        24
    AlghaPorthos  
       2020-04-14 15:12:29 +08:00
    @oatw 众所周知,数组也是一种数据结构,学名为“顺序表”。
    oatw
        25
    oatw  
       2020-04-14 15:17:49 +08:00
    @AlghaPorthos 数组也是一种数据结构这件事 不是众所周知的。。。
    zictos
        26
    zictos  
    OP
       2020-04-14 15:22:12 +08:00
    @oatw 主要是从网上搜到算法的定义并没有说只是主要指二叉树遍历,快速排序,动态规划之类的。另外算法一词有些误导,从字面意思让人觉得凭什么说我不懂算法?不懂算法还怎么写程序?程序不是一直都在计算吗?

    具体功能具体对待,你也不能说某个程序员什么算法都不懂。就算是你说的一些公知的算法,很多程序员也或多或少都会接触一点的,不然有时候代码写起来会很复杂或感觉没法写,这个时候自然而然就会去网上寻找一些更好的办法。既然有去网上找过办法,就代表接触过一些算法,那面试的时候也代表这种程序员或多或少懂一些算法,而不是什么算法都不懂。

    之所以问这个问题,主要是我对算法理解不够透彻。看了那么多回答后我觉得系统地学习下算法还是很有好处的。
    AlghaPorthos
        27
    AlghaPorthos  
       2020-04-14 15:22:14 +08:00
    @oatw 自动加狗头嘛(狗头
    wutiantong
        28
    wutiantong  
       2020-04-14 15:24:28 +08:00
    你似乎把那些较为复杂的业务逻辑代码也当作算法了,emmm,只能说你对算法一无所知?
    pompeii
        29
    pompeii  
       2020-04-14 15:30:26 +08:00
    不是我抬杠,我觉得应该先定义一下算法?有的人觉得一个函数就是一个算法,有的人觉得类似快排,KMP 之类才能叫做算法。
    zictos
        30
    zictos  
    OP
       2020-04-14 15:31:36 +08:00
    @wutiantong 按概念来说就是,网上有人说算法就是程序中的套路。

    百度百科的概念:算法( Algorithm )是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。

    比如一个函数,提供几个参考,函数中间有一些计算来达到自己需要的功能,这个函数不算一个算法吗?

    我并没有说是整个代码或一些乱七八糟的代码加在一起叫做算法,但有时候实现某个功能可以把一些代码段看做一个整体。

    难道算法只能指二叉树遍历,快速排序,动态规划这些吗?那算法这个词还真是误导人,百度百科的算法概念也挺误导人。
    AlghaPorthos
        31
    AlghaPorthos  
       2020-04-14 15:34:38 +08:00
    @pompeii 的确。算法的含义本身就是很广的,也没有人去下一个定义。不仅仅是难度的问题,还有与其他类的混淆。比如,我写一个 GCD (不是那个 GCD )是叫算法还是数论?比如我写一个树链剖分是叫算法还是数据结构?这两个都是模板问题,但是实际上很多算法需要 DS 和数论的支持。
    但是我们一般认为算法是有一定技巧性地解决某个问题的方法。
    AlghaPorthos
        32
    AlghaPorthos  
       2020-04-14 15:35:36 +08:00
    @zhybzc 写一个输入输出也是算法,解决了“复读”的问题(狗头
    zictos
        33
    zictos  
    OP
       2020-04-14 15:42:15 +08:00
    @wutiantong 经常说某某 app 的推荐算法,这种不都是 app 自己根据实际需要写的吗?根据用户的特性来推荐一些东西。这种算不算复杂的业务逻辑代码?

    还有比如我的程序中间有一个功能,但功能有用到前面的一些变量,变量的内容可能不同,变量不同,我的功能实现的效果就不同。这种是不是就算复杂的业务逻辑代码呢?
    zictos
        34
    zictos  
    OP
       2020-04-14 15:45:23 +08:00
    比如 while 循环或者 for 循环,每轮循环后加 1 或者减 1,这种算不算一种套路或者一种算法呢?
    wutiantong
        35
    wutiantong  
       2020-04-14 16:03:37 +08:00
    @zhybzc 送你一句话自行体会:算法不包括副作用
    ISSSSSSS
        36
    ISSSSSSS  
       2020-04-14 16:07:48 +08:00
    @ConradG 一语道破真谛。1+1 是算法 for 循环也是。但是招聘上说的算法,显然不是这么简单的。大家习以为常,成了惯例。
    em70
        37
    em70  
       2020-04-14 16:10:26 +08:00
    @zhybzc 大学没学过<数据结构>么
    zictos
        38
    zictos  
    OP
       2020-04-14 16:15:37 +08:00
    @em70 没学好,不喜欢学这门课,所以这门课混过去的
    tt67wq
        39
    tt67wq  
       2020-04-14 16:16:33 +08:00
    运动无处不在,也不见人人都是运动员
    zictos
        40
    zictos  
    OP
       2020-04-14 16:18:11 +08:00
    @tt67wq 关键是有时候说得好像不是算法工程师的程序员就一点算法都不懂似的。而我不是运动员,但没有人说我什么运动都不会
    wutiantong
        41
    wutiantong  
       2020-04-14 16:19:26 +08:00
    @zhybzc

    “网上有人说算法就是程序中的套路”
    ——算法不是套路,有这种误解的程序员我们称为调包侠。

    你引用的百度百科的描述倒是没什么问题。

    “比如一个函数,提供几个参考,函数中间有一些计算来达到自己需要的功能,这个函数不算一个算法吗?”
    ——考察它的功能,其中副作用的部分不属于算法,剩下的是算法。

    “难道算法只能指二叉树遍历,快速排序,动态规划这些吗?”
    ——不是

    “经常说某某 app 的推荐算法,这种不都是 app 自己根据实际需要写的吗?根据用户的特性来推荐一些东西。这种算不算复杂的业务逻辑代码?”
    ——这种是算法和业务的结合体,区分主要还是看副作用

    “比如 while 循环或者 for 循环,每轮循环后加 1 或者减 1,这种算不算一种套路或者一种算法呢?”
    ——不算,因为没有定义输入输出
    EPr2hh6LADQWqRVH
        42
    EPr2hh6LADQWqRVH  
       2020-04-14 16:20:53 +08:00
    在国内这个语境下,算法和数学一样,都是被神化的符号。

    奥数有多重要,算法就有多重要。
    奥数天才有多屌,算法天才就有多屌。

    上大学主要考数学,进公司主要考算法,没毛病。
    ConradG
        43
    ConradG  
       2020-04-14 16:30:10 +08:00
    @avastms 这个偏激了,外企应聘对于算法的要求比我们有之过无不及。
    不过我同意国内对于“算法工程师”的职责、定位和印象确实比较怪异。
    deplives
        44
    deplives  
       2020-04-14 17:12:06 +08:00
    会 1+1=2 的不一定会解三重积分
    manshisan
        45
    manshisan  
       2020-04-14 17:32:41 +08:00
    算法本质是帮助编程人员更好的解决问题,给公司节省更多的成本。至于懂算法,本质的意义是考察你对于一个问题的解决方法知道多少种,有哪些适合这种场景,哪些适合那种场景,实质是经验积累的考察。但是面试都问这种问题就有问题了
    ulosggs
        46
    ulosggs  
       2020-04-14 18:57:25 +08:00 via Android
    不懂算法,那就拧一辈子的螺丝吧
    ulosggs
        47
    ulosggs  
       2020-04-14 18:59:49 +08:00 via Android
    还有人闲得蛋疼争论算法的定义。人家面试的时候是考你 for while 之类的“算法”还是算法导论书上的算法?
    nightwitch
        48
    nightwitch  
       2020-04-14 19:07:09 +08:00   ❤️ 1
    算法工程师所说的算法,主要是指数值计算和数学分析有关的方法,常见的如快速傅里叶变换,牛顿迭代法,龙哥库塔法,梯度下降法,蒙特卡罗积分等算法,和程序员招聘所涉及的 翻转二叉树,反转链表等算法基本扯不上关系。
    lewinlan
        49
    lewinlan  
       2020-04-14 19:13:35 +08:00 via Android
    经历过大量算法(题)的训练,人的思维会变得更有逻辑性
    CoderGeek
        50
    CoderGeek  
       2020-04-14 19:57:15 +08:00
    数学 统计学 离散 图形学
    CoderGeek
        51
    CoderGeek  
       2020-04-14 19:57:32 +08:00
    线代 方向不一样
    CoderGeek
        52
    CoderGeek  
       2020-04-14 19:58:39 +08:00
    虽然干的可能是调参调包侠 但确实方向不一样 术业有专攻
    vitoliu
        53
    vitoliu  
       2020-04-14 20:32:07 +08:00
    公司文化而已,世界上有很多公司都不考算法的
    goodboy95
        54
    goodboy95  
       2020-04-15 09:46:53 +08:00
    把“算法”改成“数学”大概能更加理解吧,一般说某人懂数学,肯定不会说那人懂小学加减乘除
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5557 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:01 · PVG 14:01 · LAX 22:01 · JFK 01:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.