本文的思维导图。
这帖子是怕是得慢点挤了。想得起来就写写吧。学习过程中有什么感想就记到这里。我还得去准备我这一连串的考试,唉!说不定等我坐高铁回家的那么长的小时里面,会闲着写写。期末还是认真复习一下吧。
(高铁是坐完了,人也快累死。考试也考完了,但是今年也不一定能很轻松的过啊。回来路上看了看算法书,体会到了什么叫做挫败感。简简单单的一个加密,就是不同的思维的运用,对称的和非对称的,有意思,这次是真真见证到了mod是啥玩意2021/12/24)
人的思维是没有边界的。很多事情不在于它是怎么样?而是在于我们如何看待它。如果将学习视为一种折磨,那也太辛苦与卑微了。不如将学习视为一种乐趣。事情不会因为我们怎么想就改变它自己。能改变我们的感受是我们的想法。
反正无论如何都得负重前行,不如让这重量给自己贴近泥土的、真切的活着的感觉。这不是不可承受的生命之轻,这是可承受的生命之重。
我愿在我埋头前行的时候,还不忘头顶上那篇广袤又深邃的宇宙。
现在愈加觉得,单纯靠一张嘴去说明一件事物,要么容易过于抽象,要么又太杂乱,不好去把握整体的逻辑。而这也不是逻辑清晰就能完全避免的。而本篇的核心主题就是数据结构与生活之间的联系。更多的起的是点破作用。但是这样看起来更加强硬。好像必须是如此的一样,失了主动。事物可以看得很复杂。有时候只是多走一步,就能见到新的天地。最近在街上散步时,看着路边的树,突然想到,树能降低存储的次数,确实如此。树叶有多少片啊?只知道每到秋天,就全掉下来,能把地面上铺满。但是树虽然承载了如此多的树叶,仅仅占用了如此点的地方。自然界真是神奇啊!从前还曾矗立在江边,看着江水从旁而过。倒也有番滚滚长江东逝水、浪花淘尽英雄的味道。现在用上计算机的脑子,这江水更像计算机那个很抽象、模糊、又重要的概念——stream。霎时间通透了!流恰如这江水,只知道向东奔去。去往何方?不知。从何方来?亦不止。天 地 之 间 , 其 犹 橐 龠 乎 。虚 而 不 屈 , 动 而 愈 出 。恰如是也。没有使用时,处于虚之际,仍不屈。在要使用时,也不会停止,只会越来越多。孔夫子看见江水也有番感悟——逝者如斯夫,不舍昼夜!时间也是一种流啊!它带给你生命,带给你变化。你可以在被这流裹挟中发出自己的一声声呐喊!将这流改变!时间的一特性,当然,至少在现在看来,是永远动态的。实在是一很了不起的特性。这恐怕是计算机很难模拟的。计算机处理问题会预先预测规模,属于成竹在胸。而永远不停止的时间则要求随机应变。可做一生二,二生三,三生万物之变。看以后是不可预料的。但是相反的,看以前是可预料的。以后总能发生一些让你无法琢磨的事情。毕竟,你呆着这个世界内,被这规则所限制,又如何跳出看得一清二楚呢?未来不可期,过去无法改变。那就改变未来的过去吧!也许有时会疑惑,人这活着是为啥?可是未来处在迷雾中,也不确定。无法成为现实。那何不在将死之际再考虑这个问题呢?所有的早已确定,你就能说,我这一生干了啥?我这一生活着是为啥?毕竟,与其疑惑于一个不可解的问题,不如好好安心生活。假如死亡已近在咫尺,我们是否还会像现在这样活着呢?2022/1/25
数据结构
【1】对于数据结构本身,它是运用计算机解决问题过程中对问题的抽象与分解的产物。很多数据结构是 协同使用的。在需要的时候就去调用相应的数据结构。如在图的广度优先遍历中,就是对图这种数据结构的操作需要了队列这样一种辅助的数据结构。而对于图的深度优先遍历,则是利用了系统给我们提供的栈,我们才能去实现递归调用的程序。
【2】许多问题是可以分开来考虑的。将每步运用上自己学习的知识,对它进行解决。最后每步的解决导致了整个看起来很大的问题的解决。这样的处理是先见森林,再见树木。例如对于未来的规划,看起来是一个很宏大的处理,但我们如果先将其落实到每一年,再在每一年落实到每个月,每个月到周,周到日,日到小时,小时到分钟。如此,一头牛也就轰然倒塌。长跑亦是如此。只能看见1km的人是悲哀的。如果每迈出一步,你就能在心中告诉自己——我又迈出了一步。那么你的心中会有一种荣耀感。这种荣耀感能激励你继续向下跑。
数据结构的存储结构与逻辑结构
【1】数据结构还需注意的一点是它的逻辑结构与物理结构并不是一体的。存储可以和具体的逻辑分开。不是说树的逻辑结构,就非得采用二叉链表的形式去存储。而对于链式关系来说,仍然可以采取顺序存储的方式去做到。总而言之,不能在我们脑中将逻辑结构与物理结构捆绑在一起。
【2】不要带有偏见或者固有的立场去处理事情。要能看到事物的多样化发展。并不是说玩游戏就会阻碍正常成长,加以适当引导也能收获不少。成功的途径也并非只有赚钱一条路,达到自己的自我价值实现也是一种成功。考试失利并不意味着你人生就完了,你只是需要换个方向去实现自己的价值罢了。如浙大的一位学生,他之前努力学习,门门满绩,但是有次考试,他因为前一天学的太累,而错过了考试。但是他在思考后,大彻大悟。决定只把时间花在自己喜欢做的事情上面,其他的及格就行。他喜欢的事情是打游戏和ICPC。他为了通关日本游戏,自学日语,翻译了一本日语算法书并出版;他打ICPC打到了世界冠军。故事中本人的描述 陈越姥姥的描述生活是一条小径分岔的花园,但不管你如何选择,终究能欣赏到花园中的美景。
算法
【1】 和数据结构紧密相连的就是算法。算法的英语名称的来源是数学家花刺子模的名字(al-Khwarizmi)。
【2】 对于算法来说,算法是必须正确的,是针对规定的问题的可以在我们忍受的时间内得出解答的方法,步骤。因此其必须正确,高效。
【3】 算法是将人脑中抽象的思想应用于问题后的解决方案。它终究是写给人看的。过于的抽象,别人根本理解不来。那就像说我有好想法,但是我没办法简单的表达出来,也是用处不大的。
【3】 算法也不能过于死板。生活中是充满着变化的。问题不是一成不变的,它的信息会发生变化,如果你的算法还能应对变化的情况,按照数理统计中对估计量的评判标准,我们可以近似的说算法的有效性高。用计算机的术语来说,就是算法的健壮性好。
【5】 算法需要定量的评价标准。对于算法的评价都不够量化,皆是定性的说明。而对于算法来说,可读性,健壮性并不适合量化,这些设计到个人的感受。当一件事情参杂了个人感受后,它就不够客观。
【6】算法的运行效率。但是算法的运行效率和输入是有关的。算法总能找到能让它运行效率高的数据。这样的比较是没有什么意义的。我们应当考虑最坏的情况,未雨绸缪,在事情还没发生之前就预料到它的发生,这样才能让事情在掌控范围内。也就是说,通过提高预测的范围,增大置信区间,去提高可信程度。
【7】运行时间并不是所有。如果有算法能在1秒中得出答案,但是需要超级大的电脑内存。那它的用处也是不大的。因此,除去时间,空间也是在我们的考虑范围内。空间的评价和时间是类似的,只不过将单位进行改变。
递归与非递归
【1】递归与非递归之间的转换靠的就是栈这数据结构。最开始学习树的非递归遍历算法的时候,觉得很麻烦,为啥要把用递归那么简单的事情搞得这么复杂?
【2】现在我对我自己提出这个问题的回答是,方便我们认清事物的本质,而不是雾里看花。这些算法学习后方便我们以后对于更多的事情能有方法去处理。比如写个非递归的BFS之类的。学计算机终究不是学怎样组合积木。知道它是怎么用的很重要,知道它为什么这么用也很重要。生活亦是如此。知道我们怎么去吃饭很重要,知道为什么要这样吃也很重要。这样我们才能活更久,活得更健康。
【3】人不是机器,给了指令就照做,并不附带多余的思考。人还有着求知欲,探索欲,有着掌控未来的欲望。这样才有如此多揭露事情本质,方便我们预测未来的理论。
基本线性结构
栈和队列
【1】最开始学习栈和队列的时候,总是不懂,为什么要去限制它们的操作?我用数组明明能更方便,不止能读取队首,队尾,栈顶,还能实现各种操作。我为什么还要做更深层次的封装呢?
【2】现在勉强能回答自己的疑问了。虽然我丧失了我更方便读取数据的能力。但是我的栈和队列使用上更方便了。它是变成了我们内化于心的一种数据结构,就像数组一样。我们并不需要去考虑这些数据结构是怎么实现的,我们只要用就好了。
【3】当我们将数组的运用视为当然的时候,我们的程序设计也就入门了。当我们将栈和队列视为当然的时候,我们的数据结构也就入门了。
【4】这样来说,对数据读写的限制反而方便了它的使用。这不得不说是塞翁失马焉知非福了。这也蕴含着更深刻的哲理,我们失去了一些东西的同时,我们也获得了一些东西;同样的,我们获得了一些东西,也失去了一些东西。世界是无私的,也是公平的。可能暑假花费时间看的一部电影激发了我们的灵感,从而提出了一个新想法,新项目。也可能在获得游戏游玩的快感,去失去了我们学习的时间。
链表
【1】在链表中体现了一种十分经典的策略——以空间换取时间。在单链表中,找前驱麻烦,那我就再加一个指针域指向它。这样就得到了双链表;单链表后面的那个总是空,那我就再让它指向头节点。这样就得到了循环链表;把这两者再进行组合,就是双向循环链表。
【2】这种策略运用也颇多。在clash royal中,只要圣水多过3倍,再好的策略,再好的操作,也是白瞎。只要我等级比你高100,我管你有啥能力,被我摩擦就好了。在星际争霸中,只要电脑的操作速度快于人类32倍。纵使反应再快,策略好,也是打出GG的命运。我每天迟到怎么办?我直接到教室睡觉还怎么迟到!
树
-
AVL树
不知大家想过没有,为什么AVL树非得在每次插入一个结点就去调整,而不是等插入结点结束之后才去调整?
首先,树作为一种动态的数据结构,我们并不能确定哪个时候才是输入的终结。可能就真的是从1到无穷大了。因此在所有数据插入结束后,再去调整不是太现实。其次,在插入后调整,能保证下次的树就能满足平衡的要求。这警示我们如果发现了错误,就要即使改正,而不是等到已经改不掉再去懊恼当时为啥没改正。勿以善小而不为,勿以恶小而为之。 -
B-树
对于B树这种数据结构来说,它其实就是将关键码分段,更便于查询了。如果按照往常的办法,从上至下生长,容易让关键码分配不均。针对这种情况,AVL树采取的在这基础上调整为有序。但是B树不一样,它直接就换了个问题。从根源上断绝了这个问题,可以说在 上医治未病,中医治欲病,下医治已病中就已经超脱了下医达到了更高的境界。而后又加上了一系列的限制条件,让B树能够平衡。思维方式转变后,原来看起来很困难的问题经过转化变得简单了。一步不能登天,那就多走几步。学习的时候感觉学不通透,学不会,那不妨看看完全相反的东西。学数学学不会就学语言,语言不会再数学。如此之循环,反而更有效。一门学久了,思维难免固化,(不过这也证明你入门了)。不妨再看看其他的,打开视野。天下学科本是一家,只是有许多不同的特定的需求,才越来越细化。虽然这也是在用东方的 “道通为一”思想罢了。2021/12/24 23:50