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

2020-04-15 09:01:22 +08:00
 abcbuzhiming
计算机的数据结构这个东西,看起来东西不多,但是里面有一些很突兀的存在。绝大部分书也好,教程也好,介绍数据结构的时候,套路都是 数组 链表 Map(table) ,队列,栈。然后就会出现两个画风(难度)和之前的东西截然不同的存在——树和图。
我搞这行的时间也不算短了,也接触了不少人,发现 树和图 对于大部分人来说都是难以理解的存在,包括我自己也是。不是说他们的表现形式难以理解,而是指附加其上的计算行为,很复杂,有多重变种。和在他们之前的那些数据结构比起来,感觉他们的复杂度猛然抬了个台阶起来。非常的显眼而且突兀。
我注意到这点越久,就越怀疑这两个东西存在的“合理性”,他们就像塞进耗子窝里的大象那么显眼。这中间是不是缺少了什么,我们知道计算机的一切往上追溯都来自于数学,数学能解释这两个东西如此突兀的现象吗,还是说历史埋葬了一些东西,在 树和图 之前其实存在某些“前置科技”,只是因为种种原因,“前置科技”的功能被后来者覆盖了,就消失在历史长河里了
16379 次点击
所在节点    程序员
136 条回复
rus4db
2020-04-16 00:41:11 +08:00
图论的确是很奇妙的领域,近年来无论是深度神经网络、图神经网络,还是网络科学、复杂系统科学、知识图谱,背后都或多或少有图论的影子。
感觉计算复杂度理论(递归论)和图论之间存在微妙的联系。讲不清楚,这或许就是你说的“断层”吧。
Chase2E
2020-04-16 02:05:43 +08:00
数组通过保持插入排出顺序成了 Stack 和 Queue,通过维持大小层级关系成了堆,
一条直线是链表,链表每个节点带 Hash 成了 Key_Value_Map,
链表分叉成了树,左右子树保持平衡是 23 树(红黑),树的节点换成 Character/String 成了 Trie,
链表分叉还连在一块儿了是图,一堆图分类了是 UnionFind 。
这不是很自然...
应用上也是很衔接啊,图用的不多只能是说对应的领域用不到太多图的知识 or 你不能判断一个数据结构 /算法实质上是图上的算法。
nvkou
2020-04-16 02:29:28 +08:00
图论 是数学领域的
wc951
2020-04-16 06:49:19 +08:00
大学 cs 专业有一门必修课叫集合与图论
Perry
2020-04-16 08:05:23 +08:00
学 Combinatorial optimization 的时候那酸爽,确实会觉得复杂度很大。
Greendays
2020-04-16 08:34:58 +08:00
难点不外乎“增删改查”,其实我当年刚接触这些东西的时候,数组,链表,栈的增删改查也令我很迷惑,不觉得这些东西特别简单。

然后到了树和图这块,难度显然是指数上升,因为数据不再是线性排布的了,“增删改查”的维度增加了。你说的“前置科技”大概是不存在的,你的这种感觉,我感觉有点像刚学完 2 元函数,然后去接触 3 元函数时的感觉,脑子里原先有用的“图像”好像都失效了,再接下来的 4 元函数就已经不能想象了,研究起来阻力很大,只能套公式,类似于计算机开发中的“只能调接口”的状态。
ooozx
2020-04-16 08:51:49 +08:00
哈哈哈,看到大家都在批。图确实接触的比较少,最近在解决寻路算法、排程算法的时候经常用到。但树确实能经常接触,毕竟大学的时候大家都得学(半路出家的自动忽略,别杠)。
exploreXin
2020-04-16 09:20:13 +08:00
人脑是组织是细胞神经结构,计算机的组织是电子电路结构,这个最底部的差异注定人脑与计算机的通信过程,需要经过多个层次的降维与升维,才能填平这个鸿沟。数据结构是高层抽象,高层的意思就是离人脑近,符合人脑的思考习惯,而离计算机电路远,不是底层电路通断的方式,但实际人脑神经与电子电路是分属高层抽象两旁的同一概念的实现,就像硬币的两面,逻辑上是一个东西,只是实现不同,之所以要分出两个部分,就是人脑善于决策与艺术性设计,但计算速度慢,而计算机的计算速度快,但是不善于创造性的行为,说白了计算机是辅助人脑的外设,相当于外脑,现阶段的计算机只能是人脑的附属物,无论计算速度与容量如何巨大,附属物的定位是改变不了的,除非强人工智能到来,否则不会改变,但强人工智能什么时候来临,能否来临,都是未知数。

