“学习笔记”之《算法导论》----第三部分----数据结构----第十章----基本数据结构

版权声明:未经博主允许,勿转载 https://blog.csdn.net/qq_34754836/article/details/86623213

本人大四即将结束,于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右侧相邻的兄弟节点

                                

整这么多花里胡哨的数据结构我也不知道有啥用,可能后面几章会有相应的算法吧。

猜你喜欢

转载自blog.csdn.net/qq_34754836/article/details/86623213