他们都是一种存储数据的方式而已,打个比方,你坐地铁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>}

数组、队列、堆、栈、链表、树、图相关推荐

  1. 数据结构(线性表,队列,栈,树,图)

    数据结构体系图 1.线性表的顺序存储 //<span style="font-size:18px;">线性表顺序存储结构的构建</span> #includ ...

  2. 数组操作(栈方法、队列方法、重排序等)

    数组 数组是数据的有序列表,数组是引用类型 使用new操作符来创建数组 var arr = new Array(); //创建⼀个空数组 var arr = new Array(10); //创建了⼀ ...

  3. DSt:数据结构的简介、最强学习路线(逻辑结构【数组-链表-栈和队列/树-图-哈希】、物理结构、数据运算【十大排序/四大查找-图三大搜索-树三大遍历】、高级算法【贪心/分治/动态规划】之详细攻略

    DSt:数据结构的简介.最强学习路线(逻辑结构[数组-链表-栈和队列/树-图-哈希].物理结构[元素/关系].数据运算[十大排序/四大查找-图三大搜索-树三大遍历].高级算法[贪心/分治/动态规划]) ...

  4. 堆、队列、栈、链表对比

    转自:http://blog.csdn.net/NoMasp/article/details/50349172?locationNum=3&fps=1 堆算法 什么是堆 堆(heap),是一类 ...

  5. 队列,栈,堆栈,数组,链表特点与区别

    1. 队列可以看成是有2个口的集合一个口叫队头一个叫队尾,只能在对头进行删除操作,在队尾做插入.根据这样的操作.队列特点是先进先出 2.堆栈可以看成是有1个口的集合,这个口叫栈顶.插入和删除操作只能在 ...

  6. 408考研数据结构与算法之数组、链表、队列、栈知识点和算法详细教程(更新中)

    第一章:数据结构与算法概述 因为数据结构作为计算机专业的专业基础课程,是计算机考研的必考科目之一,如果打算报考计算机专业的研究生,你必须学好它. 数据结构是计算机软考.计算机等级考试等相关考试的必考内 ...

  7. 数组、链表实现队列、栈

    package com.jmdf;import java.util.ArrayList; import java.util.Deque; import java.util.LinkedList; im ...

  8. 什么是“堆”,栈,堆栈,队列,它们的区别

    如果你学过数据结构,就一定会遇到"堆","栈","堆栈","队列",而最关键的是这些到底是什么意思?最关键的是即使你去面 ...

  9. 数据结构与算法:链表,队列,栈,递归,有序表

    反转单链表,双链表 import java.util.ArrayList; import java.util.List;public class ReverseList {public static ...

  10. 链表,队列和栈的区别

    链表,队列和栈都是数据结构的一种.Sartaj Sahni 在他的<数据结构.算法与应用>一书中称:"数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系 ...

最新文章

  1. 不要一辈子靠技术生存
  2. linux c gcc编译报错 can not be used when making a shared object; recompile with -fPIC
  3. Linux查看进程和终止进程的技巧
  4. 请大家访问另一个我的博客!
  5. mysql jdbc 5.1.6_mysql5.0+Mysqljdbc5.1.6.jar的整合 | 學步園
  6. 七夕节福利,一套java架构师资源等你拿
  7. iOS---------- MBProgressHUD (1.0.0)的变动
  8. 减小编译bin文件大小_两个奇技淫巧,将 Docker 镜像体积减小 99%
  9. I2C总线协议原理介绍
  10. PowerShell、CMD 和 Windows Terminal 的美化配置方法
  11. 计算机无法连接打印机主机,打印机无法连接电脑问题的处理方法
  12. JetPack之DataStore源码笔记
  13. DHCP自动分配IP地址
  14. mummer基因组共线性分析详解
  15. 赠人玫瑰,手有余香,今日份黑科技软件五款奉上
  16. TOM邮箱|163邮箱容量评比!注册哪个容量好呢?
  17. qq空间网页设计_网页设计中的负空间
  18. 华硕笔记本 安装系统
  19. 医疗器械标准目录 第二部分专业技术领域(2)
  20. 《Natural Language Processing with Python》读书笔记 001期

热门文章

  1. 什么是域名泛解析?有什么用途和优势
  2. 使用flume问题总结2——flume event的简单理解
  3. hdu 6169 gems gems gems【DP】
  4. iPhone手机被盗后,小偷是如何解锁密码的?看完长知识了
  5. Java语言制作吃豆人游戏
  6. 洛桑联邦理工学院 法语 计算机,洛桑联邦理工学院(École Polytechnique Fédérale de Lausanne)_快飞留学...
  7. hp计算机如何进入启动界面,惠普电脑怎么进入bios设置启动项
  8. Java基础15-java进阶(6)【网络编程】
  9. 第2讲如何打造属于自己的工程师文化
  10. uniApp获取高德高德地图api发布版安全码SHA1