数据结构之禅

       <一> 万法皆空  

       当你走出校门,忘记了所学的东西,剩下的就是教育的本质

       在我读大二的时候我听到了这句话,一直记忆犹新,不是我从里边读到了什么,而是从里边读不到什么。像这种根本不知道在讲什么的道理,应该是挺牛逼的吧,我小心翼翼的记下这句话,当做锦囊。

       大四毕业,收拾东西,又看到了在一个手抄本上歪歪扭扭写着的这句话,瞬时热泪盈眶。说这句话前辈真有先见之明,我还没走出校门,就已经忘记了所学的所有东西,真准。剩下的就是教育的本质,这一定就是佛家说的四大皆空的意思吧,人的执着都是相,相由心生,教育得本质就是要学生摆脱执念,得到真正的解脱,室友看了我一眼,“今天回家?”。

       “不,出家。”

       <二> 乘法

       最近迷恋上了武侠小说,恍惚于各种神奇的武功,招式,顺便也玩了许多武侠相关的游戏。其中有几个技能让我觉得很有趣。其中一个武功叫做一阳指,伤害是100 * 技能熟练度, 又看到一个技能叫左右互搏,增加拳法类武功伤害 50% * 技能熟练度。所以真正一阳指打出的伤害为 100 * 一阳指技能熟练度 * (1 + 0.5 * 左右互搏熟练度)

       好一个江湖武功,好一个乘法公式

       <三> 无剑之剑

       据说练剑的高手,能练到只剩剑意而无剑形,拿个木棍也能削铁如泥。而境界再高点可以练成无剑之剑,连木棍也不需要了,对着空气一比划就能灭掉千军万马。

       又看到很多练剑的新手为一个剑法争执不休,说你这不是正宗的剑法,少了一些招式。拿个木棍练剑算什么练习,这是对剑法的亵渎。

        何为剑?何为剑形?何为剑法?何为剑意?何为剑道?

       <四>编程江湖

        据说上古时期的程序员是写机器码的。写好程序,记录在一个打着圆孔的卡带上,运行程序就是读取这个卡带,有孔得的地方为1,没孔的地方为0。这些一串串的零和一最终以电信号传送到了芯片中。

        后来,他们觉得这样不行,这样写程序太麻烦,这还不得累死个人,人不累,打孔机都累了,而且特别容易出错。那怎么办呢,琢磨一下,于是弄出个汇编来,你机器码不是针对芯片或寄存器等操作的吗,那操作总是那几类吧,我何不将这些常用的指令简化一下呢?

        经过研究人们提出了汇编的概念,大家说好,这可以,这样以后就方便多了。

        写了一段时间以后,人们又不满意了,说,不行,这玩意太麻烦,写一个大程序要太多行指令,还是容易出错,精力上还要维护程序的逻辑还要想着这些寄存器芯片怎么调来调去的,不接受。

       于是又一通研究,有了后来的高级语言,像C语言。

       可想而知,争执还在继续,这群人很懒。

       <五>数据结构

       最早人们打架应该是瞎抡吧,但是有些人抡的方式不一样,击打的地方不一样,这群人总是能赢,剩下的人当然比葫芦画瓢的去学这些人是怎么打拳的,久而久之,人们就总结出了一些招式。用这些招式总是能很好的发挥它的作用。比如伏虎拳,打老虎那是一个准,蛇形钓手,速度很快,打笨重的对手也是效果极佳。

       相对于编程语言来说,数据结构和算法就是编程语言的武器和招式。科学家们总结了人们经常遇到的问题,并将解决方案总结成了一个个数据结构和算法。它们总是很有效,比自己的蛮力方法有效得多,实际上对于新手刚开始编程解决问题的时候大部分都是靠蛮力,也能解决问题。但时间,效率,麻烦程度,和适用性上,远不如科学家们总结的要好。

       所以很浅显的说,为什么要学数据结构呢?站在巨人的肩膀上,节省效率,文明的进步也是如此,机械代替了人力,人工智能代替人自己的思维。人性本懒,懒推动了这世界的发展。

      <六>乘法++

       编程 = 编程语言 * 数据结构(算法)

      你会发现,不论是语言功底不够好还是数据结构不够好,都会让自己编程能力显得低下。很多人在学习数据结构的时候总是觉得学不会,碰到问题无法解决。而自己连个二重循环都写不好,这能怨数据结构吗,数据结构本身就是左右互博一样的武功,是一个乘法公式。基础越好,发挥的能力也就越大,学习也是双修。数据结构明明依赖于结构体,指针,链表,你怎么能够避开它们而谈数据结构呢?

       数据结构真的跟编程语言有关吗,肯定有关。是绑定的吗?恐怕不是。没有指针的语言就没法实现数据结构吗?拿一把长枪能不能使用打狗棍法呢?

      <七> 两极

      知其然知其所以然,数据结构分为两部分,数据结构的实现和数据结构的应用。设计各有巧妙,但核心在于封装,在于隔离变化。很多人不知道抽象数据结构是个什么东西。ADT这东西是什么。其实ADT想要告诉你的不是它是什么,而是它们是什么。ADT是这一类东西的特征。举个例子,你为什么觉得唐老鸭是鸭子,米老鼠是老鼠呢?一个人换了个发型你为什么还认识他呢?ADT就是这个关键所在。

       而实现就是说怎么样能更好的,更有效率的去实现一个具体数据结构使得它符合ADT的特征了。而随着时代的发展,实现这部分别人已经做得足够好了,自己很难改进了,很多高级语言也封装了很多已有的数据结构让你去调用,所以实现部分的重心慢慢转移到了知道它的效率如何,时间复杂度怎样,解决什么样的问题效率是最高的,而这一部分又和数据结构的应用紧密结合。

       你学会了栈却不会用栈转换一个进制

       你学会了队列,也不知道怎么模拟一个银行排队系统。

       数据结构的应用和具体问题有关,和算法有关,和编程语言有关,涉及到各方面的能力,数据结构只是其中的一个部分,你需要去练习,去拆解问题,去学习已有的问题是如何解决的来强化这部分能力。

       <八> 同化

       哲学上有个量变到质变的过程。

       编程语言和数据结构也是有感情的,当你不停地敲代码,她会离你越来越近,有一天你会忘了你们的关系,仿佛天生就是这样。

       当你走出校门,你忘了所学的所有招式,当你遇到坏蛋,你会条件反射式的出招,并且总是能赢。

       而又当某天,你突然回忆起了你所学的所有东西,你不明白这点东西当初怎么会纠结的死去活来

你可能感兴趣的:(聊聊学习)