数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。
常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等。
数组
在内存中连续存储多个数据的结构
int[] a=new int[10]
优点:查询快
缺点:增删麻烦、大小固定、只能存储一种类型的元素。
栈
栈是一种特殊的线性表,只能在一端进行操作。
特点:先进后出,后进先出
队列
也是一种线性表
特点:先进先出,后进后出
链表
物理存储单元上非连续非顺序的结构,数据元素逻辑顺序通过链表指针地址来实现。每个元素包含两个节点,数据节点存储数据,指针节点决定顺序。根据指针的指向,链表有很多不同的结构,例如单向链表,双向链表,循环链表等。
链表优点:是一种常用的数据结构,不需要初始化容量。可以任意增删数据。增删数据时只需要改变前后两个元素节点的指针域指向即可,增删方便,速度快。
树
由N个有限节点组成的个具有层次关系的集合。根朝上,叶朝下。
特点:
每个节点有零个或多个子节点
没有父节点的节点成为根节点
每一个非根节点有且只有一个父节点
除了根节点外,每个子节点可以分为多个不交叉的子树
日常中运用最多的一种树是二叉树
特点:每个节点最多有两个子树,节点的度最大为2
左子树和右子树有顺序,次序不能颠倒
即使某节点只有一个子树,也要区分左右节点
二叉树是一种数组和链表折中的方案,数据增删很快,同时查询算法上也有优化
散列表(哈希表)
根据关键码(key)和值(value)直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。
记录的存储位置=f(key)
f为散列函数,也称哈希函数。散列表就是把key通过一个固定的算法函数也就是哈希函数进行处理,得到一个整型数字,然后把这个数字对数组长度取余,得到的结果当做一个数组下标,之后将这个KEY对应的value存储在这个下标的数组空间,充分利用了数组的优势进行查找,查找的速度很快。
哈希表在应用中也是比较常见的,就如Java中有些集合类就是借鉴了哈希原理构造的,例如HashMap,HashTable等,利用hash表的优势,对于集合的查找元素时非常方便的,然而,因为哈希表是基于数组衍生的数据结构,在添加删除元素方面是比较慢的,所以很多时候需要用到一种数组链表来做,也就是拉链法。拉链法是数组结合链表的一种结构,较早前的hashMap底层的存储就是采用这种结构,直到jdk1.8之后才换成了数组加红黑树的结构。
堆
堆是一种比较特殊的数据结构,可以被看做一棵树的数组对象,具有以下的性质:
堆中某个节点的值总是不大于或不小于其父节点的值(根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或 小根堆)
堆总是一颗完全二叉树
堆的定义:堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。
(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2),满足前者的表达式的成为小顶堆,满足后者表达式的为大顶堆。
因为堆有序的特点,一般用来做数组中的排序,称为堆排序
图
图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。