说回楼主的疑问,从上面的角度去看楼主所说的鸿沟,就容易理解了,高层抽象是符合人脑习惯的理解方式,树和图更接近人脑的理解力,而链表,堆栈等等,这些相对容易理解,只是因为它更贴近计算机的一面,这时候想一下树和图从人脑角度理解,像什么?不就是脑神经的链接方式吗,局部脑神经连接方式是树结构,而大范围的脑连接结构就是图了,有环回结构。这时可以得出解决楼主疑问的方法了,楼主想搞清楚鸿沟的产生与原因,需要看一些生物学,尤其是神经科学方面的书籍与资料,然后再加深一下计算机硬件的了解,最后回到软件开发的范畴,就能看明白其实根本没有真正的软件,软件只是电路与人脑的粘合剂,直觉上来说的话,软件的存在是一个似乎很虚的东西,它只是为了拟合两个不同层次的计算体才产生的事物,这时候再看一下鸿沟,是不是问题就感觉很清楚了呢。

软件开发其实只是信息技术的一小部分,想要达到融会贯通的地步,还是需要多涉猎一些自己领域之外的东西,所谓跳出软件学软件,之后再回到软件,到了那时,没有神之力量,也可以获得近神之力了。
kuangwinnie
2020-04-16 09:39:29 +08:00
题做少了
你做多了就知道这是很自然的
__树__ 是有向无环__图__
链表也是一种特殊的树。。。
augustheart
2020-04-16 09:39:35 +08:00
这只是思维方式没转变造成的。中学物理课能完全用日常经验理解,到大学的物理就是完全存在于数学公式里面,按中学的方法就无法理解了,继续强行理解的后果就是各种民科了……
lenjeans
2020-04-16 15:02:43 +08:00
我记得我们那时候老师是用的教室外面的树举例的
反正教大学生应付考试足够用了。
kcer
2020-04-16 16:42:37 +08:00
数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树~~~一个一个看~都是有关联的~
CasualYours
2020-04-16 17:38:55 +08:00
因为计算机的内存地址是一维模型,而数组,链表,队列,栈数据结构也是一维的,对于这些数据结构的操作也是符合直觉的;通常我们在学习这一部分时,大部分人不用借助纸笔,都能想的明白。

但是像树这种结构,为了计算机能够表示,我们实现的时候,通常是将这种二维结构压扁成一维结构(使用数组)。这就导致像父节点和子节点这种在树里是连接的,而在数组实现时常常会出现隔断和跳跃。所以我们在学习过程中,往往会借助纸笔,借助手绘的更具象的模型去理解树的操作(上浮,下沉等)。
winglight2016
2020-04-16 19:44:55 +08:00
如果 lz 表达的是难度忽然提升,这样说没什么问题,毕竟难者不会,会者不难。但是,从难度的跨越推理出“断层”,这就很没道理了,你不能期望世界上万事万物的变化都是平滑曲线拟合吧?归根结底,数学功底不扎实会导致抽象能力较弱,对于复杂对象理解起来会困难一些,但是树和图本身并不是很难,难点在于很多变体和应用场景的对应,没有实际例子来推导一遍,对于学习者来说算法就会变成天书一般莫名其妙。
Cu635
2020-08-06 15:46:01 +08:00
@dreamapple
数据结构和算法导论是哪个出版社谁编写的?哪个版本?
Cu635
2020-08-06 16:01:49 +08:00
@Greendays
“2 元函数 3 元函数”一般叫做单变量与多变量吧……

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

https://tanronggui.xyz/t/662507

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

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

© 2021 V2EX