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

2020-04-15 09:01:22 +08:00
 abcbuzhiming
计算机的数据结构这个东西,看起来东西不多,但是里面有一些很突兀的存在。绝大部分书也好,教程也好,介绍数据结构的时候,套路都是 数组 链表 Map(table) ,队列,栈。然后就会出现两个画风(难度)和之前的东西截然不同的存在——树和图。
我搞这行的时间也不算短了,也接触了不少人,发现 树和图 对于大部分人来说都是难以理解的存在,包括我自己也是。不是说他们的表现形式难以理解,而是指附加其上的计算行为,很复杂,有多重变种。和在他们之前的那些数据结构比起来,感觉他们的复杂度猛然抬了个台阶起来。非常的显眼而且突兀。
我注意到这点越久,就越怀疑这两个东西存在的“合理性”,他们就像塞进耗子窝里的大象那么显眼。这中间是不是缺少了什么,我们知道计算机的一切往上追溯都来自于数学,数学能解释这两个东西如此突兀的现象吗,还是说历史埋葬了一些东西,在 树和图 之前其实存在某些“前置科技”,只是因为种种原因,“前置科技”的功能被后来者覆盖了,就消失在历史长河里了
16301 次点击
所在节点    程序员
136 条回复
sunjiayao
2020-04-15 10:31:38 +08:00
楼主头像不错
imnaive
2020-04-15 10:33:59 +08:00
我觉得楼主想说的“技术断层”指的是实现难度的断层。
数据结构难度可能就是像台阶一样跃迁上升,没有那么平滑。
boileryao
2020-04-15 10:39:45 +08:00
@Cabana 没说清楚:理解不了短除 [doge]
wutiantong
2020-04-15 10:43:40 +08:00
这只能说明你还没学明白
ipwx
2020-04-15 10:45:12 +08:00
可是,函数调用栈展开了画就是一棵树啊。。。早就隐含了。最简单的斐波那契数列的求和式子,你把递推式展开了写,不也是一棵树么? F(n) = F(n-1)+F(n-2)

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

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

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

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

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

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

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

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

就好像 400 年前 人对小数感到陌生一样
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
2020-04-15 11:14:33 +08:00
估计 lz 没有发现 linked list 和 tree 的联系。
nicebird
2020-04-15 11:19:56 +08:00
树相当多,基础的也很简单,比如二叉树,但是不实用,最终进化成了各种平衡树。

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

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

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

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

而数据结构:图去除环路就成了树;树去除分支就成了链表。看起来难度曲线还是挺随和的。
zooo
2020-04-15 11:39:03 +08:00
还有一些比较深奥难以理解的知识(非入门级教材),其实是理论的创造者经过好几年的摸索得到的知识,有时作者都很难说清自己的方法逻辑链(偶然有的灵感),这些东西需要慢慢消化了,毕竟人家几年时间创造的理论或者算法,不可能一两个小时被别人就弄的很清楚(尤其是逻辑链)

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

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

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

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

© 2021 V2EX