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

2020-04-15 09:01:22 +08:00
 abcbuzhiming
计算机的数据结构这个东西,看起来东西不多,但是里面有一些很突兀的存在。绝大部分书也好,教程也好,介绍数据结构的时候,套路都是 数组 链表 Map(table) ,队列,栈。然后就会出现两个画风(难度)和之前的东西截然不同的存在——树和图。
我搞这行的时间也不算短了,也接触了不少人,发现 树和图 对于大部分人来说都是难以理解的存在,包括我自己也是。不是说他们的表现形式难以理解,而是指附加其上的计算行为,很复杂,有多重变种。和在他们之前的那些数据结构比起来,感觉他们的复杂度猛然抬了个台阶起来。非常的显眼而且突兀。
我注意到这点越久,就越怀疑这两个东西存在的“合理性”,他们就像塞进耗子窝里的大象那么显眼。这中间是不是缺少了什么,我们知道计算机的一切往上追溯都来自于数学,数学能解释这两个东西如此突兀的现象吗,还是说历史埋葬了一些东西,在 树和图 之前其实存在某些“前置科技”,只是因为种种原因,“前置科技”的功能被后来者覆盖了,就消失在历史长河里了
16302 次点击
所在节点    程序员
136 条回复
InkStone
2020-04-15 11:41:51 +08:00
@RubyJack 线性表的定义也是递归的。链表一样是很典型的递归结构,只不过是尾递归,所以简单一点。
levelworm
2020-04-15 11:45:03 +08:00
@nicebird 树只要不旋转就都很简单,无非一点递归,但是一旦涉及到旋转的自平衡,我就自学不下去了。。。
letking
2020-04-15 11:50:12 +08:00
树和图你都觉得难以理解,那纯粹是你不愿多花功夫去学习……哪有啥断层和“前置科技”啊。
别和身边差的人比,这一行里理解树、图并觉得非常自然的大有人在。
也别为自己找花里胡哨的借口,这完全是多花时间就能学会的东西。
nekochyan
2020-04-15 11:51:54 +08:00
可能学了离散数学好理解一点?
InkStone
2020-04-15 12:01:04 +08:00
我觉得很多人就是学得太少想得太多。树和图的基础定义确实比线性表难一点,但充其量也就是 1 和 5 的区别——而算导前中期的难度就可以达到 50 。
paoqi2048
2020-04-15 12:04:32 +08:00
尾队列有点绕的
acidsweet
2020-04-15 12:05:38 +08:00
不是很理解楼主的意思;按照前驱后继来理解:
1 前驱 1 后继:线性表
1 前驱 n 后继:树
n 前驱 n 后继:图

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

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

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

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

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

你可以说 你学的从来就是树:不分叉的树 (数组 链表 队列 栈) 、分叉的树 (二叉 平衡 旋转)

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

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

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

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

© 2021 V2EX