Chat zero: 前言-2024.4.22
作者著书的感慨记录:
1.不管如何,现在您看到了这本书,那就说明我已经克服了困难战胜了自己。
悟:探索一个新的领域,例如写书,本来就会有许多困难,对照我自身也是如此。但是,怕而不退,畏而不缩,这是我和作者所共同追求的,幸福感满满!
2.好的自学读物的目标是让初学者“独自”全盘掌握知识,需要强调“独自”一词,这就说明读者在阅读时,是完全依靠自己的力量来向未知出发挑战。
悟:说实话,真的是这样的,读者目前是一位大一的大学生的,在大学实地生活了半年后,深有感触的。
大学的老师,目前我所遇到的,大部分都是只讲述课本以内的知识,绝不怎么拓展的,有时候一门课学完后,感觉自己还是什么都不怎么会的;还有,大学时有些老师会注重学生的理解,这当然是好的;但是,缺点也很明显,那就是时间的代价:到了期末结束,这门课的内容都可能设剩余很多还没有讲完的,然后呢,就没有然后了,自学去吧!这是当时老师对我们的建议的。泪目!!!
所以呢,本人现在完全是用自己大一上学期完全实践了这个不变的真理:大学是一个培养学生自学自教的过程,而不是做个仅仅听老师话的乖乖好学生的。
老师教什么无所谓,毕竟,在这个信息高度发达的时代,大部分优秀的资源都是可以共享的。所以,喜欢什么就去勇敢地去做,不用去委曲求全地得到任何人的肯定的,人嘛,干嘛活那么累嘛!安夏是一个喜欢追求自己想要的生活的阳光开朗大BOY的!(当然,一切的追求都是不触碰法律的红线的)
3.尼采曾说过:“人们无法理解他没有经历过的事情。”
悟:认同感满满,真的,我在学习的时候就喜欢用简单模型来一点点理解复杂模型的。而且,著名的学习大师也说过的:凡是我不能创造的,我都无法理解。
我个人也非常推崇用最简单的语言,来描述最复杂的知识的。
费曼大师的一句话我印象很深:“你要想像着把自己学到的知识,通过自己的加工理解,使一个从未接触过这个领域的人都能听懂,(也就是一个八岁的孩子)这样你的学的知识才算过关的”
4.一图值千金
悟:真的是这样,有时候百思不得其解的文字问题,使文字具象化(也就是图片,影像等)就可以轻松理解的。
5.对于初学者而言,不去解释代码的某些细节为什么这样写,甚至代码都不可能在某个编译器中跑起来,其挫败感是很强烈的。
悟:深有体会,前段时间我自学日本的《深度学习》的时候,就经常这样,每次耐着性子去认真学习,最后代码根本跑不起来,全是红的视觉体验真的是……。后来经历了一番自我怀疑,不断忍着眼泪去独自探索,发现是作者书中的代码不适用于最新版的python,那叫一个感慨!
这也许就是自学者的痛楚吧,向一位缺席的老师学习,有好多好多问题,都只能自己在互联网上自己探索答案,但是大部分都是不断碰壁,不断碰壁……
5.本书的研读方法:
付出一些代价,才能获得程杰老师的知识结晶。
“阅读越主动,效果就越好的。”
悟:是的,我个人喜欢亲身经历的学习的,用自己的实践去证明理解学习的内容是否对自己有用的。毕竟,实践是检验真理的唯一标准。
6.阅读时摘抄是非常好的习惯。最淡的笔墨也胜似最强的记忆!
悟:给自己些时间去反复咀嚼作者的精华,乃是人生一大乐事!
7.程杰老师忠告:
学习不可能是一蹴而就的,数据结构和算法如果通过一本书就可以掌握,那本身就是个笑话。
事实上,阅读中的人们只是自我感觉理解,而并非真正的明白。
悟:眼高手低我知道,但是自己也是“初听不知曲中意,再听已是曲中人”
所以每天我都在不断地试错,不断试错,找寻自己梦寐以求的生活和学习方式的。
学习是植物大战僵尸的无尽模式,但是生活中的工作,考试所用的知识是有尽头的,是植物大战僵尸中的基本模式的。
所以加油吧,我要坚持下去,因为:我也有想爱的人,想做的事,想追寻的梦想!
今日到此,期待下期更新!
第一章 数据结构绪论
If you give someone a program, you willfrustrate them for a day; if you teach themhow to program, you will frustrate them fora lifetime.(如果你交给某人一个程序,你将折磨他一整天;如果你教某人如何编写程序,你将折磨他一辈子。)
1.3 数据结构的起源
悟:其实数据结构的出现是为了解决计算机一直用数值计算的一个缺陷吧,为了解决生活中的非数值运算,所以才有了现在的数据结构的。毕竟,生活不止眼前的苟且,不是只有枯燥的数值计算,还有一些非数值的问题的处理,人像识别,拍照搜题等等,计算机都要想知道并去解决的!
1.4 基本概念和术语
1.4.1 数据
悟:数据就是描述客观事物的符号罢了,这些符号不过有些需要求的,就是可以输入计算机中并且计算机也可以看懂给他们才可以的。
1.4.2 数据元素
数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。
比如,在人类中,什么是数据元素呀?当然是人了。
畜类呢?哈,牛、马、羊、鸡、猪、狗等动物当然就是禽类的数据元素
1.4.3 数据项
定义:一个数据元素可以由若干个数据项组成。
特点:数据项是数据不可分割的最小单位。
1.4.4 数据对象
数据对象:是性质相同的数据元素的集合,是数据的子集。
1.4.5 数据结构
1.5 逻辑结构与物理结构
按照时点的不同,数据结构分为逻辑结构和物理结构。
1.5.1 逻辑结构
核心:只关注数据元素之间的相互关系的,其他的像什么:存储位置等,一概不关注的。
悟:这样只关注一方面,可以简化我们的信息量,化繁就简:深入事物的本质。
1.集合结构
各元素地位平等,他们之间没有任何关系:
2.线性结构
核心:一对一的关系,类比火车的车厢一节一节的
3.树形结构
核心:数据元素之间存在一对多的关系,类比皇帝对应后宫佳丽三千,流口水!
4.图形结构
核心:元素之间是多对多的关系
我们在用示意图表示数据的逻辑结构时,要注意两点:
将每一个数据元素看做一个结点,用圆圈表示。
元素之间的逻辑关系用结点之间的连线表示,如果这个关系是有方向的,那么用带箭头的连线表示。
逻辑结构的核心:逻辑结构主要针对问题而言的,它是为了解决某个问题,在问题的基础上去抽象分析元素之间的逻辑关系的。
–摘自2024.4.25
期待下期更新!
1.5.2 物理结构
很多书中又称它为:存储结构(了解即可,不要以后见了说不知道的)
啥事物理结构:
是指数据的逻辑结构在计算机的存储形式。
举个例子:把计算机的存储空间比作酒店的房间, 数据相当于旅客,一组旅客房间挨着住,急救就相当于顺序存储,如果不挨着住,可以简单想象成链式存储的简化理解。
顺序存储:
链式存储:
链式存储的小故事:
1.6 抽象数据类型
1.6.1 数据类型
悟:为什么去定义数据类型的?
核心不过是:减少存储空间的浪费罢了的。
数据结构学习小窍门:抽象理解。可以将虚拟的事务语言,定义等,用生活中有趣的案例去强化理解分析的,方法很好用,孩子学了都说好的呢!
1.6.2 抽象数据类型
感慨:抽象数据类型其实就是将生活中的实际问题(一般是很复杂的),所以呢,就把他们化整为零,分解为多个规模小且容易处理的问题的,然后建立一个数学模型,并把每个功能模块的实现细节作为一个独立的单元,从而就像堆积木一样,将他组装起来就可以用计算机解决生活中的问题了的。
1.7 总结回顾
说白了,为啥子会有数据结构这种课的,原因也很简单的,因为只让计算机初处理些许计算问题的,显示不出计算机的强大,所以呢,为了让计算机更加强大,一老外说干就干,推出了计算机的数据结构这门课程的,从此,让所有学习编程的人来“享受数据结构的乐趣”或者是“感受被他所带来的痛苦的”。
哈哈,正文部分开始:
数据,数据对象,数据元素和数据项的层次关系如下图:(是不是感觉特别清爽)
由数据结构的定义,从不同的角度讨论,会有不同的分类:
老师的温馨话语:
最后,我想对那些已经开始自学数据结构的同学说,可能你们会困惑、不懂、不理解、不会应用,甚至不知所云。可实际上,无论学什么,都是要努力才可以学到真东西。只有真正掌握技术的人,才有可能去享用它。如果你中途放弃了,之前所有的努力和付出都会变得没有价值。学会游泳难吗?掌握英语口语难吗?可能是难,但在掌握了的人眼里,这根本不算什么,“就那么回事呀”。只要你相信自己一定可以学得会、学得好,既然无数人已经掌握了,你凭什么不行。
最终的结果一定是,你对着别人很牛地说:“数据结构——就那么回事。”
哎,我如此口干舌燥地投众位所好,怎么还有人打瞌睡呢?罢了罢了,下课。
第二章 算法
引子:
各位同学大家好。
上次上完课后,有同学对我说,老师,我听了你的课,感觉数据结构没什么的,你也太夸大它的难度了。
是呀,我好像是强调了数据结构比较搞脑子,而上次课,其实还没拿出复杂的东西来说道。不是不想,是没必要,第一次课就把你们糊弄晕,那以后还玩什么,逃课的不就更多了吗?你们看,今天来的人数和第一次差不多,而且暂时还没有睡觉的。
今天我们介绍的内容在难度上就有所增加了,做好准备了吗?
安夏:“嘿嘿,时刻准备着!”
2.1 数据结构与算法的关系:
他哥两个有啥子关系嘛?
举个例子:只讲数据结构的话,会感觉很枯燥的,都是些纯理论的东西,学了数据结构有什么用的?一点也不好玩的。来点刺激的,这时候,算法就来啦!
我们将美妙的算法讲一讲,把那些牛人创造的算法讲一下,咱们就会发现,原来数据结构是这样用的。这就好比上数学课只给你讲一些晦涩难懂的理论,听着听着就会遇到月老啦,但是,给你一些前任用理论做出来的一些好玩的实例,咱们就可以从实例中真正去感受的晦涩难懂的理论背后真正的含义啦,可以理解起来轻松些许的呢。是不是用实例来学习非常清爽的!
2.3 两种算法的比较:
一种是普通算法,另一种是高斯算法。
相当于,简便运算和基本定义的区别的,简便运算算起来真的很舒服,那好的算法同理。
2.5 算法的特性
2.6 算法的设计要求:
2.6.1 正确性
正确性:算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。
但是算法的“正确”通常在用法上有很大的差别,大体分为以下四个层次。 1.算法程序没有语法错误。 2.算法程序对于合法的输入数据能够产生满足要求的输出结果。 3.算法程序对于非法的输入数据能够得出满足规格说明的结果。 4.算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。
对于这四层含义,层次1要求最低,但是仅仅没有语法错误实在谈不上是好算法。这就如同仅仅解决温饱,不能算是生活幸福一样。而层次4是最困难的,我们几乎不可能逐一验证所有的输入都得到正确的结果。
因此算法的正确性在大部分情况下都不可能用程序来证明,而是用数学方法证明的。证明一个复杂算法在所有层次上都是正确的,代价非常昂贵。所以一般情况下,我们把层次3作为一个算法是否正确的标准。
好算法还有什么特征呢?
很好,我听到了说算法容易理解。没错,就是它。
2.6.2 可读性
可读性:算法设计的另一目的是为了便于阅读、理解和交流。
可读性高有助于人们理解算法,晦涩难懂的算法往往隐含错误,不易被发现,并且难于调试和修改。
我在很久以前曾经看到过一个网友写的代码,他号称这程序是“用史上最少代码实现俄罗斯方块”。因为我自己也写过类似的小游戏程序,所以想研究一下他是如何写的。由于他追求的是“最少代码”这样的极致,使得他的代码真的不好理解。也许除了计算机和他自己,绝大多数人是看不懂他的代码的。
我们写代码的目的,一方面是为了让计算机执行,但还有一个重要的目的是为了便于他人阅读,让人理解和交流,自己将来也可能阅读,如果可读性不好,时间长了自己都不知道写了些什么。可读性是算法(也包括实现它的代码)好坏很重要的标志。
2.6.3 健壮性
一个好的算法还应该能对输入数据不合法的情况做合适的处理。比如输入的时间或者距离不应该是负数等。
健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果。
2.6.4 时间效率高和存储量低
最后,好的算法还应该具备时间效率高和存储量低的特点。
时间效率指的是算法的执行时间,对于同一个问题,如果有多个算法能够解决,执行时间短的算法效率高,执行时间长的效率低。存储量需求指的是算法在执行过程中需要的最大存储空间,主要指算法程序运行时所占用的内存或外部硬盘存储空间。设计算法应该尽量满足时间效率高和存储量低的需求。在生活中,人们都希望花最少的钱,用最短的时间,办最大的事,算法也是一样的思想,最好用最少的存储空间,花最少的时间,办成同样的事就是好的算法。求100个人的高考成绩平均分,与求全省的所有考生的成绩平均分在占用时间和内存存储上是有非常大的差异的,我们自然是追求可以高效率和低存储量的算法来解决问题。
综上,好的算法,应该具有正确性、可读性、健壮性、高效率和低存储量的特征。
–摘自2024.4.28 期待下期更新!
原文链接:https://blog.csdn.net/2301_81989907/article/details/138071019?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171852711616800182187826%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=171852711616800182187826&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-4-138071019-null-null.nonecase&utm_term=2024%E9%AB%98%E8%80%83%E6%88%90%E7%BB%A9