1,数据结构相关概念
1.1数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。
1.2结构:简单的理解就是关系。
1.3数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
1.4按照视点的不同,我们把数据结构分为逻辑结构和物理结构。
1)逻辑结构:是指数据对象中数据元素之间的相互关系。
(1)集合结构:集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关系;
(2)线性结构:线性结构中的数据元素之间是一对一的关系;
(3)树形结构:树形结构中的数据元素之间存在一种一对多的层次关系;
(4)图形结构:图形结构的数据元素是多对多的关系。
2)物理结构:是指数据的逻辑结构在计算机中的存储形式。
(1)顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的;
(2)链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。
2,算法相关概念
2.1算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
2.2算法具有五个基本特性 :
(1) 输入:零个或多个输入;
(2) 输出 :至少有一个或多个输出 ;
(3) 有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成;
(4) 确定性:确定性:算法的每一步骤都具有确定的含义,不会出现二义性 ;
(5) 可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。
2.3算法效率的度量
1)时间复杂度
在进行算法分析时,语句总的执行次数 T ( n )是关于问题规模n的函数,进而分析 T ( n )随 n 的变化情况并确定T ( n )的数量级。算法的时间复杂度.也就是算法的时间量度,记作: T ( n )=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中 f (n) 是问题规模n的某个函数。
2)空间复杂度
算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作: S(n)= O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。
3、线性表
3.1线性表 ( List ):零个或多个数据元素的有限序列。
首先它是一个序列。也就是说,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。
3.2存储结构:
1)顺序存储结构,即用一维数组来实现存储。
优点:a、无须为表示表中元素之间的逻辑关系而增加额外的存储空间;
b、可以快速地存取表中任一位置的元素。
缺点:a、插入和删除操作需要移动大量元素;
b、当线性表长度变化较大时,难以确定存储空间的容量;
c、造成存储空间的"碎片".
2)链式存储结构,即用链表的形式存储。
优缺点正好和上面顺序存储结构相反。
3、栈与队列
3.1 栈( stack )是限定仅在表尾进行插入和删除操作的线性表。
允许插入和删除的一端称为栈顶(top),另一端称为栈底 (bottom),栈又称为后进先出 (Last In Filrst Out) 的线性表,简称 LIFO 结构。
栈的顺序存储结构实现
栈的链式存储结构实现
3.2 队列 ( queue ) 是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出 (First In First Out) 的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。
队列的顺序存储结构实现
队列链式存储结构实现
4,字符串
4.1 串( string )是由零个或多个字符组成的有限序列,又名叫字符串。本质上,它是一种线性表的扩展。
串的存储结构与线性表相同,分为两种顺序存储和链式存储,java中的String,StringBuf就是基于数组实现的。
4.2 子串的定位操作通常称做串的模式匹配,应该算是串中最重要的操作之一。
KMP 模式匹配算法:https://blog.csdn.net/starstar1992/article/details/54913261/
5,树
树( Tree )是 n(n>=0) 个结点的有限集。n=0时称为空树。在任意一棵非空树中: ( 1 )有且仅有一个特定的称为根 ( Root )的结点; (2) 当 n>1 时,其余结点可分为m (m>0) 个互不相交的有限集T1、T2、……、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree).
度(Degree) :结点拥有子树的个数称为结点的度,树的度是树内各结点的度的最大值。
叶结点:度为 0 的结点称为叶结点(Leaf)或终端结点。
分支结点:度不为 0 的结点称为非终端结点或分支结点。
结点的层次( LeveI)从根开始定义起,根为第一层,根的孩子为第二层。树中结点的最大层次称为树的深度 (Depth)或高度。
5.1二叉树
二叉树( Binary Tree) 是 n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成 。
二叉树具有五种基本形态:
(1)空二叉树。
(2)只有一个根结点。
(3)根结点只有左子树 。
(4)根结点只有右子树。
(5)根结点既有左子树又有右子树。
满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。
完全二叉树:对一棵具有n 个结点的二叉树按层序编号,如果编号为 i (l<:i<n) 的结点与同样深度的满二叉树中编号为 i 的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。
二叉树的性质:
性质 1 :在二叉树的第 i 层上至多有 2^(i-1)个结点(i>=1)。
性质 2: 深度为k的二叉树至多有2^k - 1个结点(k>=1)。
性质 3: 对任何一棵二叉树 T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1.
性质 4: 具有n个结点的完全二叉树的深度为[log2n] + 1([x]表示不大于x的最大整数)。
实现:
二叉树的遍历:前序、中序、后序、层序
二叉树的建立:其实建立二叉树,就是基于前面的二叉树的遍历,只不过在原来应该是打印结点的地方,改成了生成结点、给结点赋值的操作而已。
5.2二叉排序树
二叉排序树 ( Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。
(1)若它的左子树不空,则左子树上所有结点的值均小于它的根结构的值;
(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)它的左、右子树也分别为二叉排序树。
5.3平衡二叉树
平衡二叉树(Self-Balancing Binary Search Tree)(也称为AVL树(俄罗斯数学家的名字简写))是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1。
5.4多路查找树
多路查找树 ( muitl-way search tree),其每一个结点的孩子数可以多于两个,且每一个结点处可以存储多个元素。由于它是查找树,所有元素之间存在某种特定的排序关系。
它的4种特殊形式: 2-3树、2-3-4树、B树和B+树。(都是排序的、平衡的)
5.4.1 2-3树
2-3树是一棵多路查找树,它的每一个结点都具有两个孩子 (我们称它为2结点)或三个孩子(我们称它为3结点) 。
5.4.2 2-3-4树
2-3-4树其实就是2-3树的概念扩展,包括了4 结点的使用。一个4结点包含小中大三个元素和四个孩子(或没有孩子)。
5.4.3 B树
B树(B-tree是一种平衡的多路查找树,2-3树和2-3-4树都是B树的特例。结点最大的孩子数目称为B树的阶(order),因此,2-3树是3阶B树,2-3-4树是4阶B树。
5.4.4 B+树
B树的问题
对于树结构来说,我们都可以通过中序遍历来顺序查找树中的元素,这一切都是在内存中进行。可是在 B 树结构中,我们往返于每个结点之间也就意味着,我们必须得在硬盘的页面之间进行多次访问。假设每个结点都属于硬盘的不同页面,我们为了中序遍历所有的元素,页面2→页面1→页面3→页面1→页面4→页面1→页面5。我们可以看到每次都得返回到页面1,不能直接页面2→页面3→页面4→页面5吗,这就是下面的B+树。
B+树是应文件系统所需而出的一种B树的变形树,严格意义上讲它其实已经不是树了。
B树中,每一个元素在该树中只出现一次,有可能在叶子结点上,也有可能在分支结点上。B+树中,出现在分支结点中的元素会被当作它们在该分支结点位置的中序后继者(叶子结点)中再次列出。
这样的数据结构最大的好处就在于:
如果是要随机查找,我们就从根结点出发,与B树的查找方式相同,只不过即使在分支结点找到了待查找的关键字,它也只是用来索引的,不能提供实际记录的访问,还是需要到达包含此关键字的终端结点。
如果我们是需要从最小关键字进行从小到大的顺序查找,我们就可以从最左侧的叶子结点出发,不经过分支结点,而是延着指向下一叶子的指针就可遍历所有的关键字。
B+树的结构特别适合带有范围的查找。比如查找我们学校18 - 22岁的学生人数,我们可以通过从根结点出发找到第一个18岁的学生,然后再在叶子结点按顺序查找到符合范围的所有记录。
说明:树中常用的两个性质:排序和平衡
排序:一般指树上的结点以某种特性从左往右排序。(排序树也成为查找树)
平衡:树上的每一个结点的左子树和右子树的高度差至多等于1。
6,图
6.1图的相关概念
图(Graph):是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G(V,E),其中,G 表示一个图,V是图G中顶点的集合,E是图G中边的集合。
弧:有方向的 边 称为 弧。
权:图的边或弧相关的数叫做权(Weight)。
网:带权的图通常称为网 (Network)。
最小生成树:一个镇的九个村庄架设通信网络做设计,用最小的成本完成这次任务(铺设线路最短)。我们把构造连通网(图中的每个结点都连通)的最小代价生成树称为最小生成树 (Minimun Cost Spanning Tree)。
还有好多概念,详见《大话数据结构》
6.2 图的存储结构
6.2.1 邻接矩阵
考虑到图是由顶点和边或弧两部分组成。合在一起比较困难,那就很自然地考虑到分两个结构来分别存储。顶点不分大小、主次,所以用一个一维数组来存储是很不错的选择。而边或弧由于是顶点与顶点之间的关系, 一维搞不定,那就考虑用一个二维数组来存储。于是我们的邻接矩阵的方案就诞生了 。
图的邻接矩阵 (Adjacency Matrix) 存储方式是用两个数组来表示圈。一个一维数组存储圈中顶点信息,一个二维数组〈称为邻接矩阵)存储图中的边或弧的信息。
主对角线上的值一定为0,因为不存在顶点到自身的边。
参考:
《大话数据结构》