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

似乎计算机数据结构中存在一个明显的“技术断层”?

  •  1
     
  •   abcbuzhiming · 2020-04-15 09:01:22 +08:00 · 13581 次点击
    这是一个创建于 597 天前的主题,其中的信息可能已经有所发展或是发生改变。
    计算机的数据结构这个东西,看起来东西不多,但是里面有一些很突兀的存在。绝大部分书也好,教程也好,介绍数据结构的时候,套路都是 数组 链表 Map(table) ,队列,栈。然后就会出现两个画风(难度)和之前的东西截然不同的存在——树和图。
    我搞这行的时间也不算短了,也接触了不少人,发现 树和图 对于大部分人来说都是难以理解的存在,包括我自己也是。不是说他们的表现形式难以理解,而是指附加其上的计算行为,很复杂,有多重变种。和在他们之前的那些数据结构比起来,感觉他们的复杂度猛然抬了个台阶起来。非常的显眼而且突兀。
    我注意到这点越久,就越怀疑这两个东西存在的“合理性”,他们就像塞进耗子窝里的大象那么显眼。这中间是不是缺少了什么,我们知道计算机的一切往上追溯都来自于数学,数学能解释这两个东西如此突兀的现象吗,还是说历史埋葬了一些东西,在 树和图 之前其实存在某些“前置科技”,只是因为种种原因,“前置科技”的功能被后来者覆盖了,就消失在历史长河里了
    136 条回复    2020-08-06 16:01:49 +08:00
    1  2  
    puncsky
        1
    puncsky  
       2020-04-15 09:03:45 +08:00 via iPhone
    别闹了,树和图到处都是,你 new 一个稍微深点儿的 object,它不是图么?
    xyjincan
        2
    xyjincan  
       2020-04-15 09:05:23 +08:00
    结构理解起来简单,但是编程实现+各种操作,,,
    ipoh
        3
    ipoh  
       2020-04-15 09:07:24 +08:00
    99.9%的人只要知道怎么用就行了 能看懂文档会调用 api 就 ok
    duwan
        4
    duwan  
       2020-04-15 09:11:58 +08:00
    链表不也可以看作是个树嘛。。
    dilu
        5
    dilu  
       2020-04-15 09:12:22 +08:00   ❤️ 5
    互联网风口造成的,只要知道怎么用不需要知道原理,不需要知道原理,也不需要懂多高深的技术

    写代码本质上跟搬砖没有什么不一样,可以说 99.9%的人都只是在搬砖罢了

    我们不是出卖技术换钱,我们是出卖时间在换钱而已
    abcbuzhiming
        6
    abcbuzhiming  
    OP
       2020-04-15 09:12:41 +08:00   ❤️ 13
    @puncsky 你没看懂我在说什么

    @ipoh 很显然,我这里不是要讨论你说的这点
    chendy
        7
    chendy  
       2020-04-15 09:13:46 +08:00   ❤️ 1
    复杂度和维度之间的关系本来也不是线性的
    dilu
        8
    dilu  
       2020-04-15 09:14:28 +08:00
    可能我的理解有错误,lz 是想表达在计算机体系中存在断层?
    nnqijiu
        9
    nnqijiu  
       2020-04-15 09:16:25 +08:00
    其实链表就是一种特殊的树,树就是一种特殊的图
    alphatoad
        10
    alphatoad  
       2020-04-15 09:16:44 +08:00   ❤️ 1
    我的理解是,楼主指树、图这类数据结构依靠指针、内存地址,和别的连续内存的数据结构不一样,这个意思吗?
    yaphets666
        11
    yaphets666  
       2020-04-15 09:17:27 +08:00
    这个断层中内容可能只存在于科学家的脑海中或者草图中
    moonsn
        12
    moonsn  
       2020-04-15 09:20:47 +08:00 via Android
    没有断啊,
    点,线,立方体
    单一数据单元,数组,图
    一维,二维,多维关系
    不知道比喻的恰当不。
    marcong95
        13
    marcong95  
       2020-04-15 09:23:16 +08:00
    数组、链表、Map(table)、队列、栈不都是线性表么。。。

    然后图是“二维线性表”,树是个无环图

    所以并不是什么存在前置科技,的的确确就是两个维度。。
    luckyrayyy
        14
    luckyrayyy  
       2020-04-15 09:23:26 +08:00   ❤️ 21
    链表一对一,树一对多,图多对多,这不是很自然的递进关系么....还少啥?建议楼主不要钻到奇怪的胡同里...
    boileryao
        15
    boileryao  
       2020-04-15 09:25:10 +08:00
    小学我第一次学除法也感觉特别突兀,咋也学不会,总不能说除法和加减法有“技术断层”吧。当然也不排除是教材问题,一本好的教材认真看的话应该不会特别突兀。

    链表加个叉 -> 树,
    分支判断 -> 决策树 -> 树,
    大部分 O(lgN)算法的执行过程差不多都是一次砍掉半拉树,
    树是特殊的一种图——有向无环图,图的话大概社交关系、路由算法、科学计算?等等场景用的比较多,没啥需求的话简单了解就好,没必要难为自己。
    lower
        16
    lower  
       2020-04-15 09:26:32 +08:00
    我觉得主要是在 目前的计算机体系结构上要实现(表现)这些数据结构和算法比较麻烦吧,要考虑内存寻址、计算什么的。
    另外链表里其实也有(实现或操作)比较复杂一些的数据结构吧,比如双向链表 /跳表之类的。
    CEBBCAT
        17
    CEBBCAT  
       2020-04-15 09:27:10 +08:00 via Android
    @dilu
    @alphatoad
    楼主的意思应该是链表、数组算法的难度和图、树算法的难度不在一个量级上,假如说链表算法的难度是:wq,那么树算法的难度就是 [email protected] 了(后边这个是寄存器,要我用错了别拍我)
    CEBBCAT
        18
    CEBBCAT  
       2020-04-15 09:28:21 +08:00 via Android
    @CEBBCAT 我寻思楼主写得挺明白的,我当时还想夸夸楼主行文挺不错呢。至少算是矮子里面拔将军
    ww940521
        19
    ww940521  
       2020-04-15 09:31:21 +08:00 via Android
    我也是这么觉得,树怎么都搞不懂。
    Cabana
        20
    Cabana  
       2020-04-15 09:31:27 +08:00 via Android
    @boileryao 除法不就是连续减嘛🐶
    alphatoad
        21
    alphatoad  
       2020-04-15 09:34:26 +08:00 via iPhone
    @CEBBCAT 这有啥难的……
    iamdqncoder
        22
    iamdqncoder  
       2020-04-15 09:34:58 +08:00
    树和图 的前置科技 不就是 链表、栈这些吗?相对于一个单个的结构, 链表的复杂程度 不也算是数量级的提升吗
    dreamapple
        23
    dreamapple  
       2020-04-15 09:35:21 +08:00 via Android   ❤️ 1
    绝大多数的书是什么书?就我大三的数据结构教材和算法导论来说树和图都是平滑过渡的。
    估计 lz 意思是绝大多数 csdn 博客吧
    kindjeff
        24
    kindjeff  
       2020-04-15 09:38:25 +08:00 via Android   ❤️ 7
    链表、树和图是递进关系楼上都已经说过了,想吐槽一下楼主的逻辑倒是有两个断层:根据身边的都「感觉」得到「技术断层」的猜想;希望给出这个猜想的「数学证明」。

    这样的猜想恐怕只能用「我身边的人都不觉得难」来反证了吧。(逃)
    zivyou
        25
    zivyou  
       2020-04-15 09:38:38 +08:00
    数组 链表 Map(table) ,队列,栈 这些都是线性结构
    树,图都是非线性结构
    从线性结构 到 非线性结构,难度自然也是非线性增加的

    我感觉有点像 算术 -> 数学 的进阶过程
    fancy111
        26
    fancy111  
       2020-04-15 09:40:09 +08:00
    抱歉,我真的没听懂你在说什么。
    Vegetable
        27
    Vegetable  
       2020-04-15 09:40:28 +08:00
    简单的都是一维的,难的都是二维甚至更高维度的。

    不在一个维度,自然对抽象能力有更高的要求,正常情况。
    FFFire
        28
    FFFire  
       2020-04-15 09:46:53 +08:00   ❤️ 1
    歪个楼,前几天出于兴趣看了 CPU 的发展史,感觉发展得更突兀,要是有业内大佬指点两句就好了
    also24
        29
    also24  
       2020-04-15 09:49:38 +08:00 via Android
    数组链表的逻辑结构和存储结构相对来说比较相似。


    树、图的逻辑结构和存储结构就存在比较大的差异了。
    janwarlen
        30
    janwarlen  
       2020-04-15 09:50:33 +08:00
    不都是链表?
    队列、栈(存在数组形式)、树、图(存在数组形式)
    MisakaTang
        31
    MisakaTang  
       2020-04-15 09:50:42 +08:00
    按照我的理解可能就是从像数组这样的连续地址空间的结构到像链表这样的非连续地址空间的结构?按照这样的话,链表和树都可以算是图的一种简单形式了
    watzds
        32
    watzds  
       2020-04-15 09:53:28 +08:00 via Android
    人脑内存不够,族谱,亲戚称呼也难啊
    goodboy95
        33
    goodboy95  
       2020-04-15 09:55:21 +08:00
    你说断层的时候我第一反应也是链表……
    话说,树本身不难理解吧,毕竟也是单向的数据结构,难的话只能说难在应用上,一个二叉树衍生出那么多应用
    lvybupt
        34
    lvybupt  
       2020-04-15 10:05:02 +08:00
    数据结构的前置课程是离散数学,如果把离散数学学透会对数据结构的学习和理解有非常大的帮助。
    RubyJack
        35
    RubyJack  
       2020-04-15 10:06:46 +08:00
    树图都需要一些递归思维
    reedthink
        36
    reedthink  
       2020-04-15 10:09:32 +08:00
    树本身简单,难的是那些神奇的应用
    enrio
        37
    enrio  
       2020-04-15 10:13:51 +08:00
    一个维度满了,就升维啊。而且,我觉得数据结构的算法,也不算难吧,就算你理解不了或者证明不了,但是怎么去写以及会产生什么样的效果还是很清楚的。
    tongyang
        38
    tongyang  
       2020-04-15 10:14:20 +08:00
    学不明白 大学的数据结构怎么过呀
    wysnylc
        39
    wysnylc  
       2020-04-15 10:16:58 +08:00   ❤️ 2
    你们这样就显得发帖的很菜😂
    mazyi
        40
    mazyi  
       2020-04-15 10:19:26 +08:00 via iPhone
    不,是你不够聪明
    sunjiayao
        41
    sunjiayao  
       2020-04-15 10:31:38 +08:00
    楼主头像不错
    imnaive
        42
    imnaive  
       2020-04-15 10:33:59 +08:00
    我觉得楼主想说的“技术断层”指的是实现难度的断层。
    数据结构难度可能就是像台阶一样跃迁上升,没有那么平滑。
    boileryao
        43
    boileryao  
       2020-04-15 10:39:45 +08:00
    @Cabana 没说清楚:理解不了短除 [doge]
    wutiantong
        44
    wutiantong  
       2020-04-15 10:43:40 +08:00
    这只能说明你还没学明白
    ipwx
        45
    ipwx  
       2020-04-15 10:45:12 +08:00   ❤️ 3
    可是,函数调用栈展开了画就是一棵树啊。。。早就隐含了。最简单的斐波那契数列的求和式子,你把递推式展开了写,不也是一棵树么? F(n) = F(n-1)+F(n-2)

    所以不是你没接触过,而是你习以为常的东西,其实早就有了。另外树是一种特殊的图,n 个节点 n-1 条边的无向连通图都是树。

    另外实名反对什么线性非线性的说法,线性有严格定义的,不要乱用。
    ----

    图在数学中早有由来,最早能追溯到欧拉(就是那个一堆定理的欧拉)。引一下维基百科:

    一般认为,欧拉于 1736 年出版的关于柯尼斯堡七桥问题的论文是图论领域的第一篇文章。此问题被推广为著名的欧拉路问题,亦即一笔画问题。而此论文与范德蒙德的一篇关于骑士周游问题的文章,则是继承了莱布尼茨提出的“位置分析”的方法。欧拉提出的关于凸多边形顶点数、棱数及面数之间的关系的欧拉公式与图论有密切联系,此后又被柯西等人[4][5]进一步研究推广,成了拓扑学的起源。1857 年,哈密顿发明了“环游世界游戏”( icosian game ),与此相关的则是另一个广为人知的图论问题“哈密顿路径问题”。

    西尔维斯特于 1878 年发表在《自然》上的一篇论文中首次提出“图”这一名词。

    欧拉的论文发表后一个多世纪,凯莱研究了在微分学中出现的一种数学分析的特殊形式,而这最终将他引向对一种特殊的被称为“树”的图的研究。由于有机化学中有许多树状结构的分子,这些研究对于理论化学有着重要意义,尤其是其中关于具有某一特定性质的图的计数问题。除凯莱的成果外,波利亚也于 1935 至 1937 年发表了一些成果,1959 年,De Bruijn 做了一些推广。这些研究成果奠定了图的计数理论的基础。凯莱将他关于树的研究成果与当时有关化合物的研究联系起来,而图论中有一部分术语正是来源于这种将数学与化学相联系的做法。
    ipwx
        46
    ipwx  
       2020-04-15 10:48:32 +08:00   ❤️ 2
    多说一句:就像你觉得从链表到图有“断层”,我还可以觉得从微积分到泛函分析有“断层”,几何到黎曼几何有“断层”呢?但是学的多了,就能从中发现联系,理解当时的数学家到底是怎么“过渡”到更高层次的抽象上面的。

    你觉得有断层,有过渡被淹没在历史中,其实只是你学得不够多罢了。
    Chenamy2017
        47
    Chenamy2017  
       2020-04-15 10:53:36 +08:00
    复杂度本身就没有规定说是线性的啊,楼上有人说的好,一维二维三维,其复杂度上升很快。
    vindurriel
        48
    vindurriel  
       2020-04-15 10:57:58 +08:00 via iPhone
    断层只是楼主个人感觉而已吧 我个人感觉链表到树的跨度 不如树到图的跨度大 树特别是二叉树上的问题在数学上已经研究得很透彻了 衍生了很多分治和递归的算法 而图上面很多问题到目前是没有稳定快速解法的( NP 问题)比如旅行商 背包 最小覆盖啥的
    cmdOptionKana
        49
    cmdOptionKana  
       2020-04-15 11:03:46 +08:00
    应该没有断层,因为树也有简单的树,图也有简单的图。

    现实中之所以常见到复的的树和图,是因为现实中需要解决的问题 **本身** 很复杂。
    gemini767
        50
    gemini767  
       2020-04-15 11:07:00 +08:00
    我个人理解 目前 90%应用场景是二维数据结构就可以 cover 经常用 o1 on 啥熟记
    而多维数据结构面对的场景更复杂,更多面向基础基础编程,这里面不过佼佼,不常用,所以感觉陌生

    就好像 400 年前 人对小数感到陌生一样
    wozhizui
        51
    wozhizui  
       2020-04-15 11:12:53 +08:00
    mooc 浙大的数据结构课程,往树过度的时候,用的是链表。把二维链表横过来,就是二叉树了,可以参考这个链接的 ppt 最后一页。当然理解,还是得把那节课听一听。
    链接附上: https://www.icourse163.org/learn/ZJU-93001?tid=1450069451#/learn/content?type=detail&id=1214143616&cid=1217772368
    aijam
        52
    aijam  
       2020-04-15 11:14:33 +08:00
    估计 lz 没有发现 linked list 和 tree 的联系。
    nicebird
        53
    nicebird  
       2020-04-15 11:19:56 +08:00
    树相当多,基础的也很简单,比如二叉树,但是不实用,最终进化成了各种平衡树。

    图其实跨度大点,但是数学上其实就是图论。
    levelworm
        54
    levelworm  
       2020-04-15 11:24:34 +08:00 via Android
    我是自己学的,深有体会,自学到 BST,以及大小堆,都比较直观,但是一旦到自平衡的二叉树,我就学不下去了。可能是我没有什么压力吧。图恰好跟在后面所以我也没学。
    min
        55
    min  
       2020-04-15 11:24:58 +08:00
    知识本身一般性的是没有断层的
    个人的学识那可能有
    而且一般不是断层,是个人知识的边界,类似悬崖的感觉,到此为止、没了
    CNife
        56
    CNife  
       2020-04-15 11:25:33 +08:00   ❤️ 1
    很认同 @ipwx 的看法。树和图其实都是我们一直在用的东西,最常见的,任何一个程序的调用栈都可以看作一个图,如果没有递归调用就是一个树,调用的过程就是深度优先遍历。
    说到「割裂」,其实还是有的,树应该是学习数据结构过程中遇到的第一种必须用递归解决各种问题的,在这之前的所有线性数据结构都能用迭代莽过去,但从树开始就不行了,图就更复杂了。理解递归,利用递归是学习数据结构的一道坎,自然就有了割裂。
    gggxxxx
        57
    gggxxxx  
       2020-04-15 11:32:29 +08:00   ❤️ 1
    我说另一个看法,我觉得现在大环境里很多人死抠数据结构算法的行为有点走歪了。
    计算机编程本身就是实用技术,其目的就是方便易用,给用户使用提高效率。
    优秀的程序应该是利用现有资源最巧妙的,而不是算法最优的。现代计算机的硬件能力,不是特殊情况谁用的完?不够再堆硬件就行了。同时,从程序的结果来看,应该是不管白猫黑猫,只要准确稳定运行的程序就是好程序。
    zooo
        58
    zooo  
       2020-04-15 11:35:17 +08:00   ❤️ 1
    你需要学习离散数学,就觉得不那么突兀了,算是数据结构的先导课程。

    国内大多教材基本都是直接给你结论,所以显得很突兀。
    去找一些国外的好教材,好的入门级的教材都会给你一个非常好的过渡,下一节的内容是慢慢引出来的,引导读者自己思考,自己平滑过渡到下一节;或者有一些会把过渡放到某一节的课后习题中,先让读者自己思考,然后引导出下一节。逻辑链很清楚,也很容易让读者建立自己的逻辑链,这样知识容易成体系,而不是零散的。

    国内部分教材会直接抄国外的教材(毕竟落后就要借鉴先进),把很多内容省略了(所谓的废话),但是让读者阅读时就容易逻辑断链,容易迷惑。
    crackhopper
        59
    crackhopper  
       2020-04-15 11:37:52 +08:00   ❤️ 2
    我们知道 1+1=2,定义了加法。对于任意的 x,x+0=x,得到零元:0 。
    我们知道 2*2=4,定义了乘法。 对于任意的 x,x*1=x,得到幺元:1 。
    再加上分配率、交换律和结合律。(上面都是小学学过的),再补充点初中学过的映射。

    好了,现在你就可以直接推导:群、环、域和代数的大量定理了。要说难度断层,数学才是真正的难度断层。

    而数据结构:图去除环路就成了树;树去除分支就成了链表。看起来难度曲线还是挺随和的。
    zooo
        60
    zooo  
       2020-04-15 11:39:03 +08:00
    还有一些比较深奥难以理解的知识(非入门级教材),其实是理论的创造者经过好几年的摸索得到的知识,有时作者都很难说清自己的方法逻辑链(偶然有的灵感),这些东西需要慢慢消化了,毕竟人家几年时间创造的理论或者算法,不可能一两个小时被别人就弄的很清楚(尤其是逻辑链)
    InkStone
        61
    InkStone  
       2020-04-15 11:41:51 +08:00
    @RubyJack 线性表的定义也是递归的。链表一样是很典型的递归结构,只不过是尾递归,所以简单一点。
    levelworm
        62
    levelworm  
       2020-04-15 11:45:03 +08:00 via Android
    @nicebird 树只要不旋转就都很简单,无非一点递归,但是一旦涉及到旋转的自平衡,我就自学不下去了。。。
    letking
        63
    letking  
       2020-04-15 11:50:12 +08:00
    树和图你都觉得难以理解,那纯粹是你不愿多花功夫去学习……哪有啥断层和“前置科技”啊。
    别和身边差的人比,这一行里理解树、图并觉得非常自然的大有人在。
    也别为自己找花里胡哨的借口,这完全是多花时间就能学会的东西。
    nekochyan
        64
    nekochyan  
       2020-04-15 11:51:54 +08:00
    可能学了离散数学好理解一点?
    InkStone
        65
    InkStone  
       2020-04-15 12:01:04 +08:00
    我觉得很多人就是学得太少想得太多。树和图的基础定义确实比线性表难一点,但充其量也就是 1 和 5 的区别——而算导前中期的难度就可以达到 50 。
    paoqi2048
        66
    paoqi2048  
       2020-04-15 12:04:32 +08:00
    尾队列有点绕的
    acidsweet
        67
    acidsweet  
       2020-04-15 12:05:38 +08:00   ❤️ 1
    不是很理解楼主的意思;按照前驱后继来理解:
    1 前驱 1 后继:线性表
    1 前驱 n 后继:树
    n 前驱 n 后继:图

    数组和链表只是线性表的实现方式,队列或者栈只是线性表的特异型;
    图可能退化成树,树也可能退化成线性表
    线性表可以用树表示,树也可以用图来表示
    across
        68
    across  
       2020-04-15 12:10:06 +08:00 via iPhone
    是说学习曲线在某个地方特别陡吧。

    emmm,数据结构没觉得,算法我认为是动态规划.... 非科班,leetcode 中等遇到 dp,真的是来回放弃了十余次,多年后才啃下来。
    yamasa
        69
    yamasa  
       2020-04-15 12:10:08 +08:00
    我觉得 cs 里很多概念和算法都是取材抽象于人类历史的智慧。诸如几种 IO 模型,同步异步,你提到的这些数据结构自然也是。族谱图不就是最典型的树么?只要是对 cs 发展有帮助的都可以拿来用,无非是模型转换的难度大小。
    levelworm
        70
    levelworm  
       2020-04-15 12:10:35 +08:00 via Android
    @letking 我觉得你说的有道理,我当时就是觉得自平衡的旋转理解不了就放弃了,现在看看就算不理解直接硬背应该至少也能熟悉。
    fromdark
        71
    fromdark  
       2020-04-15 12:14:33 +08:00
    队列,链表属于一维,树属于二维,图属于多维
    UnknownR
        72
    UnknownR  
       2020-04-15 12:36:22 +08:00
    因为逻辑和抽象思维能力,前面回复里说了,链表数组,树是一对一或一对多,而图却是多对多,在数学维度上是递增,但是对个人的逻辑和抽象能力是指数级的上升
    AnsonUTF8
        73
    AnsonUTF8  
       2020-04-15 12:45:48 +08:00 via iPhone   ❤️ 1
    还是链表没学透,链表实验写多了,你自己就会想要是一个节点可以指向多个节点就好了。
    zxlzy
        74
    zxlzy  
       2020-04-15 12:47:04 +08:00
    是你的理解能力不够。
    xiri
        75
    xiri  
       2020-04-15 12:49:50 +08:00
    其实就是从一维跨越到了二维乃至多维
    ho121
        76
    ho121  
       2020-04-15 12:54:14 +08:00
    一维到二维到多维,难度不是线性增长,而是指数增长
    youxiachai
        77
    youxiachai  
       2020-04-15 13:04:37 +08:00
    单纯学不下去...然后找了个借口....666
    stackexplode
        78
    stackexplode  
       2020-04-15 13:14:23 +08:00
    一个类里面塞一个自己类的指针不就是链表么?
    一个类里面塞 2 到 n 个自己类的指针(数组)不就是树么?
    有啥断层的?
    抽象和实践距离很短,终究只是没学好,只学到了抽象的概念而已
    hallDrawnel
        79
    hallDrawnel  
       2020-04-15 13:21:37 +08:00   ❤️ 2
    这个不是断层,这和学数学差不多,都是先学习特例,然后进行抽象的更一般的推广。

    学数学的时候基本都是这样的套路。比如先学习一次函数和二次函数的倒数,然后就不会不停的学三四五六次函数的倒数了,而是先把基本函数的倒数学了,然后直接推广到一般函的倒数性质,在更一般的层面的学习。当学习一般函数的倒数时,计算的复杂度就会极速上升,然后会发现有的函数甚至没有倒数,现有的求倒方法也不是在所有函数上都适用。这也就像数据结构中简单的数据结构其“配套”的算法也很简单,更抽象一般的数据结构其“配套”的算法也就更复杂。这样的复杂本质数学带来的,这可能是你觉得难度突然上升的原因,本质只是抽象程度提高了。而人类的大脑并不擅长理解抽象的东西。

    数据结构也是一样的,数组链表这样的一纬线性表,是可以通过图论定义的,可以看作特殊的图,数据结构中的树(树也是一个有向无环图,数据结构中接触到的多半是二叉结构,这样的结构在图论中可以精确定义)和图(多半是无环图)也只是图的几个特殊结构,还没有推广到很一般的“图”。图论是离散数学的一个分支,数据结构和算法很多都可以在离散数学里面找到影子。其本质还是一个从特殊到一般的过程。从小到大的数学也基本都是这样教的。
    charlie21
        80
    charlie21  
       2020-04-15 13:27:16 +08:00
    一个节点未发生分叉的树,就是链表

    ( 链表就是一个树阿,把链表呈 45 倾斜放置 就是一个节点未发生分叉的树

    你可以说 你学的从来就是树:不分叉的树 (数组 链表 队列 栈) 、分叉的树 (二叉 平衡 旋转)
    oshio
        81
    oshio  
       2020-04-15 13:29:13 +08:00   ❤️ 4
    我咋觉得很多人理解错了,楼主不是觉得树和图难以理解(这些本来就是日常生活中和常见的东西),而是觉得“其上的计算行为”(算法)难以理解。我觉得这很正常啊,有些本来就不是很直观,否则凭啥最先写出来人还能把名字加到前面。在写出来这些最终的算法前,是不是还有一些更直观但是更低效的算法,又是如何一步一步发展到现在的,我想这才是楼主想知道的,我觉得这个问题挺有趣,有没有资料是讲这个内容的?

    举个例子,比如微积分,我们现在学到的都是有严格定义的,也是极其抽象也难以理解。但并非一开始就是这样,牛顿搞微积分的时候是相对直观但不严谨的,他处理无穷大无穷小的时候都是极其简单粗暴的,发展到现在这样是无数天才的数学家不断改进的结果。一来就是ε~δ这套东西,就能马上理解不感到困惑才是少数吧。现在很多算法就相当于直接就是ε~δ,难以理解也是正常的。
    BlackBerry999
        82
    BlackBerry999  
       2020-04-15 13:43:59 +08:00
    79 和 81 楼 才是理解楼主问题的回答,其他的答主都没有理解楼主要问的。
    logic2chen
        83
    logic2chen  
       2020-04-15 13:48:24 +08:00
    @oshio +1
    makefei
        84
    makefei  
       2020-04-15 13:54:30 +08:00
    很棒的问题,归因到最后或许是人脑在宇宙中的局限性。
    ipwx
        85
    ipwx  
       2020-04-15 14:09:34 +08:00   ❤️ 1
    @oshio
    @BlackBerry999 看我的回帖啊。图论的第一篇论文是欧拉 18 世纪发表的,早在计算机出现前就出现“图”和“树”了。计算机时代只不过是把人家的方法变成了程序而已。“算法”是不过是计算机中的应用数学。

    如果你要看怎么一步步推出来的,去追溯以前的论文呀?从图论一直到拓扑,够你体会揣摩前人怎么一步步完善“图”的概念的 www
    ipwx
        86
    ipwx  
       2020-04-15 14:10:44 +08:00
    当然我没有看过图论的一系列论文,计算机算法经典教材上的内容够我用了。我也不觉得有啥需要追本溯源的,算法已经是非常贴近直观的东西了,没有追本溯源的必要。

    说到拓扑,我倒是一直很想学,但是一直没有充分的时间去做这件事情……
    wangyzj
        87
    wangyzj  
       2020-04-15 14:12:30 +08:00
    我觉得这个东西要从物理上对状态只能二进制保存和处理来解释
    除非有一种别的物质可以物理的存储更多的状态且能控制一定的成本
    而一切数学和数据结构的行程的确也是为这种物理结构服务的
    这一些都要从存储物理结构的 01 状态和 cpu 物理结构的 01 处理方式
    所有数据结构都是从 01 上抽象出来的
    也就是说包括数和图都是从简单数据结构抽象,简单的从物理 01 来

    我是这么理解的
    rtp
        88
    rtp  
       2020-04-15 14:16:03 +08:00
    没感觉是断层的,可能理解角度不同,个人理解最基本的存储结构就是连续的和不连续的,一个对应数组,另一个对应链表,然后剩下的所有的数据结构都是基于二者之上的,例如使用数组表达的队列和使用链表表达的队列,使用数组表达的树状结构和使用链表表达的树状结构…… 难于理解是肯定的,因为不直观啊……
    ipwx
        89
    ipwx  
       2020-04-15 14:19:40 +08:00   ❤️ 6
    再多说一句,教材是很难把“怎么一步步推出来这东西”给你呈现出来的。别的不说,几百年的智慧积累,期间主流思考方法不知道换了多少茬。数学理论也是个不断修正的过程,比如三次数学危机以及后续改变:

    1 、第一次为了解决等腰直角三角形斜边长的问题,诞生了无理数;
    2 、第二次为了解决微积分中“无穷小量”定义不清晰的问题,诞生了实分析(也就楼上提到的 ε~δ 语言)。
    3 、第三次为了解决罗素悖论(理发师悖论:理发师只为小镇上不给自己理发的人理发,请问理发师是不是应该给自己理发?),从朴素集合论发展出了现代集合论。

    楼上提过一上来就说 ε~δ 语言让人无法理解,没错这很正确,我刚学微积分也为之愤慨。但是啊,你一个学期的内容,教材不可能从 18 世纪牛顿的微积分开始讲,然后告诉你这个时代的微积分有什么问题,后续遇到了什么问题,以及实分析的发展过程,最后是测度论的完善。近一点来说,一百多年前康托尔提出实数不可数的时候,同时代的数学家都在嘲笑他呢。

    工科学个皮毛,懂点前几百年数学家总结出来的最精炼的内容(ε~δ 语言),省点功夫去学怎么写代码,岂不美哉?如果对于糊里糊涂感到不满、感到困惑,抽出业余时间自己学习一个呗。学的多了,自然理解这个中来龙去脉了。我也是在不断学习,试图懂得更多,满足自己的求知欲罢了。
    ahaxzh
        90
    ahaxzh  
       2020-04-15 14:20:18 +08:00
    我觉得哈数组、链表、队、栈都算是一维数据结构。
    树、图都属于二维数据结构,只是说树是图的一种。
    所有的一维数据结构都是二维数据结构的一种特例。
    所有的一维数据结构也都能用二维数据结构所表示。
    所以哪有什么断层啊。只是多维数据结构变化复杂。


    以上,纯粹只是个人的观点。
    ahaxzh
        91
    ahaxzh  
       2020-04-15 14:22:38 +08:00
    至于前面有大佬说 树是二维,图是三维,不敢苟同。
    ipwx
        92
    ipwx  
       2020-04-15 14:23:49 +08:00
    @ahaxzh 其实我觉得你用一维二维来分类,我也不敢苟同。。。
    besto
        93
    besto  
       2020-04-15 14:26:50 +08:00
    话说没有树和图的章节,来个 KMP 算法,你就觉得简单了???
    ipwx
        94
    ipwx  
       2020-04-15 14:38:00 +08:00
    @besto KMP 算法和 BM 算法,hhh 。图算法至少是直观的,这俩字符串比较算法,OMG 就是个极限优化版自动机,从来都记不住,临时查资料也要看半天的那种。
    jiangzhuo
        95
    jiangzhuo  
       2020-04-15 14:39:31 +08:00
    书里和教程里的确可能没写,但是上课的时候老师肯定教了吧。至少我们老师开始教树的时候先拿了个二维链表出来,然后竖了起来。
    BiteTheDust
        96
    BiteTheDust  
       2020-04-15 14:39:45 +08:00
    KMP 也可以认为是一种自动机 所以到头来还是一种图
    wozhizui
        97
    wozhizui  
       2020-04-15 14:44:33 +08:00
    @gggxxxx 不同意
    BiteTheDust
        98
    BiteTheDust  
       2020-04-15 14:48:15 +08:00
    另外有人提到用维度来类比树 /图。
    可能是因为虽然说树是一种特殊的图,但是树的性质实在是很特殊。
    很多一维数据结构问题迁移到树上 往往不需要增加复杂度或者只需要增加一个 log 的复杂度(树链剖分 /欧拉序之类的算法)。

    但是我觉得吧,这个观点是搞反了,以下谈谈我的观点。
    图是一种应用广泛的模型,几乎所有问题都可以用图来建模。
    树是一种特殊的图(无环)。
    序列(也就是数组)可以理解为一种特殊的树(单链)。
    phoolean
        99
    phoolean  
       2020-04-15 14:58:41 +08:00   ❤️ 2
    我明白你的意思,这个问题是计算机模型造成的。
    内存是图灵机纸带的具体实现,它本质上是一维的数据存储器。对计算机的操作可以抽象成对纸带的读写,也就是一维的操作,越接近底层的语言越是如此。
    你觉得数组、链表、队列和栈比较简单,是因为你把它们理解成一维结构,这种结构和纸带是简单对应的。
    而树和图,为了方便学习,人需要把它们理解成二维结构。你在纸上画出树和图很容易,但计算机看不懂二维的画。所以你说的附加其上的复杂的计算行为,是二维结构向纸带降维投影的过程。树和图实现起来复杂度上了个台阶,是因为要在一维空间保留二维结构的全部信息;显得突兀是因为它们比计算机模型高一个维度,确实是塞进耗子窝里的大象。
    phoolean
        100
    phoolean  
       2020-04-15 15:15:40 +08:00 via Android
    还有很重要的一点,编程实现时,不像画在纸上的那种点线连接,没有直观结构了
    1  2  
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1030 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 22:52 · PVG 06:52 · LAX 14:52 · JFK 17:52
    ♥ Do have faith in what you're doing.