数组、队列、堆、栈、链表、树、图

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Helloworld_jin/article/details/83986699

他们都是一种存储数据的方式而已,打个比方,你坐地铁1号线上班和2号线上班,都能上班只是路线不一样,他们都是存储数据的格式,每种数据结构有自己的特点,使用哪种数据格式需要根据具体的需求来选,比如你现在需要有序的存储一组数据而且还要经常的查询数据,那么数组就是最合适的,他有角标可以很容易进行排序和查询!如果有序但是经常增删数据,那么链表就是最合适的,他的增删很快,但是查询差。每种数据结构有各自的适用条件,根据需求来选择具体的数据结构

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

  1. 队列
    队列实现了先入先出的语义 (FIFO) 。队列也可以使用数组和链表来实现:
    在这里插入图片描述
    队列只允许在队尾添加数据,在队头删除数据。但是可以查看队头和队尾的数据。还有一种是双端队列,在两端都可以插入和删除:
    在这里插入图片描述
  2. 数组
    数组是最最基本的数据结构,很多语言都内置支持数组。数组是使用一块连续的内存空间保存数据,保存的数据的个数在分配内存的时候就是确定的:
    在这里插入图片描述
    访问数组中第 n 个数据的时间花费是 O(1) 但是要在数组中查找一个指定的数据则是 O(N)。当向数组中插入或者删除数据的时候,最好的情况是在数组的末尾进行操作,时间复杂度是O(1) ,但是最坏情况是插入或者删除第一个数据,时间复杂度是 O(N) 。在数组的任意位置插入或者删除数据的时候,后面的数据全部需要移动,移动的数据还是和数据个数有关所以总体的时间复杂度仍然是 O(N) 。
    在这里插入图片描述
  3. 堆(heap)
    堆可以看成一棵按顺序排列的完全二叉树,根节点可以为大于等于任何子节点(也可以小于等于任意子节点,看具体的排序方法),在存取时没有任何限制,可以随意的访问某一个子节点。
    最大堆:每个节点的值都大于等于它的孩子节点。
    最小堆:每个节点的值都小于等于它的孩子节点。

堆的存储:
可以理解为二叉树的一种,是节点间有序关系的完全二叉树,所以可以用数组来表示。
对于下标为i的节点,它的子树的左节点的下标为2i,右节点为2i+1,父亲的节点下标为i/2(向下取整)。
在程序设计中,使用位运算来代替直接*2可以提高运行速度。-
某些编译器中会把一些特定的乘法运算改写为位运算。

  1. 栈(stack)
    栈或者称为堆栈(stack),可以看成是一些堆起来的盘子,桶状线性数据结构。但是栈是受限制的线性数据结构,只允许先进后出,并且只能在栈顶进行插入删除操作。
    先进后出(FILO)
    在这里插入图片描述

  2. 链表
    链表是在非连续的内存单元中保存数据,并且通过指针将各个内存单元链接在一起,最有一个节点的指针指向 NULL 。链表不需要提前分配固定大小存储空间,当需要存储数据的时候分配一块内存并将这块内存插入链表中。

    在链表中查找第 n 个数据以及查找指定的数据的时间复杂度是 O(N) ,但是插入和删除数据的时间复杂度是 O(1) ,因为只需要调整指针就可以:
    在这里插入图片描述
    在这里插入图片描述
    向上面这样的链表结构在插入和删除的时候编程会比较困难,因为需要记住当前节点的前一个节点,这样才能完成插入和删除。为了简便通常使用带有头节点的链表:
    在这里插入图片描述
    上面的链表是单链表,此外还有双链表,就是节点中包含指向下一个节点的指针和指向上一个节点的指针:
    在这里插入图片描述
    不带有头节点的双向链表在插入和删除数据的时候也不会出现单链表那样的问题。此外还有一种链表是循环链表,它是将双向链表的头尾相接:
    在这里插入图片描述
    向循环双向链表和循环链表中插入或者从中删除数据只是多移动几个指针。


  3. 它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
    每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树;
    树也可以这样定义:树是由根结点和若干颗子树构成的。树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构。在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或称为树根。

树的种类:
无序树:树中任意节点的子结点之间没有顺序关系,这种树称为无序树,也称为自由树;
有序树:树中任意节点的子结点之间有顺序关系,这种树称为有序树;
二叉树:每个节点最多含有两个子树的树称为二叉树;
完全二叉树
满二叉树
霍夫曼树:带权路径最短的二叉树称为哈夫曼树或最优二叉树;

最典型的是二叉树
在这里插入图片描述
7. 图
图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。在图中的数据元素,我们称之为顶点(Vertex),顶点集合有穷非空。在图中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空的。

图按照边的有无方向分为无向图和有向图。无向图由顶点和边组成,有向图由顶点和弧构成。弧有弧尾和弧头之分,带箭头一端为弧头。

图按照边或弧的多少分稀疏图和稠密图。如果图中的任意两个顶点之间都存在边叫做完全图,有向的叫有向完全图。若无重复的边或顶点到自身的边则叫简单图。

图中顶点之间有邻接点、依附的概念。无向图顶点的边数叫做度。有向图顶点分为入度和出度。

图上的边或弧带有权则称为网。

图中顶点间存在路径,两顶点存在路径则说明是连通的,如果路径最终回到起始点则称为环,当中不重复的叫简单路径。若任意两顶点都是连通的,则图就是连通图,有向则称为强连通图。图中有子图,若子图极大连通则就是连通分量,有向的则称为强连通分量。

无向图中连通且n个顶点n-1条边称为生成树。有向图中一顶点入度为0其余顶点入度为1的叫有向树。一个有向图由若干棵有向树构成生成森林。
图的存储结构—-邻接矩阵
在这里插入图片描述

在这里插入图片描述
图由顶点的集合V和顶点之间的关系集合R构成。

例如G1=(V,E)

V={V1,V2,V3,V4,V5}

E={(v1,v2),(v1,v3)}

表示无向图中,结点v1和v2相连,v1和v3相连。其中与某结点相连的线段的数目称为该节点的度。

例如G2=(V,A)

V={V1,V2,V3,V4,V5}

A={<v1,v2>,<v1,v3>}

猜你喜欢

转载自blog.csdn.net/Helloworld_jin/article/details/83986699