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

纯技术话题:程序,是算法重要还是数据结构重要?

  •  
  •   abser ·
    abserari · 2020-12-06 12:02:44 +08:00 · 7208 次点击
    这是一个创建于 1446 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我认为这个话题有助于自己找到自己看重程序的那一部分。

    第 1 条附言  ·  2020-12-07 11:47:51 +08:00
    如果没有场景,为什么不能设立场景分析呢?
    如果问题不明朗,为什么不额外探究问题的新的可选答案呢?
    如果问题能够激发自己的思考,为什么不深入思考一下帮助自己进一步理解编程在做什么呢?

    我是站着这样的立场向自己提出的思考,分享这个问题希望大家也能获益。
    73 条回复    2020-12-07 19:08:54 +08:00
    1rror
        1
    1rror  
       2020-12-06 12:08:24 +08:00   ❤️ 1
    这个我感觉不管说哪个更重要都有反驳的理由,两个缺一不可,讨论这个没啥意义阿。
    Kiske
        2
    Kiske  
       2020-12-06 12:11:38 +08:00   ❤️ 30
    走路,是左腿重要还是右腿重要
    wszgrcy
        3
    wszgrcy  
       2020-12-06 12:11:52 +08:00 via Android
    这个问题就像问吃早餐豆浆和油条哪个先吃一样……
    aguesuka
        4
    aguesuka  
       2020-12-06 12:14:53 +08:00 via Android   ❤️ 1
    算法 ∪ 数据结构 ≠ 程序
    (算法 ∪ 数据结构) - 算法 ≠ 数据结构
    重要 (算法) => undefine excpetion!
    你问了一个不是很好的问题
    lixiang2017
        5
    lixiang2017  
       2020-12-06 12:15:20 +08:00 via Android
    程序=算法+数据结构
    liuch
        6
    liuch  
       2020-12-06 12:16:08 +08:00
    这个问题.....
    左腿重要还是右腿重要?
    tiedan
        7
    tiedan  
       2020-12-06 12:17:42 +08:00
    算法+数据结构 = 程序
    abser
        8
    abser  
    OP
       2020-12-06 12:20:08 +08:00
    abser
        9
    abser  
    OP
       2020-12-06 12:21:29 +08:00   ❤️ 5
    以下来自上面博客的引用:

    虽然说“程序设计=算法+数据结构”,然后我实际中的体会,数据结构更加重要。

    因为结构定义了一个程序的架构,结构定下来了才有具体的实现。好比盖房子,数据结构就是房子的框架结构,如果一间房子很大,而你并不清楚这个房子的结构,会在这里面迷路。而对于算法,如果属于暂时不需要深究的细节部分,可以参考前面“区分主线和支线剧情”部分,先了解其入口、出口参数以及作用即可。

    Linus 说: “烂程序员关心的是代码。好程序员关心的是数据结构和它们之间的关系。”

    因此,在阅读一份代码时,厘清核心的数据结构之间的关系尤其重要。这个时候,需要使用一些工具来画一下这些结构之间的关系,我的源码分析类博客中有很多这样的例子,比如《 Leveldb 代码阅读笔记》、《 Etcd 存储的实现》等等。

    需要说明的是,情景分析、厘清核心数据结构这两步并没有严格的顺序关系,不见得是先做某事再做某事,而是交互进行的。

    比如,你如果现在刚接手某个项目,需要简单的了解一下项目,可以先阅读代码了解都有哪些核心数据结构。理解了之后,如果不清楚某些情景下的流程,可以使用情景分析法。总而言之,交替进行直到解答你的疑问为止。
    cmostuor
        10
    cmostuor  
       2020-12-06 12:38:59 +08:00
    @tiedan +1
    flawless
        11
    flawless  
       2020-12-06 12:43:23 +08:00
    都不重要,业务最重要。
    imn1
        12
    imn1  
       2020-12-06 13:21:50 +08:00
    这样说吧,接触算法的程序员并不多,做业务流程的是大部分,业务流程跟数据结构是紧密相关的
    做核心算法的,就算你想加到程序里面,恐怕也要申请,不是程序员本身就能决定的
    程序员能直接控制算法的,多是研究人员岗位,或者独立开发

    至于基础算法会不会常用,就看项目有没有各种条条框框限制了,模块内优化还是需要的
    JeffGe
        13
    JeffGe  
       2020-12-06 13:33:22 +08:00 via Android   ❤️ 4
    《五官争功》
    fline
        14
    fline  
       2020-12-06 13:52:34 +08:00   ❤️ 2
    只有技术不好的人才纠结这种问题。。。
    autoxbc
        15
    autoxbc  
       2020-12-06 14:03:38 +08:00   ❤️ 2
    程序 = 算法 + 数据结构 ×
    程序 = 算法 * 数据结构 √
    charlie21
        16
    charlie21  
       2020-12-06 14:49:44 +08:00 via iPhone
    写到一万行代码之前根本不需要考虑这个
    Jooooooooo
        17
    Jooooooooo  
       2020-12-06 14:50:27 +08:00
    都不重要

    业务最重要
    zion03
        18
    zion03  
       2020-12-06 14:51:22 +08:00   ❤️ 1
    记得之前看过 Linus 评价 Git 的数据结构很稳定,好的数据结构设计能使代码更容易维护。
    在工作中遇到的实际情况也是如此,算法只是程序的一小部分,随着需求的不断更迭,程序也需要不断的重构(当然,良好的设计模式能应对大部分需求的变更)。但如果数据结构出现了无法满足新需求的情况,重构起来会非常痛苦。
    zzzzzzggggggg
        19
    zzzzzzggggggg  
       2020-12-06 14:53:51 +08:00
    没有讨论的意义
    wellsc
        20
    wellsc  
       2020-12-06 14:55:58 +08:00
    程序=数据结构+算法,缺一不可
    mascteen
        21
    mascteen  
       2020-12-06 16:19:22 +08:00 via Android   ❤️ 1
    数据结构更重要,因为能用数据结构解决的问题就不要用算法解决
    cccp2020
        22
    cccp2020  
       2020-12-06 16:23:06 +08:00 via iPhone   ❤️ 1
    程序=复制+粘贴
    nicebird
        23
    nicebird  
       2020-12-06 16:26:02 +08:00
    考虑这种东西完全没有意义,连这两个都搞不明白,不要当程序员了。
    aonshuy
        24
    aonshuy  
       2020-12-06 18:09:42 +08:00
    我认为辩证法更重要
    lijie0981
        25
    lijie0981  
       2020-12-06 18:16:43 +08:00
    其实我觉得设计模式比较重要
    TangMonk
        26
    TangMonk  
       2020-12-06 18:53:16 +08:00 via iPhone
    英语重要
    xuanbg
        27
    xuanbg  
       2020-12-06 18:55:25 +08:00
    @wszgrcy 肯定是油条泡一下豆浆再吃啊🐶
    agagega
        28
    agagega  
       2020-12-06 18:59:25 +08:00 via iPhone   ❤️ 1
    认真回答的话:大部分时候数据结构更重要。很多程序员可能用不到什么算法,但一定会接触到数据结构(比如三天两头就会有人吐槽的前后端接口格式!)
    liberty1900
        29
    liberty1900  
       2020-12-06 18:59:30 +08:00 via Android
    目录结构更重要,笑
    no1xsyzy
        30
    no1xsyzy  
       2020-12-06 19:12:39 +08:00   ❤️ 1
    楼上认为接触不到算法的,感觉是受了狭义算法和广义算法的迷惑。
    只有数据结构,没有(广义)算法,那你连操作数据结构都做不到,这个不叫程序,叫数据备份。
    就是一个 strcmp 也是(广义)算法。
    没有(广义)算法,你操作不了数据结构;没有数据结构,你(广义)算法操作啥?

    至于业务重要,其实大部分程序员的工作不是设计业务(这是世界或者社会的活,轮不到你区区一个智人种个体),而是理解业务,再将业务转化为数据结构和算法(也就是计算机听得懂的方式)。
    “业务”和“数据结构和算法”哪个重要?这个问题跟主题的问题也一样。
    ggbdpq
        31
    ggbdpq  
       2020-12-06 19:17:06 +08:00   ❤️ 1
    除去算法工程师之外,月薪 2 万以下不用考虑算法,这时候数据结构的重要性就出来了;年薪三四十万的可能就接触一些简单的算法。现在的很多码农还真搞不清楚算法和数据结构,23 楼那哥们太以全概偏或者以偏概全都是片面的和不对的。

    总结,面对技术来说,两者都重要;面对业务来说,数据结构更重要;面对薪资来说,老板认为哪个重要就重要。撇开上述的,当然是两者都重要,并没有最重要分区别。因为你写的每一行代码都是粗略的算法,或多或小都包含数据结构这方面的知识。
    no1xsyzy
        32
    no1xsyzy  
       2020-12-06 19:26:20 +08:00
    @aguesuka 第三行没看懂……
    linyuxin
        33
    linyuxin  
       2020-12-06 19:51:11 +08:00 via Android
    能赚钱就重要
    namelosw
        34
    namelosw  
       2020-12-06 19:53:13 +08:00   ❤️ 2
    算法是你想出来解决某些问题的一个解.

    数据结构是算法用得比较多之后内化出来的一个模型. 重视数据结构的代码比不重视数据结构的代码清晰易懂好维护, 不过数据结构一般不会让你做出之前不能做到的事情. 你可以把数据结构看作某些算法的沉淀.

    Linus, Rob Pike 很多人都说过类似的问题, 这里引用一个 Eric Raymond: http://www.catb.org/esr/writings/taoup/html/ch01s06.html#id2878263
    大意是人很难理解简单的过程逻辑, 但是却能理解很复杂的数据结构.

    对比一下一个 50 行的 if else for 循环, 和一个 50 行的 class.

    或者一个不太恰当的比喻:
    只注重算法≈把逻辑全扔到 controller 里: 随着 use case 的增多代码会很难读且有很重复.
    重视数据结构≈把逻辑逐渐沉淀到 model 层, 然后想要理解代码的人着重看一看 model 就很快能理解, 而维护代码的人经常能直接用上 model 里已有的很多东西.
    skypyb
        35
    skypyb  
       2020-12-06 19:54:54 +08:00   ❤️ 1
    程序 = 搜索引擎+英语
    这才是对的🐶
    OneMan
        36
    OneMan  
       2020-12-06 20:01:25 +08:00
    解决问题最重要
    muzuiget
        37
    muzuiget  
       2020-12-06 20:11:45 +08:00
    怎么设计数据结构也是算法的一部分,虽然一般人觉得“算法”只是代码控制流。
    rim99
        38
    rim99  
       2020-12-06 20:19:34 +08:00   ❤️ 1
    记得以前看过一个大牛的观点,就是说数据结构确定之后,已经决定了算法的效率的上下限。所以数据结构的设计更为重要些。
    uselessVisitor
        39
    uselessVisitor  
       2020-12-06 20:38:51 +08:00 via Android
    业务写不完了
    geebos
        40
    geebos  
       2020-12-06 20:41:40 +08:00
    算法和数据结构两者不是孤立的,甚至我们有时候说算法就是在说算法和数据结构。恰当的算法配合恰当的数据结构就可以产生一个优秀的程序。比如 redis 里的 set 实现,hash table 的数据结构还要搭配 rehash 算法 set 才能发挥出最好的效果。个人认为把算法和数据结构拆开来比较没有意义,也许它们中某一个比另一个重要一些,但那又怎样呢,这对写出好的程序没有任何帮助。
    ZRS
        41
    ZRS  
       2020-12-06 21:40:41 +08:00 via iPhone
    这是个语文话题 和技术无关
    akira
        42
    akira  
       2020-12-06 21:58:29 +08:00
    数据库表结构设计 和 sql 哪个重要
    niubee1
        43
    niubee1  
       2020-12-06 22:03:25 +08:00
    互为表里,你非要拆开来说谁重要,要么是真不懂,要么是坏
    mingl0280
        44
    mingl0280  
       2020-12-06 22:20:57 +08:00 via Android
    很莫名其妙的问题啊,两个哪个拆得开一样……
    chenglus
        45
    chenglus  
       2020-12-06 22:38:15 +08:00
    业务最重要+1
    jones2000
        46
    jones2000  
       2020-12-06 22:50:30 +08:00   ❤️ 1
    数据结构重要, 程序员只是算法的搬运工.
    pinocc012
        47
    pinocc012  
       2020-12-06 22:57:23 +08:00
    如果你写一个“hollo world”,两者都不重要
    cedoo22
        48
    cedoo22  
       2020-12-06 23:25:28 +08:00
    算法 必定要针对不同的数据结构 有不同的实现,能分开嘛?
    prime2015
        49
    prime2015  
       2020-12-06 23:38:51 +08:00
    都不重要,生活最重要
    raaaaaar
        50
    raaaaaar  
       2020-12-06 23:49:49 +08:00 via Android   ❤️ 1
    根本就分不开,耦合度那么高,我问你怎么求树的直接前驱,这是不是数据结构的基本操作?那这是不是一个算法?
    我问你怎么堆排序,用到了堆,那它是不是个数据结构?

    如果是狭义上的那些算法,像什么排序,查找,贪心,动态规划,这些的确业务上不需要实现,但是如果你遇到一个你要看得懂,同样的,数据结构也是一样的,你读源码,你造轮子,不一样要接触这些东西吗?
    kidlj
        51
    kidlj  
       2020-12-07 00:17:06 +08:00 via iPhone
    数据结构是算法的一部分,瞎问问题。
    taogen
        52
    taogen  
       2020-12-07 00:38:22 +08:00 via Android
    活着最重要
    IvanLi127
        53
    IvanLi127  
       2020-12-07 00:56:25 +08:00 via Android
    角度刁钻,它俩分不开,得配套使用。
    lhx2008
        54
    lhx2008  
       2020-12-07 00:59:52 +08:00 via Android
    对于业务来说,只要测试,监控,压测都过了,再烂的代码也能玩的好好的
    FS1P7dJz
        55
    FS1P7dJz  
       2020-12-07 01:05:04 +08:00   ❤️ 1
    数据结构重要

    在目前大部分商业开发种,数据结构类似楼房的地基和框架,没这个你算法再牛逼,也成不了大气候

    说都重要的实际上就是再搅稀泥,来 v2 大家都知道楼主问的算法和数据结构指的是啥
    ChrisLi1018
        56
    ChrisLi1018  
       2020-12-07 08:05:56 +08:00 via iPhone
    算法难道不是用来操纵数据结构的吗?
    jackky365
        57
    jackky365  
       2020-12-07 08:37:33 +08:00
    很大程度上, 你使用什么样的数据结构,已经反映出了你的算法。

    两者是相辅相成的。
    IssacTomatoTan
        58
    IssacTomatoTan  
       2020-12-07 08:45:03 +08:00 via Android
    我也觉得数据结构重点 好的结构可以更容易进行处理 而不需要过度转换 在牛逼的算法也是建立在能处理的结构上
    snowydec
        59
    snowydec  
       2020-12-07 08:51:39 +08:00
    你上学的时候这两个是两本书?
    freenull
        60
    freenull  
       2020-12-07 09:18:16 +08:00
    两个难道不是一起的么
    StopTheWorld
        61
    StopTheWorld  
       2020-12-07 09:23:42 +08:00
    最让我差异的是这种问题有这么多人回复,当然我回复了也是其中一员。
    fhsan
        62
    fhsan  
       2020-12-07 09:38:56 +08:00
    讨论这个问题应该放在合适的场景
    securityCoding
        63
    securityCoding  
       2020-12-07 09:54:08 +08:00
    这种问题不应该被问出来的,算法和数据结构相辅相成.

    数据结构为算法服务,算法作用于特定的数据结构
    hugo2lee
        64
    hugo2lee  
       2020-12-07 10:04:01 +08:00
    数据结构就是人肉大脑设计出来的算法,装填数据的算法
    wangchonglie
        65
    wangchonglie  
       2020-12-07 11:00:27 +08:00
    数据结构是算法的基础, 数据结构是算法设计出来的, 就好比血与肉, 都重要。
    abser
        66
    abser  
    OP
       2020-12-07 11:47:04 +08:00
    @FS1P7dJz 数据结构重要

    在目前大部分商业开发种,数据结构类似楼房的地基和框架,没这个你算法再牛逼,也成不了大气候

    说都重要的实际上就是再搅稀泥,来 v2 大家都知道楼主问的算法和数据结构指的是啥

    明白人

    如果没有场景,为什么不能设立场景分析呢?
    如果问题不明朗,为什么不额外探究问题的新的可选答案呢?
    如果问题能够激发自己的思考,为什么不深入思考一下帮助自己进一步理解编程在做什么呢?

    我是站着这样的立场向自己提出的思考,分享这个问题希望大家也能获益。
    Anarchy
        67
    Anarchy  
       2020-12-07 12:13:41 +08:00 via Android
    算法是一个比较大的概念,可以完全涵盖数据结构。或者问题可以转换为数据结构在算法中的地位。都单独起专有名词了当然是重要的了。
    rotatefish
        68
    rotatefish  
       2020-12-07 12:20:08 +08:00   ❤️ 1
    好带哥
    annielong
        69
    annielong  
       2020-12-07 13:58:48 +08:00
    还没到能比较的层次,目前接触到最多都是 spring 框架接入数据库表自动生成一切
    Lemeng
        70
    Lemeng  
       2020-12-07 14:47:38 +08:00
    这个问题呢,额,宝妈,你喜欢老大还是老二只能喜欢一个
    lllllIIIlll
        71
    lllllIIIlll  
       2020-12-07 16:04:07 +08:00
    算法和数据结构没办法拆开来谈吧,还没有碰到两者任一单独出现的场景。
    chengkai1853
        72
    chengkai1853  
       2020-12-07 16:20:30 +08:00
    总不是看你写的是哪种工程。如果是系统这种算法比较多的,肯定算法重要啊。绝大多数情况(一般的软件),都是结构比较重要。毕竟写了那么多年,二叉树啥的算法都没手动写过。
    fox0001
        73
    fox0001  
       2020-12-07 19:08:54 +08:00 via Android
    需求最重要
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   982 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 21:59 · PVG 05:59 · LAX 13:59 · JFK 16:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.