数据结构的学习
隔壁王同学啊
BIO
展开
-
数据结构与算法之素数的筛选
数据结构与算法之素数的筛选 素数筛选,顾名思义就是给你一堆数,然后让你找到其中的素数。直观的思路就是针对一个数n,从2开始枚举,一直枚举到n-1。显然这个思路的算法复杂度接近了O(nn),对大规模数据显然是不可接受的。所以我们得优化这个思路,看能否进一步减低算法时间复杂度。 我们以数字5为例,我们想知道5是否是素数,那么我们从2开始枚举,发现5%2!=0,故继续枚举到3,5%3!=0,故继...原创 2020-03-20 21:28:04 · 180 阅读 · 0 评论 -
数据结构与算法之归并、快速排序
数据结构与算法之归并、快速排序 这是排序问题中的两个重要且基础的排序算法。之所以拿来一起介绍使用为他俩有着异曲同工之妙,只要理解了归并排序,就知道了快排是咋回事的了。 归并排序就是从局部无序变有序,最后全局无序变有序。基本思想就是先俩俩一组,通过合并排序,保证组内有序后,我们在将相邻的两组合并排序(将两组链接并排序)成为新的一组。然后再合并排序,再依次循环,直到一组的长度是整个待排序数组的...原创 2020-03-20 21:27:02 · 117 阅读 · 0 评论 -
数据结构与算法之二分法
数据结构与算法之二分法万物皆可分 二分法应该是我们熟悉的内容,因为在初高中的数学课堂中均会设计到二分的思想。比如,我们求某一无理数的近似值,就是通过二分法。比如求2\sqrt{2}2的近似值,范围在[1,2]内。显然我们可以先取中点3/2,显然3/2的平方大于2,故在取区间[1,3/2]然后依次操作,直至区间长度达到所需的精度。double eps=1e-5;int f(double...原创 2020-03-20 21:24:12 · 650 阅读 · 0 评论 -
数据结构与算法之散列
数据结构与算法之散列 其实在之前的算法练习题中已经使用到了散列(hash)这一思想,那就是以空间换时间。 举例:现有整数集合M,还有一个输入的整数集合N,且M,N均小于等于10 的5次方。那么,我想知道集合N中的哪些整数出现在了集合M中? 分析:一般的思路肯定是拿两个集合的数一个个比较,即用两个嵌套的循环实现。则此种的算法时间复杂度为O(n*m)。那么我们是否有办法使得时间复杂度从O(n...原创 2020-03-05 11:43:26 · 127 阅读 · 0 评论 -
数据结构与算法之两句话讲懂递归
数据结构与算法之两句话讲懂递归`声明:并不是全文就两句话,而是全文围绕两句话。 人理解循环,神理解递归。 这句话是在网上偶尔看到的,出处在哪已经找不到了。当时对这句话深以为然,因为初次接触递归时,感觉递归非常的难以理解。总觉得递归非常的神秘莫测,非常的抽象。其实不然,递归本质上是一种特殊的循环写法。可以这样说,只要你懂得循环的思想,你就能把握递归的精髓。“人理解循环,神理解递归。”你要...原创 2020-03-05 11:39:48 · 203 阅读 · 0 评论 -
常用数据结构之桶式排序
关于桶式排序,其实以前见到过,当成了一个排序技巧来记了。具体就是,有一个序列,有n个数,并且每个数取值范围是0~100。问如何快速的进行排序。那么我们可以很容易想到,就是在开一个大小为一百的数组,并且初始化为0,然后遍历所给的序列,比如遍历到了23,就把23放入新开数组下标为23的位置上,具体表现在加1,这样最后在重新遍历新开的数组,当元素不为0时输出下标,这样序列就从小到大排好了。其当然有一...原创 2019-05-05 19:40:33 · 561 阅读 · 0 评论 -
常用数据结构之直接插入排序算法
所谓排序就是将原本无序的序列重新排列成有序序列的过程。此次介绍插入类排序。void InsertSort(int R[],int n){ int temp; for(int i=1;i<=n;i++){ temp=R[i]; int j=i-1; while(j>=0&&R[j]<R[i]){ R[j+1]=R[j]; ...原创 2019-04-30 19:15:19 · 167 阅读 · 0 评论 -
常用的数据结构之冒泡排序以及双向冒泡排序
冒泡排序是通过一系列的交换动作来完成的。具体算法void BubbleSort(int a[],int n){ int falg=0; for(int i=n-1;i>=1;i++){ for(j=1;j<=n;j++){ if(a[j]<a[j-1]){ temp=a[j-1]; a[j-1]=a[j]; a[j]=temp...原创 2019-04-30 20:29:28 · 1087 阅读 · 0 评论 -
常用的数据结构之顺序顺序查找法
顺序查找,顾名思义其实按照线性顺序来进行查找。即顺序扫描当前线性表,依次将扫描到的关键字与任一给定的值作比较,如是,则查找成功,否则就失败。下面用一个简单的代码来实现。这是最简单的一种查找方式了。不管成不成功,其算法时间复杂度均为O(n).void Search(int a[],int n,int k)//待查数组为a[],其数目为n,k为待查找数。{for(int i=0;i<...原创 2019-05-09 19:49:14 · 2960 阅读 · 0 评论 -
常用的数据结构之折半查找
折半查找使用的条件首先就是,其序列是有序的。基本思想就是,每次比较该序列的中间的元素,若相等则查找成功,若大于该中间值,则去右半部分子序列进行再此的比较,若小于该中间值,则去左半部分的子序列进行再次的比较。直至该子序列的长度等于一。代码如下:void midsearch(int a[],int low,int hight,int k){ int mid; while(low<...原创 2019-05-09 20:04:51 · 717 阅读 · 0 评论 -
常用的数据结构之二叉排序树
首先先理解二叉排序树的定义。二叉排序树满足以下三个性质:1,若它的左子树不为空,则其左子树上的所有关键字的值均小于根关键字上的值。2,若它的右子树不为空,则右子树上所有关键字的值均大于根关键字上的值。3,左右子树又是一颗二叉排序树。二叉排序树通常用二叉链表来存储的。 typedef struct BTNode{ int key; struct BTNode *lchi...原创 2019-05-10 20:06:00 · 279 阅读 · 0 评论 -
常用的数据结构之二路归并排序
其排序算法的基本思想就是,将原序列**(假设有n个关键字)**分成很多个子序列每个子序列就有一个关键字且子序列之间是个不相同的。之后就是将两两的子序列进行合并,所以整个数据规模就变成了n/2,之后在进行重复操作,数据规模不断的除以2,直至变为1。以下是代码:void Merge(int A,int low,,int mid ,int high ){ int i=low; int j=m...原创 2019-05-05 16:54:40 · 421 阅读 · 0 评论 -
常用数据结构之图的两种存储方式
图由结点的有穷结合V和边的集合E组成。为了与树形结构进行区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对。若两个顶点之间存在一条边,则表示这两个顶点具有相邻的关系。图通常有两种存储方式,即邻接矩阵和邻接表。下面介绍一下邻接矩阵。设G=(V,E)是具有n个结点的图,顶点序号依次为0,1,2,3、、、n-1。G的邻接矩阵是具有如下定义的方阵A:A[i][j]=1表示顶点i与顶点j邻接...原创 2019-04-20 10:09:58 · 3508 阅读 · 0 评论 -
常用数据结构之线索二叉树的中序遍历
此重要介绍中序遍历线索二叉树。代码如下void *First(TBTNode *p){//此函数为寻找中序遍历下的第一个结点。或者是TBTNode *First(TBTNode *p) while(p->ltag==0){//当其有左孩子是一直不断的向左寻找。 p=p->lchild; } return p;}//构造寻找下一个节点的函数。void *Next...原创 2019-04-16 19:43:42 · 261 阅读 · 0 评论 -
常用的数据结构之线索二叉树的构建
1:当使用非递归遍历二叉树时仍要开一个用户栈,而构建了线索二叉树后就不需要再开栈了,可以节省不少空间。因为线索二叉树是用链表储存的,可以非常快的找到前驱或后继节点。首先,中序创建线索二叉树的代码如下。struct TBTNode{ chat data; struct TBTNode *lchild; struct TBTNode*rchild; int ltag;...原创 2019-04-14 20:56:36 · 142 阅读 · 0 评论 -
常用的数据结构之图的深度搜索
此代码所代表的深度搜索是建立在图是用邻接表的存储的!关于邻接表的存储代码见上个文章!以下是代码(写法1):int visit[maxn];ArcNode *p=G->adjlist[v].firstarc;visit[v]=1;void DFS(AGraph * G,ArcNode *&p){ while(p!=NULL){ if(visit[p->...原创 2019-04-21 17:03:41 · 498 阅读 · 0 评论 -
常用数据结构之图的广度搜索
同样本代码所呈现的广度搜索是基于图是用邻接表存储的。其实现广度搜索是需要开一个队列来进行操作,对于C++而言,可以直接使用STL库中的队列。对于C来说,可以开一个数组来模仿队列的操作。代码如下:int visit[maxn];int queue[maxn];int rear=0;int front=0;int j;void BFS(AGraph *G,int v){ Ar...原创 2019-04-21 19:13:47 · 240 阅读 · 0 评论 -
关于理解链式前向星的理解
我们知道存储图可以用邻接表、邻接矩阵等,但是其占用空间大,比较适合于一些小型图。当存储一些大型图即有很多结点时,我们可以考虑用前向星和链式前向星。其中前向星得用到快速排序,其耗费时间稍长,其放在下一回讨论。本次着重讨论链式前向星。链式前向星是基于边集来存储的。对于一条边,其起点为v,其终点为u,其权值为w。我们先定义一边集结构体。struct edges{ int w;//该边的权值 i...原创 2019-04-25 21:47:47 · 156 阅读 · 0 评论 -
常用数据结构之普里姆算法
在图中,寻找一棵最小代价的生成树尤为重要。现在有普里姆算法。基于邻接矩阵来实现。void Prim(MGraph g,int v0,int &sum){ int lowcost[maxsize],vset[maxsize],v; int k; int min; int v=v0; for(i=0;i<g.n;i++){///此为初始情况,将v0相接的顶点权值读入low...原创 2019-04-23 20:07:04 · 1104 阅读 · 0 评论 -
常用数据结构之克鲁斯卡尔算法
克鲁斯卡尔算法需要用到并查集,以及stl中的sort排序。普里姆算法是按照图的顶点来生成最少代价树,而克鲁斯卡尔算法是根据图中的边来生成最小代价树,由于启用了sort排序,所以其适用于比较稀疏的图。以下是代码:#include<iostream>struct Road{ int a,b;//代表此边是连接着a,b结点 int w; //代表该边的权值 };boo...原创 2019-04-23 20:52:56 · 452 阅读 · 0 评论 -
常用数据结构之堆排序
堆是一种数据结构,可以把他看作是一个完全二叉树,这个二叉树满足任何一个父结点都不大于或小于其左右孩子的值。若父亲大而孩子小,则叫做大顶堆,相反的叫做小顶堆。在应用堆排序时,可以选择大顶堆或小顶堆,当使用大顶堆时排序出来的序列时非递减的(非递减不等于递增,因为其可能有相同的排序关键字),以下的代码采用了大顶堆的方式。void void Sift(int low,int hight,int ...原创 2019-05-04 21:18:40 · 183 阅读 · 0 评论 -
常用的数据结构之迪杰斯特拉算法
通常采用迪杰斯特拉算法来求某一顶点到其余顶点的最小距离。引入了三个数组,dist[],path[],set[].其中dist[]数组是用来存放当前状态下,到该节点的额最小权值。path[]数组是存储了当前结点所连接的前一个结点,也就是记录了当前的路径。而set[]数组是分别有0,1两个值,其中0代表该节点未被并入树中,而1代表该节点已经被并入树中。以下是具体的代码:void Dijk...原创 2019-04-24 19:28:31 · 1045 阅读 · 0 评论 -
常用的数据结构之弗洛伊德算法
弗洛伊德算法是解决一个顶点到图中一个顶点的最短路径问题。通常适用于一对顶点间的最小路径.。void Floyd(Mgraph g,path[maxsize]){ int A[maxsize][maxsize]; for(int i=0;i<g.n;i++){ for(int j=0;j<g.n;j++){ A[i][j]=g.edges[i][j]; path...原创 2019-06-16 21:08:40 · 611 阅读 · 0 评论 -
常用的数据结构之二叉树的递归与非递归的遍历。
编程光看伪代码是不行滴。理解了一个算法的思路,就转换为自己的风格。就从二叉树的遍历开始吧!1.1前序递归遍序递归代码虽然非常简洁,但是它要调用很多的系统资源,容易爆栈。所以掌握非递归的算法也是很重要的。void preorder(BT*p){ if(p!=NULL){ vist(p); preorder(p->left);//先遍历左子树 preorder(p...原创 2019-04-13 22:47:59 · 219 阅读 · 0 评论