感谢FunTester送的书籍。建议大家买或借来看看,一起学习下。本文主要是记录我看这本书的心得,不一定理解是对的,是我自己悟出来的体会,而不是按书照抄,都是凭自己的理解写出来的,相当于在写一本书了,哈哈。。。。十个人看会有十种不同的见解。一定要结合书看,先把书看完,在看看别人的心得,这对自己的提高有一定帮助。还有这本书本来就是算法,肯定跟学数学一样,一定要多思考,不要死记硬背,理科不像文科,理科靠逻辑思维,文科靠记忆。

第一章 算法概述
1.算法
什么是算法?书中举了1+2+3+4....+....10000=?,你怎么去计算,你是要一个个加还是有什么技巧。所以我理解算法就是:算数的方法,简称算数的方法。
当然本书的算法是应用在计算机程序领域,无论是:运算、查找、排序、最优决策/路线、面试(如果这也算的话),我们都需要到算法,就看你要怎么去计算,用到什么方法技巧。
当然,不管白猫黑猫,能抓到老鼠就是好猫,无论你怎么算,结果都是对的,但是呢,谁算的更快(效率),算的更简洁(简单)。就像考试,你虽然结果对了,但是写了密密麻麻一页纸,人家仅用几行就算出来了,你说老师给谁高分?这就是我们接下来要讲的,算法有什么影响。
2.数据结构
什么是数据? 数据是用来存的。什么是结构?就是你怎么去存这个数据。站着存还是躺着存。
存数据就存数据,为啥要分类,你还管我怎么存。因为数据你不仅要存,还要取,要修改,这又涉及到高效问题。比如你存个东西进仓库,放在很隐秘的角落,你让我去取,我怎么知道在哪里,找起来多麻烦。又比如下图找出不同的哪吒?

