常见数据结构

  • 数组(Array)
    int[] data = new int[100];data[0] = 1;
    下标从0开始,按索引查询元素速度快;按索引遍历方便;
  • 栈(Stack)
    栈是一种特殊的线性表,仅能在一端操作(栈顶操作);栈的结构像是集中箱。
    先进后出,从栈顶放入元素叫入栈,取出元素叫出栈;
    应用场景:因先进后出,,常用于实现递归功能,如斐波那契数列。
  • 队列(Queue)
    队列也是线性表,但可以从一端加元素,从另一段取元素,即先进先出;放入叫入队,取出叫出对;
    应用场景:因为队列先进先出的特点,在多线程阻塞队列管理中非常适用。
  • 链表(Linked List)
    链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。
    优点:链表是很常用的一种数据结构,不需要初始容量,可以任意加减元素,只需改变前后两个元素节点的指针域指向地址即可,所以增加、删除很快。
    缺点:因为占用大量指针域,占用空间较大。 查找是遍历链表,非常耗时;
    使用场景:数据量较小,需要频繁增加、删除的场景;
  • 树(Tree)
    树也是一种数据结构,由n(n>=1)个有限节点组成一个具有层次关系的集合。
    叫做树,是因为看起来像是一个倒挂的树。特点如下:
    - 每个节点有零个或多个子节点;
    - 没有父节点的节点称为根节点;
    - 每一个非根节点有且只有一个父节点;
    - 除了根节点外,每个子节点可以分为多个不相交的子树;
    日常中,用的更多的是二叉树结构,特点如下:
    - 每个节点最多有两颗子树,节点的度最多2个;
    - 左子树和右子树是有顺序的,次序不能颠倒;
    - 即使某个节点只有一个子树,也要区分左右子树。
    二叉树优点:它是一种比较折中的方案,增加、删除元素很快,且在查找方面也有很多算法优化,所以二叉树既有链表的好处,也有数组的好处,在处理大批量的动态数据方面非常有用。
    二叉树扩展:如平衡二叉树、红黑树、B+树等,如MySQL的数据库索引结构用的是B+树、HashMap的底层原码中用到了红黑树。
  • 散列表(Hash)
    散列表也叫哈希表,是根据键值对(key和value)直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就很快找到集合中对应的元素。
    对应的关系fn称为散列函数,又称哈希(即哈希函数):
    哈希原理:它是把key通过哈希函数fn(key)转换成一个整型数字,然后将该数字对数组长度取余,取余结果当作数组的下标,将value存储在以该数字为下标的数组空间里,这种存储空间可以充分利用数组的查找优势来查找元素,所以速度很快。
    哈希表应用:有些集合类就是借鉴了哈希原理构造的,如HashMap、HashTable等。利用hash表的优势,在集合中查找元素非常方便。
    缺点:由于哈希表是基于数据衍生的数据结构,在添加删除元素是比较慢的,需要一种数组链表来做,也就是拉链法
  • 堆(Heap)
    堆是一种特殊的数据结构,可以被看做是一棵树的数组对象,具有如下性质:
    - 堆中某个节点的值总是不大于或不小于其父节点的值;
    - 堆总是一颗完全二叉树;
    将根节点最大的堆叫最大堆或大根堆或大顶堆;根节点最小的堆叫最小堆或小根堆或小顶堆;常见的堆有二叉堆、斐波那契堆;
    应用场景:因为堆有序的特点,一般用来做数组中的排序,称为堆排序;
  • 图(Graph)
    图是由节点的有穷结合V和边的集合E组成。其中为了和树结构区分,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。
    分类:按顶点的指向的方向,可分为无向图,和有向图;
    图是一种比较复杂的数据结构,在存储数据上有着比较复杂和高效的算法,分别有邻接矩阵、邻接表、十字链表、邻接多重表、边集数组等存储结构。
posted @ 2019-04-25 11:27  b.won  阅读(260)  评论(0)    收藏  举报