数据结构简述

 数据结构分类
一、数组
数组是可以在内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,下标从0开始。
优点:
1.按照索引查询元素速度快
2.按照索引遍历数组方便
缺点:
1.数组的大小固定后就无法扩容了
2.数组只能存储一种类型的数据
3.添加,删除的操作太慢,因为要移动其他元素
适用场景:
频繁查询,对存储空间要求不大,很少增、删的情况。
 
二、栈
栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。栈的特点是:后进先出。
从栈顶放入元素的操作叫做入栈,取出元素叫出栈。
适用场景:
栈的结构就像是集装箱,越先放进去的东西越晚才能拿出来。所以,栈常应用于实现【递归功能】方面的场景,例如斐波拉契数列。
 
 
三、队列
队列和栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端取出元素。队列的特点是:先进先出。
从一端放入元素叫入队,取出元素为出队。
适用场景:
在多线程阻塞队列管理中非常适用。
 
 
四、链表
链表是物理存储单元上非连续的,非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素
的数据域(内存空间),另一个是指向下一个结点地址的指针域。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。
优点:
1.链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素
2.添加或删除元素只需要改变前后两个元素结点的指针域指向的地址即可,所以添加,删除很快。
缺点:
1.因为含有大量的指针域,占用空间较大
2.查找元素需要遍历链表来查找,非常耗时
适用场景:
数据量较小,需要频繁增、删操作的场景。
 
 
五、树
树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。
特点:
1.每个节点有零个或多个子节点
2.没有父节点的节点称为根结点
3.每一个非根节点有且仅有一个父节点
4.除根节点外,每个子节点可以分为多个不相交的子树
 
应用很广的一种结构是【二叉树】
二叉树特点:
1.每个结点最多有两颗子树,结点的度数最大为2
2.左子树和右子树是有顺序的,次序不能颠倒
3.即使某结点只有一个子树,也要区分左右子树
 
它添加,删除元素都很快,并且在查找方面也有很多算法优化,所以二叉树有链表的好处,也有数组的好处,在处理大批量的动态数据方面非常有用。
扩展:
二叉树有很多扩展的数据结构,如平衡二叉树、红黑树、B+树等。
其中,mysql的数据库索引结构用的就是B+树,还有HashMap的底层源码中用到了红黑树。
 
六、散列表
散列表,也叫哈希表,是根据关键码和值(key和value)直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快
找到集合中的对应元素。
记录的存储位置=f(key)
这里的对应关系f成为散列函数,又称哈希(hash)函数,而散列表就是把key通过一个固定的算法函数即所谓的哈希函数转换成一个整型数字,然后
就将该数字对数组的长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里,这种存储空间可以充分利用数组的
查找优势来查找元素,查找速度很快。
 
适用场景:
哈希表在应用中也是比较常见的,就如Java中有些集合类就是借鉴了哈希原理构造的,例如HashMap,HashTable等,利用hash表的优势,对于
集合的查找元素时非常方便的,然而,因为哈希表是基于数组衍生的数据结构,在添加删除元素方面是比较慢的,所以很多时候需要用到一种
数组链表来做,也就是拉链法。拉链法是数组结合链表的一种结构,较早前的hashMap底层的存储就是采用这种结构,直到jdk1.8之后才换成了
数组加红黑树的结构。
 
七、堆
堆是一种比较特殊的数据结构,可以被看作一棵树的数组对象。定义:n个元素的序列{k1, k2, ..., kn}当且仅当满足以下关系时,称之为堆。
(ki<=k2i, ki<=k2i+1)或者(ki>=k2i, ki>=2i+1),(i=1, 2, 3, ...n/2),满足前者的表达式称为小顶堆,满足后者表达式的为大顶堆。
特点:
1.堆中某个节点的值总是不大于或不小于其父节点的值
2.堆总是一颗完全二叉树
 
将根节点最大的堆叫最大堆或大根堆,根节点最小的堆叫最小堆或小根堆。
常见的堆有二叉堆,斐波拉契堆等。
适用场景:
因为堆有序的特点,一般用来做数组中的排序,称为堆排序。
 
八、图
图是由结点的有穷集合V和边的集合E组成的。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点
之间存在一条边,就表示这两个顶点具有相邻关系。
有向图和无向图
适用场景:
图是一种比较复杂的数据结构,在存储数据上有着比较复杂和高效的算法,分别有邻接矩阵 、邻接表、十字链表、邻接多重表、边集数组等存储结构。
                     (b)一个有向图
 
 
posted @ 2019-02-14 14:27  一江西流  阅读(...)  评论(...编辑  收藏