数据结构
数据结构都有哪些?
线性表、栈、队列、串、数组、树、堆、图
1.线性表?
1.1顺序表示
数组:把线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里。用这种方法存储的线性表简称顺序表。是一种随机存的存储结构。顺序存储指内存地址是一块的,随机存取指访问时可以按下标随机访问,存储和存取是不一样的。如果是存储,则是指按顺序的,如果是存取,则是可以随机的,可以利用元素下标进行。
1.2链式表示
单向链表:每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。同时,由于最后一个结点无后继,故结点的指针域为空,即NULL。头插法建表(逆序)、尾插法建表(顺序)。增加头结点的目的是算法实现上的方便,但增大了内存开销。
双向链表:在单链表的每个结点里再增加一个指向其直接前趋的指针域prior。这样就形成的链表中有两个方向不同的链。双链表一般由头指针唯一确定的,将头结点和尾结点链接起来构成循环链表,并称之为双向链表。设指针p指向某一结点,则双向链表结构的对称性可用下式描述:p—>prior—>next=p=p—>next—>prior。从两个方向搜索双链表,比从一个方向搜索双链表的方差要小。
2.栈
栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top),表头端称为栈低(bottom)。不含元素的空表称为空栈。因为栈限定在表尾进行插入或者删除,所以栈又被称为后进先出的线性表(简称LIFO:Last
in, First out.结构)。
3.队列
- front指针指向队头元素
- rear指针指向队尾元素的下一个位置
- 空队时:rear == front
- 队列初始化:rear = front = 0
- 入队:队未满时,先送值到队尾,再队尾指针加一
- 出队:队为空时,先取队头元素,再队头指针加一
4.什么是串?
串(String)是由零个或多个字符组成的有序数列.一般记为S = ′ a 1 , a 2 , . . . , a n ′ ,其中a
i可以是字母,数字或其它字符.子串串中任意个连续的字符组成的子序列称为该串的子串,包含子串的串为主串.
5.什么是数组?
数组是指一组数据的集合,(容器)数组中的每个数据称为元素。
在Java中,数组也是Java对象。数组中的元素可以是任意类型
(包括基本类型和引用类),但同一个数组里只能存放类型相同的元素,长度不可变
一维数组:int[] n=new int[]{1,2,3,4};
二维数组:int[][] n=new int[][]{{1,2,3,4},{1,2,3,4},{1,2,3,4}}
6.什么是树?
- 树结点:包含一个数据元素及若干指向子树的分支;
- 孩子结点:结点的子树的根称为该结点的孩子;
- 双亲结点:B结点是A结点的孩子,则A结点是B结点的双亲;
- 兄弟结点:同一双亲的孩子结点;
- 堂兄结点:同一层上结点;
- 结点层次:根结点的层定义为1;根的孩子为第二层结点,依此类推;
- 树的高(深)度:树中最大的结点层
- 结点的度:结点子树的个数
- 树的度:树中最大的结点度。
- 叶子结点:也叫终端结点,是度为0的结点;
- 分枝结点:度不为0的结点(非终端结点);
- 森林:互不相交的树集合;
- 有序树:子树有序的树,如:家族树;
- 无序树:不考虑子树的顺序;
刚开始学习接触到的就是二叉树:
一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一
个根节点加上两棵别称为左子树和右子树的二叉树组成。
二叉树的特点:
每个结点最多有两棵子树,即二叉树不存在度大于2的结点。
二叉树的子树有左右之分,其子树的次序不能颠倒。
满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k)
-1 ,它就是满二叉树。完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。
要注意的是满二叉树是一种特殊的完全二叉树。
7.什么是堆?
堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。
堆的性质:
堆中某个节点的值总是不大于或不小于其父节点的值。
堆总是一棵完全二叉树
将根节点最大的堆叫做最大堆或大顶堆,根节点最小的堆叫做最小堆或小顶堆。
常见的堆有二叉堆、斐波那契堆
8.什么是图?
图(Graph)是由顶点(vertex)的有穷非空集合和顶点之间边(edge)的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合
- 若顶点之间 Vi 和 Vj 之间没有方向,则为无向边,用无序偶对( Vi , Vj )表示
- 若顶点之间 Vi 和 Vj 之间有方向,则为有向边(也称弧),用有序偶对< Vi , Vj >表示, Vi 为弧尾,Vj为弧头
1)简单图
图中既无吊环又无多重边,即为简单图
(2)无向图
如果图中任意两个顶点之间的边都是无向边(简而言之就是没有方向的边),则称该图为无向图(Undirected graphs)
(3)有向图
如果图中任意两个顶点之间的边都是有向边(简而言之就是有方向的边),则称该图为有向图(Directed graphs)
(4)完全图
- 无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。(含有n个顶点的无向完全图有(n×(n-1))/2条边)
- 有向完全图:是指图中各边都有方向,且每两个顶点之间都有两条方向相反的边连接的图。
注:本文为整理汇总,而非原创