本人大四即将结束,于2018年12月18日购《算法导论》这本书,慢慢看,第一阶段先主要理解各个章节说的算法都是什么意思,书上的课后习题先不做,用得上什么算法我再详细学习。这是官方课后答案的链接。
放在开头:没有好的算法,坏的算法之说,重点是针对不同的情况,针对不同的数据,针对不同的需求,去选择算法,改良算法。我的数学功底不强,太难的公式我看不懂,太高深的思想我理解不了,我主要以应用为主,不以解释数学公式为主。
我之前在慕课上听过浙大的两位老师讲的数据结构那门课,很基础,很容易理解,这一章也是在介绍几种基本的数据结构:栈、队列、链表、树。
栈(stack)
一种运用指针构成的动态集合,遵循着后进后出的策略。好比摞盘子,最后摞上去的盘子,最先拿起来,同样对一个栈数组而言,一个数组内有一个top属性,top指向这个栈的最后一个元素。
有三种栈操作:
1、判断是否为空:看top这个属性是不是0。
2、压栈:top+=1,赋值。
3、出栈:top-=1,。
队列(queue)
这个是后进后出,跟排队打饭一样。
两个属性:head是指向队头元素,tail指向下一个新元素将要插入的位置。这个地方要注意head=tail时候,队列是满的,还是空的,要注意区分情况,这种特殊情况,在慕课上也有讲解,很简单就能区别。
两种操作:
1、入队
2、出队
链表(linked list)
它的对象是按照线性顺序排列的。与数组不同的是,它的顺序是由各个对象里面的指针决定的。
双向链表里面有三个属性,一个关键字key(用于储存数据),两个指针,prev和next指针。还有个属性是,head,表示链表第一个元素。本章提供了链表的搜索,插入,删除的三种操作,很简单。
如果忽视了表头和表尾的条件,可以添加一个哨兵(nil)对象,用来代替head和表尾,L.nil.next是表头,L.nil.pre是表尾。
指针和对象的实现
有些语言不支持指针,这节就就讲如何不通过指针实现数据结构。不作为重点内容。
二叉树
本节讨论用链式数据结构表示有根树的问题。
一个数节点,有四个属性,p指向父节点,l和r指向两个左右孩子节点,存储的数据。另外还有一个属性T.root指向整个树的根节点。如果T.root=NIL,那么这个树为空。
上面所述的数据结构有缺点,就是如果一个节点的孩子节点有很多,那么就非常的不方便。这就引出了分支无限制的有根树。
这个数据结构还是有父节点p,不同的是,原来的左孩子节点指向的是本节点最左边的孩子节点,原来的右孩子节点指向的是x右侧相邻的兄弟节点。
整这么多花里胡哨的数据结构我也不知道有啥用,可能后面几章会有相应的算法吧。