数据结构基础
文章平均质量分 61
程序=数据结构+算法,为了写出严谨的程序而努力
song->_->
调试的错误就是编程给你最好的东西,因为在每个错误上面都标志着前进的一步
展开
-
数据结构基础学习笔记目录
参考资料: 《数据结构》—— 武汉大学(中国大学MOOC) 《数据结构基础》课程 —— 烟台大学计算机与控制工程学院数据结构的基本概念 1-数据结构的内容2-数据结构基本概念3-数据的逻辑结构4-逻辑结构的二元组表示方法5-抽象数据类型(ADT)6-算法及其描述7-算法和数据结构数据结构——顺序表8-线性表的基本运算9-线性表的顺序存储结构10-顺序表的基本运算实...原创 2018-05-30 23:54:24 · 3131 阅读 · 4 评论 -
76-交换排序——快速排序
快速排序是20世纪最伟大的10大算法之一,由C. R. A. Hoare 于 1960 年提出的一种排序算法1. 快速排序的原理 快速排序(英译为Quicksort,简称快排),快速排序的基本思想是在待排序的n个记录中任取一个记录(通常取第一个记录)作为基准,把该记录放入适当位置后,数据序列被此记录划分成两部分,分别是比基准小和比基准大的记录;然后再对基准两边的序列用同样的策略,...原创 2018-08-23 20:42:01 · 775 阅读 · 0 评论 -
75-交换排序——冒泡排序
1. 交换排序 交换排序的基本思想就是:两两比较待排序记录的关键字,如果两个记录的次序相反时即进行交换,直到所有记录中没有反序(反序指的是,大的记录在前,小的记录在后)的记录为止。 图1-交换排序 例如,在图1这个待排序列的所有记录中,如果7和2这两个记录是反序的,那么就交换两个记录的位置,直到这个序列中没有反序的记录,而这个排序的过程就是交换排序。 典型的交换排序算法有:...原创 2018-08-21 17:52:23 · 509 阅读 · 0 评论 -
74-插入排序——希尔排序
1. 希尔排序 希尔排序(Shell Sort)也是一种插入排序算法,希尔排序是D.L.Shell于1959年提出的。希尔排序采用的是分组插入的思想: 1. 设现在有一个序列:{h1,h2,… hn},先取定一个小于n的整数di作为一个增量,把序列中的全部记录分组成di个子序列,所有间隔为di的记录放在同一个子序列,然后在每个子序列内进行直接插入排序。 2. 然后取第二个增量...原创 2018-08-18 20:56:02 · 629 阅读 · 0 评论 -
73-插入排序——直接插入排序
1. 插入排序 插入排序的基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子表中的适当位置,直到全部记录插入完成为止。2. 直接插入排序 假设待排序的记录存放在数组R[0 .. n-1]中,排序过程的某一中间时刻,R被划分成两个子区间R[0 … i-1]和R[i … n-1],其中已排好序的有序区,当前未排序的部分称其为无序区。 图1-直接插入排序...原创 2018-08-16 16:24:25 · 9463 阅读 · 4 评论 -
72-排序的基本概念
1. 排序 所谓排序就是整理“表”中的记录,使之按关键字递增(或递减)有序排列。 假设含n个数据元素的序列为{ R1, R2, …, Rn},其相应的关键字分别为{ K1, K2, …, Kn}这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系:Kp1≤Kp2≤…≤Kpn,使得序列成为一个按关键字有序的序列{ Rp1, Rp2 , …,Rpn},这样的操作就称为排序。 ...原创 2018-08-15 22:05:18 · 365 阅读 · 0 评论 -
71-哈希表的基本运算
1. 哈希表的基本运算 哈希表的存储结构定义如下:#define MaxSize 100 //定义最大哈希表长度#define NULLKEY -1 //定义空关键字值#define DELKEY -2 //定义被删关键字值typedef int KeyType; //关键字类型typedef char * InfoType; //其他...原创 2018-08-13 20:32:36 · 1776 阅读 · 0 评论 -
70-哈希表(散列表)
1. 什么是哈希表 回顾前面学习的线性表的顺序查找,二分查找,二叉排序树,平衡二叉树在查找某个关键字key时,都需要从数据表中进行挨个比较,直到相等时,则说明查找成功并返回该关键字的下标位置,在这个查找过程中,不同的查找算法需要比较的次数也不同,换句话说查找性能也是不一样的。 那么思考这么一个问题:我们在查找某个关键字key的过程中,这些比较是否真的有必要?是否有更好的办法:例如直...原创 2018-08-13 10:17:29 · 2138 阅读 · 0 评论 -
69-平衡二叉树
1. 二叉排序树的问题 在上一篇学习二叉排序树时可知,二叉排序树的查找性能通常取决于二叉排序树的形状。一般来说,二叉排序树的查找也不会超过树的高度,但是个别情况除外,例如一棵只有右子树的二叉树,它的查找性能是非常差的,那么需要把它转换为平衡的二叉树。 也就是把一棵有很多节点的二叉树转换为接近于完全二叉树,这棵树的高度可以是最小的,而左,右子树高度也不会相差太多,这棵二叉树我们通常叫做平...原创 2018-08-10 17:34:12 · 448 阅读 · 0 评论 -
68-二叉排序树
1. 什么是二叉排序树 二叉排序树(Binary Sort Tree,简称BST)又称二叉查找(搜索)树,其定义为:二叉排序树或者是空树,或者是满足以下性质(BST性质)的二叉树: 1. 若它的左子树非空,则左子树的所有节点的值均小于根节点的值 2. 若它的右子树非空,则右子树的所有节点的值均大于根节点的值 3. 它的左,右子树本身又各是一棵二叉排序树。 注意:二叉排...原创 2018-08-04 23:12:27 · 1662 阅读 · 0 评论 -
67-线性表的查找
1. 线性表的查找 线性表的查找主要有:顺序查找,二分查找,分块查找。 通过前面的学习可知,线性表有顺序和链式两种存储结构,而这里我们主要是介绍的线性表查找算法是基于顺序存储结构的,其顺序表的存储类型定义:#define MAXL 100typedef int KeyType;typedef char InfoType[10];typedef struct{ K...原创 2018-08-02 20:56:39 · 760 阅读 · 0 评论 -
66-拓扑排序
1. 什么是拓扑排序 设G=(V,E)是一个具有n个顶点的有向图,若< vi,vj >是图中的边(即从顶点vi到vj有一条路径),则顶点vi必须排在顶点vj之前,那么满足这个条件的顶点序列就是拓扑序列。在一个有向图中找一个拓扑序列的过程就称为拓扑排序。2. 举个栗子我们通过一个例子来举例说明。 图1 比如,计算机专业的学生必须完成一系列规定的基础课和专业课...原创 2018-07-31 17:21:52 · 390 阅读 · 0 评论 -
65-Floyd算法
问题:对于一个各边权值均大于零的有向图,对每一对顶点i≠j,求出顶点i与顶点j之间的最短路径和最短路径长度。 对于这个问题,我们简单分析可以以每个顶点作为源点循环求出每对顶点之间的最短路径,采用Dijkstra算法,循环n次也可以完成,但是这样的话,无疑对Dijkstra算法复杂度增加到O(n3)O(n3)O(n^3)了,所以说Dijkstra算法是比较适合求解稀疏图的,而对于稠密图来说...原创 2018-07-31 16:25:37 · 376 阅读 · 0 评论 -
64-Dijkstra算法
1. 无权图的最短路径 对无权图,若从一顶点到另一顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1。 图1-无权图的最短路径 比如:从顶点0到顶点5存在着一条路径,经过了3条边,因此顶点0到顶点5的路径长度为3,同时我们还知道这条路径有4个顶点(0,1,2,5),也就是说这条路径长度等于4 - 1。 由于从一顶点到另一顶点可能存在着多...原创 2018-07-29 21:25:01 · 450 阅读 · 0 评论 -
63-Kruskal算法
Kruskal算法(也称为克鲁斯卡尔算法)也是一种用来寻找最小生成树的算法 。与Prim算法不同的是,Prim算法是逐个加入权值最小边的顶点方法,而Kruskal算法则是对每条边按权值的递增次序选择合适的边。...原创 2018-07-27 00:30:07 · 643 阅读 · 1 评论 -
62-Prim算法
Prim算法(也称为普里姆算法)可用于在带权连通图中搜索最小生成树,是解决最小生成树问题,非常经典的算法。 问题描述: G = (V,E)是一个具有n个顶点的带权连通无向图 T = (U,TE)是图G的最小生成树,其中U是T的顶点集合,TE是T的边集合 图1-无向带权连通图1. 构造最小生成树的步骤由图G构造最小生成树T的步骤: 图2-构造最小生成树T...原创 2018-07-25 21:36:41 · 1750 阅读 · 2 评论 -
61-最小生成树问题
1. 什么是生成树生成树的定义: 一个连通图的生成树是指一个极小连通子图,它含有图中全部顶点(n),但是它只有构成一棵树的(n - 1)条边。 相信有些同学对这个定义很懵逼,不要急,下面我们就针对生成树的定义进行解释: 图1-什么是生成树 对于连通图和极小连通子图的基本概念的话,在前面的学习中我们已经介绍过了,这里就不再赘述了。我们直接进入正题。 对于左边的连通图...原创 2018-07-23 20:31:12 · 948 阅读 · 0 评论 -
60-BFS的应用——求最短路径
1. 求最短路径 这几篇将主要根据我们之前所学的图的遍历算法来解决一些问题,下面我们来看这样的一个问题。 问题:求不带权连通图G中从顶点u到顶点v的一条最短路径。(即求顶点u到顶点v之间边数最少的顶点序列)。 图1-求最短路径 例如,对于这样的一个有向图,我们要求顶点0到顶点7的最短路径。对于求最短路径,我们是选择DFS还是BFS呢?这是一个值得思考的问题。2. D...原创 2018-07-22 17:55:42 · 11620 阅读 · 1 评论 -
59-DFS的应用
1. 是否有简单路径 通过前面图的基本术语学习我们知道,简单路径是除了开始点和结束点可以相同外,其余顶点均不相同的路径。 现在有这样的一个问题:假设图G采用邻接表存储,设计一个算法,判断顶点u到v是否有简单路径? 思路:简单路径正好跟图遍历中所说过的,在遍历过程中访问的顶点是不能重复的,因此我们可以根据深度优先搜索算法的策略,从顶点u开始遍历,当搜索到顶点v时,表明从顶点u到顶点...原创 2018-07-20 23:23:05 · 375 阅读 · 0 评论 -
58-非连通图的遍历测试代码
非连通图的遍历测试代码:#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXV 8#define N 8typedef struct ANode{ int adjvex; ...原创 2018-07-21 12:02:51 · 565 阅读 · 0 评论 -
57-非连通图的遍历
1. 非连通图的遍历非连通图的遍历策略: 从每个连通分量中选择初始点,分别进行遍历,才能够访问图中的所有顶点。 图1-非连通图的遍历 上图中的非连通图有2个连通分量,我们可以从每个连通分量选择任意一个顶点作为初始点开始遍历,把所有的顶点都遍历完毕,但是在遍历之前,我们需要去指定初始点,因此从一个连通分量中的任何一个顶点开始遍历,当遍历结束,说明这个连通分量中的所有顶点都已访问...原创 2018-07-19 19:44:02 · 7953 阅读 · 3 评论 -
56-图的遍历算法实现
1. 深度优先(DFS)算法实现深度优先(DFS)算法实现:#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <string.h&a原创 2018-07-18 20:38:06 · 551 阅读 · 0 评论 -
55-图的遍历(DFS和BFS)
1. 图的遍历定义图的遍历定义: 从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。 图遍历得到的顶点序列称为图遍历序列。 图1-图的遍历 图中顶点之间是多对多的关系,而从一个顶点出发一次只能访问另外一个相邻顶点。比如:顶点1是初始点,从顶点1出发,访问顶点1,接着我们可以再这样访问:...原创 2018-07-18 20:30:43 · 16923 阅读 · 4 评论 -
54-图的邻接表存储结构
我们知道图的存储结构有邻接矩阵存储方法和邻接表存储方法,而对于邻接矩阵我们已经学习过了,本篇将主要介绍图的邻接表存储结构。 图1-图的邻接表存储结构1. 邻接表存储有向图 图2-邻接表存储有向图 邻接表存储方法是对图中每个顶点i建立一个单链表,将顶点i的所有邻接点链接起来,然后再给每个单链表上附设一个表头节点(表示顶点信息),将所有表头节点构成一个数组(顺序表),下标...原创 2018-07-17 21:54:42 · 2571 阅读 · 0 评论 -
52-图的邻接矩阵存储结构及算法
1. 图的存储结构 通常我们要根据图的逻辑结构来设计图的存储结构来 存储每个顶点的信息,存储每条边的信息。图的存储结构有以下两种: 1. 邻接矩阵存储方法 2.邻接表存储方法 2. 邻接矩阵存储方法 邻接矩阵是表示顶点之间相邻关系的矩阵。设G = (V , E)是具有n(n > 0)个顶点的图,顶点的编号依次为0 ~ n-1。G的邻接矩阵A是n阶方阵,其定义如下...原创 2018-07-17 16:37:35 · 8213 阅读 · 0 评论 -
53-图的邻接矩阵存操作实例
图的邻接矩阵操作算法实现如下:#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXV 5 //最大顶原创 2018-07-17 16:45:36 · 554 阅读 · 0 评论 -
6-算法及其描述
1. 什么是算法 从图1中可以看到,在抽象数据类型中,数据元素之间还是处于一个逻辑关系,仍然还是在逻辑结构上的操作功能,并不涉及到具体的实现细节。而当我们在用高级程序语言去做具体的功能实现的设计时就需要去确定数据的存储结构才能做,那么必须基于数据元素之间的物理关系(即存储结构)来确定具体存储结构上的操作实现。 图1-数据表示和功能实现 平时我们所说的算法就是在基于具体存储结构上的...原创 2018-05-25 12:17:56 · 1316 阅读 · 0 评论 -
5-抽象数据类型(ADT)
1. 以数据为核心的思维 在现实中计算机能够解决非常多的问题,如图1所示,可以用计算机去实现一个GIS地理信息系统,也可以实现一个电子病历系统,或者实现一个计算机管理资源的图形化界面等。包括现在我们使用的即时通讯软件,浏览器等,能用计算机做的事情有很多。对于正在学计算机的同学来说,以后也可能会用计算机去做这些事情的,势必也要去设计这样的一个系统。 图1-以数据为核心的思维 对于这...原创 2018-05-25 11:40:53 · 6970 阅读 · 0 评论 -
4-逻辑结构的二元组表示方法
1. 二元组表示法对于数据的逻辑结构还有一种二元组表示法,下面是二元组表示方法。逻辑结构二元组表示方法:B = (D , R) B——数据结构 D——数据元素的集合 R——D上二元关系的集合 在上面这种二元组表示方法中,B就是一种数据结构, 用上面的二元组来表示B这种数据结构时,就是由数据元素的集合D和D中的二元关系的集合R组成的,通过这句话,我们可以明白: D=di|1≤i...原创 2018-05-25 09:30:06 · 20477 阅读 · 4 评论 -
3-数据的逻辑结构
数据结构的分类是分为逻辑结构和物理结构两方面,前面我们已经介绍过了逻辑结构,现在我们再来看一下逻辑结构的几种类型,如图1所示: 图1-数据的逻辑结构 我们从上可以发现:上面这三种逻辑结构之间的节点与节点之间的关系是不一样的,对于线性结构来说,节点之间的关系是一对一的;树形结构的节点是一对多;图形结构的节点是多对多的关系。 1. 线性结构:开始节点和终端节点都是唯一的,我们可以...原创 2018-05-25 00:08:40 · 7132 阅读 · 0 评论 -
2-数据结构基本概念
1. 什么是数据结构 在介绍数据结构之前,我们先来了解数据结构的一些基本概念。 数据:数据是所有能被输入到计算机中,且能被计算机处理的符号的集合,也就是计算机操作的对象的总称,也是计算机处理的信息的某种特定的符号表示形式。比如:数字,字符,音频,视频等数据来表示某种特定的符号表现形式。 来看一个例子,如下面的表格中所示: 图1-学生信息表格 在图1中存储了一些学生的信...原创 2018-05-24 23:45:21 · 726 阅读 · 0 评论 -
1-数据结构的内容
1. 数据结构课程的结构 在数据结构课程的数据结构总共可以分为三大部分:数据的逻辑结构,数据的存储结构,数据运算。 图1-数据结构课程的结构 数据的逻辑结构通常指的是在我们以人类的思维方式来看待数据是什么样的,然后可以针对数据设计一个数学模型,而当我们用程序设计去解决这个问题的时候,必须要解决数据在计算机中存储的问题。也就是说当我们通过逻辑结构认识数据后,要通过合适的方式把数据存...原创 2018-05-24 23:43:06 · 688 阅读 · 0 评论 -
46-线索二叉树
1. 线索二叉树 在计算机早期的时候,计算机资源有限,需要合理利用,因此在编写程序的时候需要尽量节省空间或时间。比如:当我们要保存图1中这样的一棵二叉树时,需要用计算机程序语言去设计对应的存储结构。 图1 但是这会有一个问题,我们看到二叉树的存储结构中的存储空间利用率并不是很高,当有的节点没有左孩子和右孩子的时候就会出现空指针,当二叉树中有很多这样的节点时,就会出现多个空指针。...原创 2018-07-10 21:11:31 · 547 阅读 · 0 评论 -
47-线索二叉树测试代码
线索二叉树测试代码:#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <string.h>typedef char ElemType;//二叉树结点typedef struct BINARYNODE{ ElemType data...原创 2018-07-10 22:11:18 · 346 阅读 · 0 评论 -
48-哈夫曼树
1. 什么是哈夫曼树 图1 带权路径长度:设二叉树具有n个带权值的叶子节点,那么从根节点到各个叶子节点的路径长度与相应节点权值的乘积的和,叫做二叉树的带权路径长度(WPL)。 比如在二叉树a中根节点到权值为7的节点的路径为4,根节点到权值为9的节点的路径也是为4,而在二叉树b中根节点到权值为2的节点的路径为3,根节点到权值为9的节点的路径为2 。也就是说,树的路径长度就是从树的根...原创 2018-07-11 19:45:25 · 2437 阅读 · 0 评论 -
49-从哥尼斯堡七桥问题开始
1. 哥尼斯堡七桥问题 图1 在18世纪初普鲁士的哥尼斯堡小镇上有一条河穿过,河上有两个小岛,有七座桥把两个岛与河岸联系起来。 于是有人提出问题:一个步行者怎样才能不重复,不遗漏地一次走完七座桥,最后回到出发点 。 这个问题提出后,小镇上的居民都在思考这个问题,并开始进行试验,但是在之后很长的一段时间里,这个问题一直没有得到解决。 其实对于这个问题,利用普通数学知识,...原创 2018-07-12 19:39:50 · 2293 阅读 · 0 评论 -
50-图的定义
1. 图的定义 图1-图的定义图形结构是属于复杂的非线性结构。图的定义: 图由顶点的集合和边的集合构成。 图的形式化定义通常表示为:G = ( V , E) 其中G表示一个图 集合V(vertex):表示图G中顶点的有限非空集合,记为V ( G )。 图G中的0,1,2,3,4这几个数据元素称为顶点,对于n个顶点的图,对每个顶点连续编号,即顶点的编号为0...原创 2018-07-12 22:48:07 · 839 阅读 · 0 评论 -
51-图的基本术语
1. 端点和邻接点 图1-无向图 在一个无向图中,若存在一条边(i,j),称顶点i和顶点j为此边的两个端点,比如在(1,2)之间有一条这样的边, 那么1和2就是这条边的端点,且顶点i和顶点j之间互为邻接点。 图2-有向图 在一个有向图中,因为是有方向的,若存在一条边< i,j>,称顶点i是一条出边(因为是从i出原创 2018-07-14 17:58:53 · 877 阅读 · 0 评论 -
7-算法和数据结构
1. 算法和数据结构 程序 = 数据结构+算法,相信大家都听说过这句话吧。程序就是在数据的某些特定的表示方法和结构的基础上,对抽象算法的具体表述。将松散,无组织的数据,按照某种要求组成一种数据结构,对于设计一个简明,高效,可靠的程序,是大有益处的。 程序设计语言提供了实现数据结构和算法的机制,程序设计在数据结构和算法设计工作的基础上完成。那么由程序设计语言描述的算法就是计算机程序,算法...原创 2018-05-25 16:02:37 · 464 阅读 · 0 评论 -
8-线性表的基本运算
1. 线性表的定义线性表是具有相同特性的数据元素的一个有序序列。其表示方法如图1所示: 图1-线性表结构线性表的长度:序列中所含元素的个数—— n , n ≥ 0,n表示线性表L中元素的个数。空表:当n = 0时,表示线性表是一个空表,即表中不包含任何元素前驱:ai−1ai−1a_i - 1是aiaia_i的前驱,2 ≤ i ≤ n后继:ai+1ai+1a_i + 1是a...原创 2018-05-26 10:37:59 · 3927 阅读 · 0 评论