数据结构
小白的数据结构之路
_Crazy€
你来时冬至,但眉上风止,开口是‘我来的稍稍迟’。大抵知心有亭树,亭亭一如你风致。
展开
-
归并求逆序数(C语言)
#include <stdio.h>int n;int a[101000];int t[101000];long long ans;void Merge(int s1,int e1,int s2,int e2){ int k=s1; int p1 = s1; int p2 = s2; while (p1<=e1&&p...原创 2019-12-06 13:29:27 · 1094 阅读 · 0 评论 -
数据结构实验之排序六:希尔排序
数据结构实验之排序六:希尔排序Problem Description我们已经学习了各种排序方法,知道在不同的情况下要选择不同的排序算法,以期达到最好的排序效率;对于待排序数据来说,若数据基本有序且记录较少时, 直接插入排序的效率是非常好的,希尔排序就是针对一组基本有序的少量数据记录进行排序的高效算法。你的任务是对于给定的数据进行希尔排序,其中增量dk=n/(2^k)(k=1,2,3……)In...原创 2019-12-01 22:05:22 · 1113 阅读 · 0 评论 -
数据结构实验之排序四:寻找大富翁(堆排序)
数据结构实验之排序四:寻找大富翁Problem Description2015胡润全球财富榜调查显示,个人资产在1000万以上的高净值人群达到200万人,假设给出N个人的个人资产值,请你快速找出排前M位的大富翁。Input首先输入两个正整数N( N ≤ 10^6)和M(M ≤ 10),其中N为总人数,M为需要找出的大富翁数目,接下来给出N个人的个人资产,以万元为单位,个人资产数字为正整数,...原创 2019-12-01 21:15:24 · 480 阅读 · 0 评论 -
数据结构实验之排序二:交换排序
数据结构实验之排序二:交换排序Problem Description冒泡排序和快速排序都是基于"交换"进行的排序方法,你的任务是对题目给定的N个(长整型范围内的)整数从小到大排序,输出用冒泡和快排对这N个数排序分别需要进行的数据交换次数。Input连续多组输入数据,每组数据第一行给出正整数N(N ≤ 10^5),随后给出N个整数,数字间以空格分隔。Output输出数据占一行,代表冒泡排...原创 2019-11-23 20:49:22 · 399 阅读 · 0 评论 -
快速排序(C语言)
int a[200000];void qsort(int l,int r){ int x=a[l]; int i=l; int j=r; if(l>=r) return ; while(i<j) { while(i<j&&a[j]>=x)j--; a[i]=...原创 2019-11-23 20:12:18 · 414 阅读 · 0 评论 -
哈希表(C语言)
数据结构实验之查找七:线性之哈希表Problem Description根据给定的一系列整数关键字和素数p,用除留余数法定义hash函数H(Key)=Key%p,将关键字映射到长度为p的哈希表中,用线性探测法解决冲突。重复关键字放在hash表中的同一位置。Input连续输入多组数据,每组输入数据第一行为两个正整数N(N <= 1500)和p(p >= N的最小素数),N是关键字...原创 2019-11-23 16:48:19 · 845 阅读 · 1 评论 -
判断给定图是否存在合法拓扑序列
数据结构实验之图论十:判断给定图是否存在合法拓扑序列Problem Description给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。Input输入包含多组,每组格式如下。第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)后面m行每行两个整数a b,表示从a到b有一条有向边。Output若给定有向图存在合法拓扑序列,则输出YES;否则输出NO...原创 2019-11-22 20:15:50 · 235 阅读 · 0 评论 -
欧拉回路
数据结构实验之图论八:欧拉回路Problem Description在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来。能否走过这样的七座桥,并且每桥只走一次?瑞士数学家欧拉最终解决了这个问题并由此创立了拓扑学。欧拉通过对七桥问题的研究,不仅圆满地回答了哥尼斯堡七桥问题,并证明了更为广泛的有关一笔画的三条结论,人们通常称之为欧拉定理。对于一个连通图,通常把从某结点出发一笔...原创 2019-11-22 20:05:32 · 233 阅读 · 0 评论 -
从起始点到目标点的最短步数(BFS)
数据结构实验之图论五:从起始点到目标点的最短步数(BFS)Problem Description在古老的魔兽传说中,有两个军团,一个叫天灾,一个叫近卫。在他们所在的地域,有n个隘口,编号为1…n,某些隘口之间是有通道连接的。其中近卫军团在1号隘口,天灾军团在n号隘口。某一天,天灾军团的领袖巫妖王决定派兵攻打近卫军团,天灾军团的部队如此庞大,甚至可以填江过河。但是巫妖王不想付出不必要的代价,他想...原创 2019-11-22 19:53:21 · 172 阅读 · 0 评论 -
数据结构——最小生成树(C语言)
数据结构实验之图论九:最小生成树Problem Description有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。Input输入包含多组数据,格式如下。第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n <= 100, m <=100...原创 2019-11-07 22:14:43 · 3260 阅读 · 0 评论 -
树的同构
#include<stdio.h>typedef struct node{ char data; int l,r;}NODE;NODE t1[20],t2[20];int n,m;void build(NODE *t,int mm){ int i; for(i=0; i<mm; i++) { char s...原创 2019-10-24 21:52:35 · 208 阅读 · 0 评论 -
最短路算法
解决最短路的问题主要有以下算法:Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法。1、Dijkstra算法void Dijkstra(int v){ int i, j, k; for(i = 1; i <= n; i++)//dist数组的初始化 { dist[i] = map[v][i]; vis...原创 2019-08-08 16:01:50 · 401 阅读 · 0 评论 -
DFS和BFS遍历
int n; //结点个数int mp[N][N]; //邻接矩阵int vis[N]; //记录此顶点是否遍历过;DFSvoid DFS(int x){ int i; countt++; if(countt==1) printf("%d",x); else printf(" %d",x); for(i=0...原创 2019-08-07 11:08:36 · 200 阅读 · 0 评论 -
效率至上(线段树)
Problem Description题意很简单,给出一个数目为n的非有序序列,然后有m次查询.对于每次查询输入两个正整数l,r请输出区间[l,r]的最大值与最小值的差值Input第一行:输入两个正整数n,m (1<=n<=50000, 1<=m<=200000 );第二行:输入n个整数 大小范围为[1,100000];接下来的m行,每次两个正整数l,...转载 2019-08-06 13:22:26 · 342 阅读 · 0 评论 -
sdut oj 迷之好奇(字典树)
Problem DescriptionFF得到了一个有n个数字的集合。不要问我为什么,有钱,任性。FF很好奇的想知道,对于数字x,集合中有多少个数字可以在x前面添加任意数字得到。如,x = 123,则在x前面添加数字可以得到4123,5123等。Input多组输入。对于每组数据首先输入n(1<= n <= 100000)。接下来n行。每行一个数字y(1 <= y ...原创 2019-08-06 13:19:15 · 182 阅读 · 0 评论 -
线段树(数组计算机)
#include<bits/stdc++.h>using namespace std;struct node{ long long val;//此处必须是long long类型,因为要存long long型值}tree[500001];long long data[500001];void build(int root, int left, int right)...原创 2019-08-06 09:39:52 · 167 阅读 · 0 评论 -
并查集
例题:输入样例,第一行为一个整数n,代表有n台电脑,编号1-n;接下来进行一系列操作,当输入‘c’时,判断后面输入的电脑编号是否连接;当输入‘I’时,把后面输入的电脑编号连接;当输入是‘S’时,停止输入结束,输出这n台电脑是否形成网络;主函数int main(){ int s[100]; int n; char a; scanf("%d",&n);...原创 2019-08-05 12:25:21 · 1986 阅读 · 0 评论 -
最大堆的操作
1、结构类型typedef struct node{ int *p; //实际上就是一个数组; int size; int max;}NODE;2、创建一个空堆NODE *creat(int max){ NODE *h=(NODE *)malloc(sizeof(NODE)); h->p=(int *)malloc((max+1)*si...原创 2019-08-04 13:03:22 · 134 阅读 · 0 评论 -
KMP算法代码(C语言)
int next[1000000];void get_next(char s[]){ int j=-1; next[0]=-1; int i=0; int len=strlen(s); while(i<len-1) { if(j==-1||s[i]==s[j]) { i++; ...原创 2019-04-09 18:53:39 · 5377 阅读 · 0 评论 -
队列中的循环队列用法说明
循环队列样式结构图:优点:解决了顺序队列只能从队尾插入元素而导致空间的浪费;问题:在循环队列中,空队特征是front = rear, 队满时也会有front = rear; 判断条件将出现二义性;解决方法1、使用额外的标记(1)引入Size标记来记录队列的长度,当size为队列最大长度时为满,size=0为空;(2)引入tag标记删除时tag=0,插入时tag=1;当fron...原创 2019-07-30 21:36:42 · 1584 阅读 · 0 评论 -
栈和队列函数的基本操作(c++)
栈//s.empty(); //如果栈为空则返回true, 否则返回false;//s.size(); //返回栈中元素的个数//s.top(); //返回栈顶元素, 但不删除该元素//s.pop(); //弹出栈顶元素, 但不返回其值//s.push(); //将元素压入栈顶队列//q.em...转载 2019-07-30 20:58:11 · 591 阅读 · 0 评论 -
中缀表达式转化为后缀表达式(栈思想)
步骤说明:举例说明a*(b+c)/d= ? 转化为后缀表达式为:abc+*d/=?变化过程为:1、碰到运算数就输出;2、碰到号放入栈3、碰到左括号,左括号的优先级比号的优先级高,so把左括号放进栈中;4、碰到运算数b,直接输出;5、当左括号放进栈中的时候,优先级降到最低,so+号的优先级比左括号高,放进栈中,并把c输出;6、当碰到右括号的时候,把栈顶的元素以此依次输出知直到碰...原创 2019-07-30 20:22:23 · 1003 阅读 · 0 评论 -
sdutoj 离散事件模拟-银行管理(C++)
题目要求Problem Description现在银行已经很普遍,每个人总会去银行办理业务,一个好的银行是要考虑 平均逗留时间的,即: 在一定时间段内所有办理业务的人员逗留的时间的和/ 总的人数。逗留时间定义为 人员离开的时间减去人员来的时间。银行只有考虑了这一点,我们在办理业务的时候,才不会等太多的时间。为了简化问题,我们认为银行只有一号窗口和二号窗口可以办理业务 ,并且在时间范围是12&...原创 2019-07-29 13:09:20 · 406 阅读 · 2 评论 -
优先队列priority_queue的使用说明(c++)
优先队列的头文件#include<queue>声明样式priority_queue <int> i;priority_queue <double> d;//以上两条默认为从大到小排列;priority_queue <node> q;//node是一个结构体//结构体里重载了‘<’小于符号priority_queue <...原创 2019-07-29 16:03:00 · 100 阅读 · 0 评论 -
判断是否为同一颗二叉搜索树(二叉排序树)
判断方法1、分别建立两颗搜索树,通过递归,比较根,左子树,右子树是否相同;2、不建树的判别方法;3、只建一棵树,在判别其他序列是否与该树一致;首先:看第三种;#include<stdio.h>#include<stdlib.h>typedef struct node //结构结点{ int data; struct node *lson;...原创 2019-08-04 14:33:10 · 676 阅读 · 1 评论 -
建一颗平衡二叉树(C语言)
#include<stdio.h>#include<stdlib.h>typedef struct node{ int data; //存储数据 int d; //记录深度 struct node *lson; struct node *rson;}NODE;int max(int a,int b){ return a...原创 2019-08-02 09:39:30 · 259 阅读 · 0 评论 -
二叉排序树
建树代码:NODE *creat(NODE *t,int x){ if(t==NULL) { t=(NODE *)malloc(sizeof(NODE)); t->data=x; t->lson=NULL; t->rson=NULL; } else { if...原创 2019-08-01 11:25:38 · 81 阅读 · 0 评论 -
二叉树的遍历原理
一、递归过程:1、先序遍历void xian(NODE *t){ if(t) { printf("%c",t->data); xian(t->lson); xian(t->rson); }}2、中序遍历void mid(NODE *t){ if(t) { mi...原创 2019-07-31 17:00:28 · 1254 阅读 · 0 评论 -
找一篇文章中不同单词的个数(字典树)
#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct node{ int id; struct node *next[26];} NODE;NODE T[1000000];int top;int count;NODE *creat(){ ...原创 2019-08-06 10:28:28 · 948 阅读 · 0 评论 -
二叉树的基本操作(C语言)
前提:#include<stdio.h>#include<stdlib.h>typedef struct node{ char data; struct node *lson; struct node *rson;}NODE;一、建造二叉树1、已知二叉树的一个按先序遍历输入的字符序列,如abc,de,g,f, (其中,表示空结点)。...原创 2019-04-16 21:04:04 · 290 阅读 · 0 评论 -
数据结构:下一较大值(栈的思想)
例题:Problem Description对于包含n(1<=n<=100000)个整数的序列,对于序列中的每一元素,在序列中查找其位置之后第一个大于它的值,如果找到,输出所找到的值,否则,输出-1。Input输入有多组,第一行输入t(1<=t<=10),表示输入的组数;以后是 t 组输入:每组先输入n,表示本组序列的元素个数,之后依次输入本组的n个元素。Out...原创 2019-09-13 15:07:39 · 182 阅读 · 0 评论