算法解读:数据结构

什么是数据结构?

大量数据的有效管理机制。描述计算机算法的时候使用的数据结构有很多种:

  数组:连续排列数据的数据结构,数据以线性无间隙地排列
  链表:数据按照顺序排列的数据结构,链表可以管理线性排列的数据,也可以远距离存放
  栈:类似于桌子上堆书一样来管理数据的数据结构,栈是一种与数据输入顺序相反,逆序输出的数据管理方式
  队列:如同在超市收银台结账一样,先来的顾客先付款,队列是数据输出顺序与输入顺序一致的数据管理方式
  树:如同树枝可以分出两个、三个甚至多个树枝,而每个分出来的树枝还可以再分出两个、三个甚至多个树枝一样

在栈管理数据中,数据输入操作叫做入栈(Push),数据输出操作叫做出栈(Pop). 栈是有最后输入的数据最先输出这种特点的管理方法,我们称为后进先出(LIFO--Late In First Out), 或者先进后出(FILO).

队列

刚刚栈是先进后出,或者后进先出,那么队列则是先进先出(FIFO--First In First Out),或者是后进后出(LILO--Late In Late Out)的数据结构.

链表

链表的数据长度没有限制,且物理上可以不连续。

一维数组根据数据无间隙的线性排列来管理数据的前后关系,也就是说数组是把数据放入相邻的盒子中,这样就会知道顺序的数据结构。数组的各元素比较松散时,数组地址空间中数据的顺序就无法得知了,这就意味着,数组中各个元素必须紧密地放在一起不能远离。

单向链表跟数据存放的位置无关。即使移动数据的存储位置,也能以正确的顺序管理数据。

在管理有多少个有效数据上,数组根据变量来管理数据的个数,链表是”没有指向下一个数据的指针“时到达链的尾部。

单向链表

链表中,从前向后由有方向性的链连接,将有一定顺序的数据连接起来的方法叫做单向链表。

单向链表有两种要素:数据(结点中保存的整数、浮点数和字符串等由链表管理的值)和指向下一结点的指针(后继指针,指出下一个元素的物理地址)。

购物顺序链表表示:

从家里-->水果店买水果-->去肉店买肉-->去鱼店买鱼-->去点心铺买点心:这里不考虑回家的情况,即不考虑循环链表的存在

双向链表

在链表中从前向后和从后向前两个方向都有链,并将有顺序的数据连接起来的方式叫做双向链表。

双向链表有以下三种要素:数据,指向前一节点的指针,指向后一节点的指针

双向链表中还需要指出头结点和尾结点的指针,且双向链表中的每个元素由数据和指向前后结点的指针构成。

从前向后遍历数据的时候,从头指针指出的元素开始,使用后继指针,得到下一个元素、下下个元素,依次遍历。

从后向前遍历数据的时候,从尾指针指出的元素开始,使用前驱指针,得到前一个元素、前前个元素,依次遍历。

查找元素

查找按顺序排列的数据的第N个元素时,数组可以根据元素号直接找到元素。链表必须从头节点开始遍历直到第N个元素为止,比如同样查找第5个元素,数组可以直接通过array[4]定位到该元素,而链表的查找顺序如下:

  查找第1个结点
  从第1个结点查到后继的第2个结点
  从第2个结点查到后继的第3个结点
  从第3个结点查到后继的第4个结点
  从第4个结点查到后继的第5个结点

没有以上5个步骤就无法查找到第5个结点。依次类推,如果查找第10000个结点....因此,在查找第N个元素这种情况,数组比链表更有效率。

插入删除数据

在顺序排列的数据列中的特定位置插入新的数据时,数组要把插入位置后面的所有元素都向后移动,而链表只需要断开数据位置前后的链,将新的数据连接到链表中就可以了。

删除数据也一样,对于数组执行删除数据的操作,删除数据后面的所有数据都要向前移动,而链表,无论删除的数据后面有多少个数据,只需要断开删除数据的链接,然后把前后两个结点直接连接起来就可以了。

因此,删除和插入操作中,链表的效率较高。

二叉树

单链表是使用”指向后继结点的指针“将数据连接起来的管理顺序的数据结构。二叉树有两个指向后继指针的单链表。

二叉树中,构成要素称为结点。二叉树是由一个父结点和两个子结点。

二叉树中并不一定都有左右子节点,只有左结点或者只有右结点也是允许的,但是有三个及以上的子节点存在是不允许的。

没有父结点的结点称为”根结点“,没有子结点的结点称为”叶结点“.

堆中,父结点的值不得比子结点的值大,或者,父结点的值不得比子结点的值小。

堆适用于求最小值的数据结构。

可以将上述堆改造成数组:

哈希表

(被称为根数组并且元素数为N的数组) + (根数组的元素作为链表的头指针) = 哈希表

哈希表管理数据首先要根数组元素的值决定放入在哪个位置,得到这个值的过程叫做哈希函数。

哈希函数根据输入元素的值,由函数计算得到一个"0 ~ (N-1)"(数组元素个数)范围的值,这个值叫哈希值。根据哈希值和数组元素的编号,能够决定元素在根数组中的位置。

从哈希表管理的数据中查找特定数据的时候,首先要求出哈希值,然后查到对象在表中的位置,之后在这个组中安顺序搜索直到查找到目标元素。

哈希函数-->简单来说,就是返回将输入数与哈希表元素数作商求余的值。

根据上图,假设需要在哈希值为2中查找元素"可乐",那么,利用哈希函数,可以定位到根数组[2]指向的链表中查找是否存在"可乐"元素。

图示表现两个以上项目关系的方法,图中要表达的项目叫做结点,将项目连接起来的线叫做边。图,则是利用“结点”和“边”表示数据连接关系的数据结构。

图论-->专门研究边的集合和点的集合构成的图的性质的学问。

作者:Ribbon 出处: http://www.cnblogs.com/Ribbon/ 本文版权归作者和博客园共有,欢迎转载。未经作者同意下,必须在文章页面明显标出原文链接及作者,否则保留追究法律责任的权利。 如果您认为这篇文章还不错或者有所收获,可以点击右下角的【推荐】按钮,因为你的支持是我继续写作,分享的最大动力!
原文地址:https://www.cnblogs.com/Ribbon/p/4528434.html