明天开学,这个时候未免有点小激动,比中午找了一中午准考证看四级成绩还坐立不安,5字头考得不算低空掠过也不算高耸入云,过了就万物复苏的准备六级吧。补了六天的课,明天开始认真了,《算法导论》不敢写读书笔记,资力太浅,等读完整本书再来总结吧,突然发现自己写的公开的读书笔记无形中会让自己态度变得认真许多(幻想某天百度谷歌会收入),加上最近算法家方堃,网络家李焕的影响,更加热忱了点。尤其是这种需要长时间打磨的东西,伤脑细胞的家伙,也算是认真的一个表现吧。寒假看张帆玩切水果碉堡了,1500分,昨天开始玩了下,类似敏捷型的游戏一直是我热衷的,比如小学的时候机房只有一个游戏“是男人就撑过20秒”(每当听到这个名字男人们总是浮想联翩的)一直玩到如今86秒的记录得瑟一下~ 那就不废话了吧,新学年:祝大家学习进步,生活愉快!
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
每本书的绪论总是这么不耐看,但每本书回过头来反倒都会觉得绪论很有价值。
开篇引人入胜的问到什么是数据结构?
方堃同学是这样理解的(要把脑海里面的逻辑结构和电脑里面那些乱七八糟的二进制的物理结构攒在一起思考)
初学数据结构的时候会发现蛋疼是因为伪代码太抽象,C语言基础不好,文字和字母结合太频繁,数据类型繁多复杂,所以那当时就挺喜欢看绪论,看着看着就睡着了—。—
数据结构和算法有什么区别? 打个比方,算n个圆的面积 PI*R[n]*R[n] 就是算法,即计算方法,而R[n]是一个数组,用来存放数据的就是数据结构,简单来说,数据结构就是如何去处理那些数据,比如例1-3的五岔路口就是图的数据结构,1-2就是树的数据结构,还有诸如线性结构、树型结构、链表结构、记录结构、堆结构、散列结构等,这些也可以划分为静态和动态两种,如数组结构就是静态结构,还有之前学习C++的时候抽象的数据结构(ADT),简单的来说那些封装性的东西如class类带函数的数据就叫做抽象数据结构,而接口就是调用的函数,也并非所有的类型都是抽象的,如pair类就是一个实用的没有抽象接口的类。(pair!)
三者皆为包含的关系吧。
另外逻辑结构是两种不同的数据结构联系在一起的一种关系。同样书上说的原子类型和结构类型无非就感觉是dota里面速度之靴和动力鞋的关系。
接着如何表示一个数据结构,这事难点也是重点了,可以用预定义常量如#define 来定义一个数据,类型定义typedef来描述一个元素类型(ElemType),type int status 之所以后来看到很多状态函数都是用status来表示就是用以区分int等,当函数返回值为函数结果状态代码时,用Status类型。
说到算法和算法分析,其实也是废话连天的,抓住效率这个关键词就行了,何为效率代码效率往往取决于代码的执行过程所消耗的时间空间等,换句话说,机子如果瞬间就能处理大量数据,所有的存储都不占空间那么还需要算法么。。古人貌似经常不吊死在一棵树上不罢休,比如今天看到的八皇后问题,高斯1850年提出短短四年后柏林象棋杂志上就登出了40多种不同的解法,算法是无穷的,对于我们来说是无情的,所以我想认真总结一下效率问题:
撇开问题的规模(如求100以内的素数还是1000以内的素数),不同的语言(c语言java语言等)、计算机硬件软件和环境因素这些外界条件不谈,光讲算法本身,有几个量还是要注意的,比如时间量复杂度T(n),空间复杂度S(n),n为问题的规模。
如小学我们就知道1+2+3+....n的题目,如果用直接加的算法,T(n)=n,如果用n*(n-1)/2的算法时间复杂度就是T(n)=1了。是不是碉堡了。
再而我的理解就是时间复杂度比如for循环100次就为100,空间复杂度如long占用4个字节double占用8个字节这就是。但是效率又是集所有因素在不同的条件之下而分析出来的,这里就不详细介绍了,之后会出现大量的算法再一一介绍。
常见时间复杂度,按数量级递增排列依次为:
O(1)<O(log2n)< O(n) < O(nlog2n) < O(n2) < O(nk) < O(2n) < O(kn) < O(n!)
有些人就会问比如像背包问题这类大型问题怎么计算时间复杂度,这个的确比较复杂了,有个专门的符号我这里打不出来就是可以包括时间复杂度的上下界,然后通过和式或者递推关系来猜测大概的时间复杂度。有些经典算法前人已经算好时间复杂度如分治算法T(n)=aT(n/b)+cn^k 就直接套数据上去了。
至于绪论也只能深入浅写了,毕竟真正的结构算法还漫长着,数据盛行的时代又让我联想到一部电影,源代码,其实我们电影里面看到的人在避难舱里面的人只不过是导演安排给我们看的,如果你是坐在那位女指挥员旁边,只能看到电脑给我们呈现的代码而已。也不知道自己是什么时候开始感悟要在书上做点笔记啥的,或许将教条的东西用自己的话说出来,用自己的话来一点一点复杂的计算机问题会比较好,这样就知道自己哪些是真正掌握了,毕竟写出来的东西要经过自己层层的思考,当然也希望大家能够指出我的错误让我不断更新不断完善笔记。写总结虽然会占用很多时间,但是将来温习只需要五分钟就可以再次记录这些算法,如果我写的东西深深的刺痛了你的心灵~ 可以随时吐槽~~~~~(—。——。—)。