
数据结构
小陈大人
没有对象那就new一个
展开
-
图的创建和遍历
图的定义: 由顶点的有穷非空集合和顶点之间边的集合组成的数据类型图的表示:G(V,E),G表示一个图,V是图G的顶点集合,E为图G的边的集合图的逻辑结构:多对多图的存储结构:邻接矩阵 邻接表 十字链表 邻接多重表图的一些无聊术语: 顶点i与j之间的边无方向,则称此边为无向边(Edge),无向边构成的图成为无向图,无序偶表示(i,j)若i到j有方向,则叫有向边,也成为弧(Arc),i叫...原创 2018-04-07 17:21:27 · 2183 阅读 · 0 评论 -
双链表的基本操作--创建,插入,删除,查找
都挺简单的,就是要注意,无论单链表还是双链表,删除时都要遵循先链后断双链表插入和删除时,指针可直接移到要插入或者的位置,不用像单链表一定要移到其前驱结点,因为双链表每个结点自带前驱指针#include <iostream>#include<stdlib.h>typedef struct DLNode{ int data; struct DLNo...原创 2018-04-10 00:52:02 · 291 阅读 · 0 评论 -
二叉排序树的创建,查找和插入
二叉排序树的查找,插入和创建代码#include <iostream>#include<stdlib.h> typedef struct BTNode{ int data; BTNode *lchild; BTNode *rchild;}BTNode;int SearchBTS(BTNode *T,int key,BTNode *f,...原创 2018-04-16 21:34:59 · 1012 阅读 · 0 评论 -
栈和队列的基本操作
顺序栈的创建和访问链栈的创建和访问循环队列的创建和访问链队的创建和访问代码如下#include <iostream>#include<stdlib.h>#define maxSize 100 typedef struct {//顺序栈定义 int data[maxSize]; int top;}SqStack; typedef...原创 2018-04-13 10:47:35 · 214 阅读 · 0 评论 -
关键路径
在一个表示工程的带权有向图中,用顶点表示事件,有向边表示活动,用边上的权值表示活动的持续事件,这种有向图我们称之为AOE网(Activity On Edge Network)AOE网中入度为0的顶点称为始点或源点,出度为0的顶点成为终点或汇点AOE网是用来表示工程流程的,它带有明显的工程特性,如果在某顶点所代表的事情发生后,从该顶点出发的各活动才能开始,只有在进入某顶点的各活动都已经结束,该...原创 2018-04-07 12:03:19 · 462 阅读 · 2 评论 -
三种简单排序算法---冒泡排序,简单选择排序,直接插入排序
冒泡排序核心思想:类似水泡一样,一趟比较,通过相邻元素的交换,冒出当前序列的最小值(最大值)到相应位置复杂度分析最好的情况:序列本身有序,只要进行n-1次比较,无需交换,时间复杂度为O(n)最差情况: 序列逆序,此时需要比较1+2+3+...(n-1)=n(n-1)/2次,并进行等数量级的交换辅助空间:O(1)综上,总的时间复杂度为O(n^2)稳定性:稳定void b...原创 2018-06-05 17:20:09 · 2333 阅读 · 1 评论 -
希尔排序
希尔排序核心思想:其实就是直接排序的升级版,把序列按照一定的增量分组,各小组之间用直接排序的方法排好序,接着把增量缩小,重复此过程,直到最后增量为1复杂度分析: 希尔排序是相隔某个增量的记录而组成的一个子序列,实现跳跃式的移动,使得效率提高迄今为止没找到最优的增长序列,但增量序列的最后一个值必须为1最好:O(n^3/2)最差:O(n^2)平均:O(nlogn)~O(n^2)时间...原创 2018-06-05 21:43:13 · 118 阅读 · 0 评论 -
归并排序
归并排序核心思想: 是分治算法的典型应用,归并排序中的来说就两步分:把序列分成左右子序列,左右子序列又细分成各自的左右子序列,直到左右子序列都各只有一个(递归实现)治:对分好的子序列分别进行合并排序,这里排序的方法是定义两个哨兵,左哨兵指向左子序列的首元素,右哨兵指向右子序列的首元素,然后两者指向的值进行比较,谁小,则谁先存入新数组,直到左右序列都存完时间复杂度:最好最差均为O...原创 2018-06-05 22:03:04 · 139 阅读 · 0 评论 -
堆排序
堆排序核心思想: 前提知识:堆其实就是一种特殊的完全二叉树,分为大顶堆和小顶堆,大顶堆就是指父节点&amp;amp;gt;=左右孩子结点,而左右孩子结点之间的大小关系随意,小顶堆反之堆排序核心:就是先把序列构建成大顶堆序(升序用大顶堆),然后大顶堆的根节点和最后一个结点交换位置,这样一来每交换一次就得到当前序列的最大值,并把它放在了最后面,接着把剩下的序列继续构建成大顶堆,重复上面动作,直到序列只剩一个...原创 2018-06-06 10:14:24 · 2168 阅读 · 0 评论 -
快速排序
快速排序核心思想: 快速排序就是立一个数作为基准数,比他小的统统放左边,比他大的统统放在他的右边,接着通过递归,对它的左边序列,右边序列重复此过程,直到无数可分复杂度分析 最好情况:O(nlogn)最差情况:O(n^2)平均情况:O(nlogn)辅助空间:O(logn)~O(n)稳定性:不稳定图解如序列{6,1,2,7,9,3,4,5,10,8}6作为基准数,左右...原创 2018-06-06 12:37:25 · 161 阅读 · 0 评论 -
拓扑排序算法
什么是拓扑排序 对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。背景知识 一个较大的工程往往被划分成许多子工程,我们把这些子工程称作活动。在整个工程中,有些子工程(活动)必...原创 2018-04-09 23:51:32 · 419 阅读 · 0 评论 -
单链表的基础操作----链表的创建,插入,查询和删除
需要注意:插入和删除结点时,我们要找到相应位置的前驱结点,遍历结点的循环条件要注意这个问题单链表的删除操作需要注意的地方: 删除之前必须先找到要删结点的前驱结点,所以在查找判断条件要用p->next!=NULL任何要改变链表本身的操作(如增加,删除,),都不能乱动头结点的位置,而是需要额外定义一个指针指向头结点,然后用这个指针操作#include <iostream&g...原创 2018-04-09 23:27:44 · 700 阅读 · 0 评论 -
最小生成树的两种经典算法--prim算法和kruskal算法
一个连通图的生成树是图的一个极小连通子图,它包含所有顶点,但只有足以构成树的n-1条边这意味着对生成树来说,砍去它的任何一条边,就会使生成树变成非连通图,若给他增加一条边就会形成一条回路最小生成树:权值最小的那颗生成树叫~最小生成树的性质:最小生成树并不唯一,准确的来说是最小生成树的树形并不唯一最小生成树的权值之和唯一,并且是最小的最小生成树的边数=顶点数-1求最小生成树有两种经...原创 2018-04-07 21:35:55 · 3958 阅读 · 0 评论 -
最短路径的经典算法-Dijkstra算法
最短路径:指两顶点之间经过的边上的权值之和最小的路径,并称路径的第一个顶点为源点,最后一个顶点为终点求最短路径的算法通常都依赖一种性质:两点之间的最短路径也包含了路径上 其他顶点之间的最短路径带权有向图G的最短问题分两类: 单源最短路径:即某一顶点到其他各顶点的最短路径,可用Dijkstra算法求任意一对顶点最短路径:可通过Floyd-Warshall算法求解Dijkstra算法(...原创 2018-04-07 22:30:45 · 452 阅读 · 0 评论 -
二叉树的创建及前中后序遍历和层次遍历
树是N个结点的有限集合,N=0时称为空树,任意一颗非空树满足以下条件: 有且只有一个特定的称为根的结点当N>1时,其他结点可分为m个互不相交的悠闲集合,其中每个集合本身又是一个棵树,并称为根节点的子树树的定义是递归的,是一种递归的数据结构,树作为一种逻辑结构,同时也是一种分层结构,具有以下两特点: 树的根节点没有前驱结点,除根之外的所有结点有且只有一个前驱结点树中所有结点可有零个...原创 2018-04-08 09:43:17 · 666 阅读 · 0 评论 -
二叉树的前中后序遍历非递归实现及层次遍历队列实现
我的上篇博客给出了二叉树的创建和前中后序遍历算法,但它们都是基于递归实现的,虽然代码简洁,但理解起来有点费劲,想当初第一次看到这么简洁的遍历算法后,心里连连跳出三个卧槽,实在是简洁的不像话,这里先给出我自己对递归的理解.递归像剥洋葱,假设我们剥了一层皮后还要洗干净这层皮,这一步才算完成,那么我们在剥完一次皮后,本来按步骤要去洗的,但剥完发现还有一层皮要剥,于是我们就先不洗了,而是立马把新出现的...原创 2018-04-08 11:34:16 · 3655 阅读 · 6 评论 -
根据前序序列+中序序列或根据中序序列+后序序列还原二叉树
已知先序序列存在pre[l1...r1]中 ,中序序列存在in[l2...r2]中,二叉树的结点数据域不等,构造二叉树并求其后序遍历序列已知中序序列存在in[l2...r2]中,后序序列存在post[l1...r1],二叉树的结点数据域不等,构造二叉树并求其前序遍历序列代码如下#include <iostream>#include <stdlib.h>t...原创 2018-04-08 16:17:07 · 1051 阅读 · 0 评论 -
求二叉树的最大宽度
求二叉树中结点最多的那层的结点数代码如下#include <iostream>#include <stdlib.h> #define maxSize 100typedef struct BTNode{//二叉树结点 char data; struct BTNode* lchild; struct BTNode* rchild;...原创 2018-04-08 21:13:50 · 956 阅读 · 0 评论 -
单链表的头插法和尾插法创建及两链表的融合
单链表的两种创建方法:尾插法和头插法两个数据域递增的单链表融合成一个依旧递增的单链表,很简单了注意新链表头结点的就ok了简单的很,直接看代码吧#include <iostream>#include<stdlib.h> #include<algorithm> #define maxSize 100using namespace std;t...原创 2018-04-09 00:19:22 · 656 阅读 · 0 评论 -
单链表的查找和删除
单链表的删除操作需要注意的地方: 删除之前必须先找到要删结点的前驱结点,所以在查找判断条件要用p->next!=NULL任何要改变链表本身的操作(如增加,删除,),都不能乱动头结点的位置,而是需要额外定义一个指针指向头结点,然后用这个指针操作#include <iostream>#include<stdlib.h>typedef struct LNod...原创 2018-04-09 22:18:28 · 833 阅读 · 0 评论 -
KMP算法
KMP是对字符串匹配优化的算法,要了解kmp算法由来应先了解传统的字符串匹配的工作机制传统的字符串匹配机制如下有两个字符串,上面那个是主串(T),下面那个是模式串(相当于关键字,下面称为p) 要在T中查找是否含有p,我们要做的工作自然是在T和p之间各自定义一个哨兵i和j,各自一位一位比对,如下图 如果i和j所指的值都相同,那么两者都往前走,若是不同,如下图 此时AE不等,...翻译 2018-06-06 16:41:08 · 179 阅读 · 0 评论