我对数据结构的概念

数据结构概念

     数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 ——百度百科

      程序 = 数据结构 + 算法 。
      简单来说数据结构是指数据以不同的数据类型、储存结构和相互关系保存到内存中方式。

常用的数据结构概念

线性表

      线性表是最基本、最简单、也是最常用的一种数据结构。它是数据元素的有限序列。在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。一般线性表也就是我们通常所说的“线性表”,可以自由的删除或添加结点。受限线性表主要包括栈和队列,受限表示对结点的操作受限制。

线性表的顺序表示(例如数组)

数组

特点:
  • 线性表中数据元素之间的关系是一对一的关系。
  • 除了第一个和最后一个之外的其他元素都有前驱和后继。
线性表的链式表示(例如循环链表、双向链表)
循环链表

循环链表

特点:
  • 线性表中数据元素之间的关系是一对一的关系。
  • 每个元素都有前驱和后继。
  • 最后一个元素的后继是第一个元素,第一个元素的前驱是最后一个元素。
双向链表

      双向链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。一般我们都构造双向循环链表。
双向链表

      栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

栈

特点:
  • 数据的储存方式:先进后出。
  • 只能在栈顶对数据进行插入或删除操作。
  • 插入数据叫压入(push),删除数据叫弹出(pop)。

队列

      和栈一样,队列是一种操作受限制的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列

特点:
  • 数据的储存:先进先出
  • 插入数据叫入队在队尾进行操作,删除数据叫出队在队头操作。
顺序队列

      顺序队列有两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置。
顺序队列
      随着插入和删除操作的进行,队列元素的个数不断变化。当rear增加到指向分配的连续空间之外时,队列无法再插入新元素,但这时往往还有大量可用空间未被占用,这些空间是已经出队的队列元素曾经占用过得存储单元。
      顺序队列中的溢出现象:

  • “下溢”现象:当队列为空时,做出队运算产生的溢出现象。
  • “真上溢”现象:当队列满时,做进栈运算产生空间溢出的现象。
  • “假上溢”现象:由于入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。该现象称为”假上溢”现象。
循环队列

      在实际使用队列时,为了使队列空间能重复使用,往往对队列的使用方法稍加改进,无论插入或删除,一旦rear指针增1或front指针增1 时超出了所分配的队列空间,就让它指向这片连续空间的起始位置。
循环队列
      循环队列中,空队和满队头尾指针都相等,所以不能够通过front==rear来判断队列是否已满。为了区别这两种情况,当队列添加元素到rear的下一个元素是front的时候就认为队列满了,而front==rear时就认为队列为空。

树(Tree)

      树型结构是一类非常重要的非线性数据结构。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。它具有以下的特点:

  • 每个元素称为节点(node)。
  • 每个节点有零个或多个子节点。
  • 没有父节点的节点称为根节点。
  • 没有子节点的节点称为叶节点。
  • 每一个非根节点有且只有一个父节点。
  • 树不能为空。
  • 节点的度:一个节点含有的子树的个数称为该节点的度。
  • 兄弟节点:具有相同父节点的节点互称为兄弟节点。
  • 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推。
  • 树的高度或深度:树中节点的最大层次。
  • 森林:互不相交的树的集合称为森林。
有序树和无序树

      有序树:树中的任意节点的子节点有顺序关系。
      无序树:树中的任意节点的子节点有顺序关系,也称自由树。
一棵有序树:
树

二叉树(Binary Tree)

二叉树其有以下特点:

  • 二叉树不存在度大于2的节点。
  • 二叉树的子树有左右之分,次序不能颠倒,即二叉树是有序树。
  • 二叉树是n(n≥0)个节点的有限集合。n=0的树称为空二叉树。
    二叉树
斜树

      二叉树中所有节点都只有左子树的叫左斜树,所有节点都只有右子树的叫右斜树。以上两者统称斜树。斜树的每一层只有一个节点。节点的个数与二叉树的深度相同。斜树其实就是线性表结构。
斜树

满二叉树

      在二叉树中除了最后一层无任何子节点外,其余层中任意节点都有两个子节点,这样的二叉树称为满二叉树(国内外对满二叉树的定义有所分歧)。
满二叉树具有以下特点:

  • 叶节点只出现在最下一层。
  • 非叶子节点的度一点是2。
  • 在同样深度的二叉树中,满二叉树的节点个数最多,叶节点最多。
    满二叉树
          国外满二叉树的定义是结点要么是叶子结点度为0,要么是度为2的结点,不存在度为1的结点。
    满二叉树2
          上图在国外是一棵满二叉树,而按国内的定义它却不是一棵满二叉树,但霍夫曼树是符合这种定义的,满足国际上定义的满二叉树,但是不满足国内的定义。
完全二叉树

      完全二叉树的定义:若设二叉树的深度为h,除第h层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。满二叉树必须是完全二叉树,但反过来不一定成立。
完全二叉树的特点:

  • 叶子结点只能出现在最下两层。
  • 最下层叶子一定出现在左部并且连续。
  • 倒数第二层,如有叶子节点,一定出现在右部连续位置。
  • 同样结点数的二叉树,完全二叉树的深度最小
    完全二叉树
    上图是棵完全二叉树,而下图是非完全二叉树
    非完全二叉树
二叉排序树(Binary Sort Tree)

      二叉排序树又称二叉查询树、BST。它或者是一棵空树。或者是具有下列性质的二叉树:

  • 若左子树不空,则左子树上所有结点的值均小于它的根结点的值。
  • 若右子树不空,则右子树上所有结点的值均大于它的根结点的值。
  • 左、右子树也分别为二叉排序树。
    二叉排序树
平衡二叉树

      平衡二叉树,又被称为AVL树(区别于AVL算法):它或者是一颗空树,或者具有以下性质的二叉树:

  • 它的左右两个子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。
  • 平衡二叉树中引入了一个平衡因子(balance factor)的概念:它指的是该节点的两个子树,即左子树和右子树的高度差,节点的左子树的深度减去右子树的深度,如果该节点的某个子树不存在,则该子树的深度为0,如果高度差的绝对值超过1就要根据情况进行调整。
    列如:
    平衡二叉树右旋
          上图的树在插入节点2时,节点5失去了平衡,为了保持平衡,以节点3为旋转中心向右旋转,经过旋转后这颗平衡二叉树又得到了平衡。
哈夫曼树(Huffman tree)

      哈夫曼树又称(赫夫曼树、霍夫曼树、最优二叉树)
在了解哈夫曼树之前必须了解的一些概念:

  • 路径:从一个节点往下可以达到的孩子或孙子节点之间的通路,称为路径。
  • 路径长度:路径中分支的数目称为路径长度。
  • 树的路径长度:从树根到每一个节点的路径长度之和。
  • 节点的带权路径长度:节点的带权路径长度就是从该节点到根节点之间的路径长度与结点上权的乘积,称为该节点的带权路径长度。
  • 树的带权路径长度:树的带权路径长度规定为所有叶子节点的带权路径长度之和,记为WPL。
  • 权值:权值就是定义的路径上面的值。可以这样理解为结点间的距离。通常指字符对应的二进制编码出现的概率。哈夫曼树中的权值可以理解为:权值大表明出现概率大!
构造哈夫曼树:

      从给定的权值中选取两棵权值最小的树作为左右子树其根为左右子树的权值之和。
哈夫曼树
      其WPL为WPL=3*3+6*3+7*2+10*1=51,其带权路径长度最小的二叉树就称为哈夫曼树或最优二叉树。

猜你喜欢

转载自blog.csdn.net/a499663321/article/details/80699634