这就是你存放的数据没有关联,没有按一定的规则摆放。你找起来是不是比较困难?
在数据结构中,我们常见的有:
线性结构:最简单的数据结构,就类似一串串连起来似的,如:数组、链表、栈、队列。。。
树:相对较复杂的结构,看着并不复杂,但是遇到的时候,算起来就知道了,就像一颗树看着简单,但是它有很多的枝叶、树根、延绵不断,而且全世界每片叶子也是不重复的,你说它复杂不?
图:那更好理解了,就是有一定的关联性,比如你存东西后,拍照,下次可以凭图片查找。但是还是更为复杂,你想凭一张图就能很快找到东西?
其他数据结构:还有好多好多,我也记不住。反正你想怎么存就怎么存,你可以按照自己的规则来存放,你能快速找到就行。但是在计算机世界,伟人已经帮我们研究了很多种方式。例如:哈希链表、位图等。
3.复杂度
根据上面所讲的,算法啊,数据结构啊,都是说效率的问题,看谁效率高,速度快等。
书上举了两个人完成一个程序,一个人的程序比另个人时间比较久,占用空间内存大。(就是两个人考试写一套题,一个人完成的时间比较久,写了密密麻麻一页纸,另个人很快做完,就只花了几行就得出答案)虽然最后答案是对的,你说谁厉害?
这里只涉及时间和空间的复杂度的概念,还有涉及其他的吗?
3.1时间复杂度
时间复杂度用大O表示,也称为大O表示法。
就是说你无论怎么做,总得有一定的规律,得出一个公式来表达,这就可以计算两个人所耗时多少了,如:O(n)、O(logn)、O(2n)等等。
你要遇到这种时间复杂度,就是看你要怎么去完成,然后的计算规律是什么。这个我也不会去记,我只要了解它的基本概念。
书中举了几个例子,可以吧书中例子看完,然后记住那几个公式最好,我这里挑个简单的:
1个长度为10cm的面包,你每3分钟吃掉1cm,那么吃完需要多久?
答:这个小学生都会算吧,3*10=30分钟,如果长度是n cm ,需要多久吃完?那就是3n分钟。
那程序就是f(n) = 3n ,即时间复杂度O(f(n))
说白了,时间复杂度就是把程序相对执行新世纪的函数f(n)简化为一个量级(有规律公式),这个数量可以是3n、n、2n等方式
这里有个思考:
就是说现在的计算机越来越先进,计算速度、硬件啥的越来越高科技的超级计算机,为什么还要重视时间复杂度?
书上举了一个例子:
A(运行在旧电脑上)的时间复杂度简单f(n)=100n,B(运行在超级计算机)的时间复杂度复杂f(n)=5n^2,然后不断的增大n的值,看得出的结果对比;
答:发现B越到后面数值越大,速度越慢,就算在快的计算机也会被耗尽。和A的差距越来越明显。
所以时间复杂度对程序运行时很有用的,如果你看好好利用,你的算法越好,你的程序运行越快。
小结:时间复杂度是一个算法运行时间的长短。
也就是说你用这个算法的时候,你耗了多少时间。
3.2空间复杂度
学了时间复杂度,空间就更容易理解了,一个时间,一个空间的区别而已,道理大同小异。
空间复杂度也用大O表示法。
书上举了一个例子:
就是有一串数字,有两个是重复的,找出这两个重复的整数。如:32154972
答:如果每个数都遍历一遍,如3跟前面的数比较,然后在2跟后面的数比较,也要跟前面的数比较还要回顾去跟3比较,这无疑浪费了。怎么提高效率呢?
这里书中引用了字典,就是说你一个个执行,然后记录一次,即Key值,如果后面有相同的,就在key值加1,就很明显了。
如果脑回路跟不上,那就不要跟了,学数学本身就这样,不要强求。只要理解什么概念就行。以后会慢慢领悟的。再说了,我这里只是心得体会,如要想学习看书看视频教学,这里不会图文并茂这么清晰的。
空间复杂度的计算:常亮空间、二维空间、线性空间、递归空间。
小结:空间复杂度就是一个算法在运行过程中临时占用存储空间大小的量度。
就是我在用算法的时间,肯定占用一定的空间内存大小,这应该很好理解。
第二章 数据结构基础
1.数组
这个我都不想讲,无论是科班出身的同学,还是自学编程的同学,这都是常识。但是这里讲的是算法。基本概念我就略过。
数组分为一维数组,二维数组。。。。
1.1一维数组
很好理解,就是一列比较整齐的队伍,你是按身高、还是按年龄等排列,然后有新的元素补充进来,你要怎么快速的插进去。或者你要怎么快速的查找某个人等等。
所以我都还没有看这节,我就知道接下来它要讲什么内容。
数组的特点是什么?一个队伍,是不是有报数,每个人都有自己固定的数。你要查找某个人是不是对应号码查找比较快。但是你要新增或删除一个,那其他人的号数是不是跟着变啊。
所以涉及这些关于数组的新增、删除、查找、替换方式,要考虑它的时间、空间复杂度。具体细节看看书。
2.链表
如果说数组是正规军,那链表就是地下党。数组是有规律有序的(顺序),群组有对应的号码对应的人(具体住址、电话等),但是链表不是(随机),没有知道它的存在,为防止暴露,他们只能单向联系。他们借助这种单线联络方式,灵活隐秘的传递重要信息。
2.1单向链表
其中就是单向链表。如:
A --> B --> C --> D --> NULL
单向链表有两部分组成,一部分是存放数据的变量data,另一部分就是指向下一个节点的指针next,他们一级一级的传递信息。
2.2双向链表
有单向链表肯定就有双向链表,这个就相对复杂些,多了一个指针prev,就如:
NULL <-- A <--> B <--> C <--> D --> NULL
双向链表看着不像是单向联系,但是不会相互影响,比如C叛变了,但它只能出卖B和D,只要B不说,它就没有办法知道A是谁。
所以链表物理上是非连续、非顺序的数据结构。由若干部分组成,有头有尾。
了解链表的概念后,接下来就是对链表进行增删改查的算法解析了,这个具体看书。
原文作者:FunTester;如有侵权,请联系管理员删除。