
数据结构与算法
文章平均质量分 76
crazy637
JUST DO IT CRAZY
展开
-
并查集
题意:某学校有N个学生,形成M个俱乐部。每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈。一个学生可以同时属于若干个不同的俱乐部。根据“我的朋友的朋友也是我的朋友”这个推论可以得出,如果A和B是朋友,且B和C是朋友,则A和C也是朋友。请编写程序计算最大朋友圈中有多少人。输入格式:输入的第一行包含两个正整数N(≤30000)和M(≤1000),分别代表学校的学生总数和俱乐部的个数。后面的M行...原创 2018-03-16 17:07:02 · 174 阅读 · 0 评论 -
单链表的逆转
题意:本题要求实现一个函数,将给定的单链表逆转。函数接口定义:List Reverse( List L );其中List结构定义如下:typedef struct Node *PtrToNode;struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */};typedef P...原创 2018-04-21 17:27:30 · 1090 阅读 · 0 评论 -
单源最短路径的迪克斯特拉(Dijkstra)算法的改进
Dijkstra算法1.定义概览Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点(节点需为源点)到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,注意该算法要求图中不存在负权边。 实例:假设有A,B,C,D四个城市,(这里讨论的是有向网) 它们的距离为: A->B(10),A-&g...原创 2018-05-03 10:28:02 · 3922 阅读 · 1 评论 -
分治法-大整数的乘法
分治法的原理 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。 有两点需要记住:(1) 分治法基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。(2)递归的解这些子问题,然后将各子问题的解合并得到原问...原创 2018-04-08 20:44:38 · 2389 阅读 · 2 评论 -
回溯算法(全排列问题)
1.全排列的定义和公式:从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列。由排列的定义,显然不同的顺序是一个不同的排列。从n个元素中取m个元素的所有排列的个数,称为排列数。从n个元素取出n个元素的一个排列,称为一个全排列。全排列的排列数公式为n!,通过乘法原理可以得到。2.时间复杂度:n个数(字符、对象)的全排列一共有n!种,所以全排列算法至...原创 2018-03-30 18:59:45 · 880 阅读 · 0 评论 -
最小生成树(Prim算法)
Prim算法的核心思想是"贪心" ,首先最小生成树是一个带权的无向图(最小生成树: n个顶点有n-1条边)。构建最小生成树就是要在带权边上选择最小权的边。首先置S = {1},然后只要S是V的真子集,就做如下贪心选择。选取满足条件i属于S,j属于V-S。且g.arac[i][j]最小的边 。并将符合条件的j顶点添加到S中。直到S = V为止。此过程选取到的边则为构成最小生成树的边。最小生成树的...原创 2018-03-12 21:48:00 · 2589 阅读 · 2 评论 -
栈实现中缀表达式的值
#include <iostream>#include <cstdio>#include <algorithm>#include <stack>#include <cstring>using namespace std;int youXianJi(char a){ //字符判断优先级 int k; swi...原创 2017-10-20 21:34:32 · 957 阅读 · 0 评论 -
动态规划-最大子段和问题
思路: 将给定的序列分为长度相等的两段,a[1,n/2],a[n/2+1,n];1:最大子段和在a[1,n/2]里面;2:最大子段和在a[n/2+1,n]里面;3: 最大子段和在a[i,j]里面,其中i位于(1,n/2),j位于(n/2+1,n);1,2情况直接递归求解,对于3可分别求出1,2中的最大值,然后相加。再与1,2中的最大值比较。得出最终的最大子段和。代码:/* @求解最大子段和 ...原创 2018-03-10 17:49:56 · 658 阅读 · 0 评论 -
动态规划— 0-1背包问题
什么是0_1背包问题: 0-1背包问题,表示的是每个物品只有一件,每件物品不能分割,在不超过背包容量的同时,如何选取物品,使得背包所装的价值最大(背包可以不装满)。特点:“步步优"。即最优解是由部分最优解得来。 递归地定义最优解的值: 对于每个物品我们可以有两个选择,放入背包,或者不放入,有n个物品,故而我们需要做出n个选择,于是我们设f[i][v]表示做出第i次选择后,所选物品放入一个...原创 2018-03-14 18:44:59 · 417 阅读 · 0 评论 -
贪心算法-哈夫曼树-(树的建立,带权路径长度,哈夫曼编码)
哈夫曼树中的名词意思:(ps:本想画个图的不知这上面怎么弄,就没弄了)树的权值:每个树节点所在的那个数字。路径:两个节点之间所经过的分支。路径长度: 某一路径上的分支条数。节点带权路径长度: 节点的权值*该节点的路径长度。树带权路径长度:所有叶子节点的带全路径长度之和。树带权路径长度:所有叶子节点的带全路径长度之和。建立哈夫曼树:单独将数组中的每个值作为一个节点,依原创 2017-09-27 16:11:59 · 10149 阅读 · 4 评论 -
改进版直接插入排序
直接排序的改进版: 主要两个操作:1:是确立好最小值(最大值),并将其放入数组第一个位置;2:元素依次插入进行排序,且是“从后往前推”思想。确立好最小值并排序 :void Insert_Sort(int a[],int left,int right){ for(int i = right;i>=left;i--){ //实现将最小值放入第一个位置且固定 if(a[i+1]<a[原创 2018-01-17 20:18:04 · 269 阅读 · 0 评论 -
普通二叉树的构建与层次遍历
树的遍历分为前,后,中序。前:“根左右"原则:先考虑根节点,再考虑左子树,最后为右子树,同时在左右子树中又坚持“根左右”原则。依次类推。 中后序遍历类似:中("左根右"),后("左右根");#include<iostream>#include <cstdio>#include <cstdlib>using namespace std;typedef st...原创 2017-09-25 20:06:24 · 324 阅读 · 1 评论 -
kmp算法
KMP算法主要是两个步骤:1:Next(char *p,int n[])函数计算模式串各值的部分匹配串长度。Next函数:void Next(char *p,int n[]){ int m = strlen(p); /*n[j]的值表示模式串在j位置的部分匹配串长度*/ n[0] = 0; /*0位置分匹配串长度为0*/原创 2017-12-30 21:30:49 · 196 阅读 · 0 评论 -
动态规划-矩阵连乘
动态规划常常用来解决,具有最优子结构,重叠子问题的对象。最优子结构: 即通过分析问题,将问题分解为多个子问题。然后每个子问题继续分解为更多子问题。从底往上求出最有值,由最优值确定最优解。重叠子问题: 在计算过程中不同子问题可能都会计算某个值。若每个子问题都去求解同一个值,浪费时间。动态规规划对每一个子问只求解一次,而后将其保留在一个表格中。当再次需要求解此子问题时,只需常数时间去查看下是否已经计算...原创 2018-05-15 16:44:24 · 275 阅读 · 0 评论 -
贪心算法-磁带最优存储问题
贪心算法通常是对某一值进行排序,然后再采取贪心策略进行求解。此问题贪心角度不同以往,它是对两因素进行综合处理。将它们的乘积进行排序。题意:设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是Li, 1<= i<= n。这n 个程序的读取概率分别是p1,p2,...,pn,且pi+p2+...+pn = 1。如果将这n 个程序按 i1,i2,....,...原创 2018-06-02 18:20:30 · 9318 阅读 · 0 评论 -
快速排序
#include <iostream>#include <cstdio>void QuickSort(int a[],int start,int end){ int i,j,flag; if(start<end){ i = start,j = end; /*将排序初始节点以及末尾节点下标记录*/ ...原创 2017-12-05 18:16:42 · 166 阅读 · 0 评论 -
字符串匹配 -kmp算法
解决对象:给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题。 1 暴力求解法: 暴力匹配的时间复杂度为 O(nm),其中 n 为 S 的长度,m 为 P 的长度。很明显,这样的时间复杂度很难满足我们的需求。代码:int naiveStringSearch(string S, string P){ int i ...原创 2018-07-18 20:08:47 · 1822 阅读 · 0 评论 -
回溯法-子集树-装载问题
问题描述:有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量是wi,且不能超过轮船总载重量。即Σwi<=c1+c2。若集装箱能全部装载则输出YES, 否则输出为NO,n为0时结束输入。问题模型:解子集空间树。解决思路:首先将第一艘轮船尽可能的装满。然后将剩余的集装箱装上第二艘轮船。将第一艘轮船尽可能的装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和最接近...原创 2018-06-19 18:57:34 · 2503 阅读 · 4 评论 -
回溯法-排列树-n皇后问题
N皇后问题: 在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。思路:首先要确定皇后间位置合法的检验表达式。((abs(i-k)==abs(x[i]-x[k]))||x[i]==x[k]) //x[i]表示i皇后在第x[i]列;abs(i-k)==abs(x[i]-x[k])表示在两皇后在同一对角线上。然后每第i皇后在第i行有n个...原创 2018-06-10 18:54:24 · 4046 阅读 · 1 评论 -
回溯法-排列树-旅行商(TSP)问题
题意:有一个推销员,要到n个城市推销商品,他要找出一个包含所有n个城市的具有最短路程的环路。(最后回到原来的城市)示例:从城市1出发经过所有城市后回到城市1,要使总路程最短。 代码:/** @回溯-旅行商(TSP)问题*/#include<iostream>#include<algorithm>#define MAX 100using namespace ...原创 2018-06-09 18:25:13 · 16808 阅读 · 16 评论 -
分支限界法-优先队列-单源最短路径
算法思想:分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时...原创 2018-06-23 11:01:55 · 16159 阅读 · 4 评论 -
回溯法-排列树-m图着色问题
代码 :/** @回溯法-m图着色问题*/#include<iostream>#include<algorithm>#define MAX 100using namespace std;int n; //图的顶点数int m; //颜色数量int x[MAX]; //记录顶点的着色情况long ...原创 2018-06-13 22:14:45 · 3151 阅读 · 0 评论 -
回溯算法-子集树-0-1背包问题
0-1背包: 即每种物品只有2 种选择,分别为:装入背包或不装入背包,物品数和背包容量已给定,计算装入背包物品的最大价值和最优装入方案,用回溯法搜索子集树的算法进行求解。对此模型我们刚好建立二叉树( 此处为完全二叉树)。对应的叶子节点数为: n! (n为顶点数)。 解子集树: 约束函数: cw+w[i]*x[i]<=c。(cw:当前背包重量; w[i]*x[i]选中背包重量; c:背包容...原创 2018-06-06 16:15:52 · 5672 阅读 · 0 评论 -
贪心算法-会场安排问题
贪心算法特征:1:贪心选择性质;2:最优子结构:('动态规划'),具体依情况而定。贪心算法性质: 虽不能对所有问题都能得到整体最优解,但是对于范围较广的许多问题得到其整体最优解。如‘単源最短路径', '最小生成树' 等。贪心算法是对许多整体最优解的近似解。贪心算法思想:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到算法中的某一步不能再继续前进时,算法停止。(算法局...原创 2018-05-29 13:28:18 · 5421 阅读 · 5 评论 -
回溯算法-排列树-批处理作业调度
回溯算法:它可以系统的搜索一个问题的所有解或任意解。它的关键点在于处理空间树问题。回溯思想: 在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。 若用回溯法求问题的所有解时,要回...原创 2018-06-05 12:15:10 · 4173 阅读 · 0 评论 -
动态规划-挖地雷
/** @挖地雷(动态规划) @author 狂热的coder*/#include<iostream>#include<algorithm>#include<cstdlib>#include<cstring>#define NUM_SIZE 50using namespace std;void clostDist(int...原创 2018-05-16 13:15:08 · 1108 阅读 · 0 评论 -
贪心算法-磁盘文件最优存储问题
贪心算法通常是对某一值进行排序,然后再采取贪心策略进行求解。此问题贪心角度不同以往。它的排序不是严格单调排列,而是将相应值的分布从中间往两边依次减少排列。题意:设磁盘上有n个文件,f1,f2,…,fn,,每个文件占磁盘上1个磁道。这n个文件的检索概率分别是p1,p2,…,pn,且p1+p2+…+pn =1。磁头从当前磁道移到被检信息磁道所需的时间可用这2个磁道之间的径向距离来度量。如果文件pi...原创 2018-06-02 19:34:41 · 12730 阅读 · 7 评论 -
AVL树(平衡树)
. 概述AVL树是最早提出的自平衡二叉树,在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis。AVL树种查找、插入和删除在平均和最坏情况下都是O(log n),增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。本文介绍了AVL树的设计思想和基本操作。2. 基本术语有四种原创 2017-12-14 21:39:58 · 568 阅读 · 0 评论 -
多源最短路径(Floyed算法)
#include #include #define MAX 63355#define N 20typedef char Elemtype;typedef int Status;typedef struct Graph{ Elemtype vexs[N]; //顶点 Status arcs[N][N]; //边的权值 int V,E; //顶点原创 2017-12-06 12:35:11 · 1281 阅读 · 0 评论 -
二叉树的非递归实现前中后序遍历
#include #include #include #include #include #define maxn 100using namespace std;typedef struct BiNode{ int data; struct BiNode *lchild,*rchild;}BiNode,*BiTree; typedef struct{ Bi原创 2017-11-08 17:46:05 · 276 阅读 · 0 评论 -
线性链表的是否带头结点问题
简单线性链表的是否带头结点问题,花了点时间去整理了下。下面通过代码来解释下://链表带头结点与不带头结点的插入建立问题: //两者区别: //1、 不带头结点的单链表对于第一个节点的操作与其他节点不一样,需要特殊处理,// 这增加了程序的复杂性和出现bug的机会,因此,通常// 在单链表的开始结点之前附设一个头结点。//原创 2017-08-27 12:03:09 · 722 阅读 · 0 评论 -
归并排序(逆序对的解决)
逆序对最典型的方法就是树状数组,但是还有一种方法就是归并排序: 实际上归并排序的交换次数就是这个数组的逆序对个数,为什么呢?归并排序是将数列a[l,h]分成两半a[l,mid]和a[mid+1,h]分别进行归并排序,然后再将这两半合并起来。在合并的过程中(设l<=i<=mid,mid+1<=j<=h),当a[i]<=a[j]时,并不产生逆序数;当a[...原创 2017-10-22 13:19:17 · 1673 阅读 · 3 评论 -
STL容器_优先队列
直接贴码,看注释就行#include#include#include#include//采用头文件"functional"内定义优先级://piority_queue,greater与less >(s2,s3);#include using namespace std;typedef struct{ bool operator()(int &a,int原创 2017-09-06 18:59:16 · 234 阅读 · 0 评论 -
图 - 多源最短路 - Floyd
题目:http://pta.patest.cnPTA - 数据结构与算法题目集(中文) - 5-8ps:哈利·波特要考试了,他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例如ahah可以将老鼠变成猫。另外,如果想把猫变成鱼,可以通过念一个直接魔咒lalala,也可原创 2017-09-15 15:57:29 · 366 阅读 · 0 评论 -
简单栈实现背包问题
这篇文章我知道很渣,写出来只是做个记号,下次再去完善。/*栈实现简单背包问题 */#include#include #include #include #include using namespace std;int main(){ int sum,k,i = 0; stack s; scanf("%d",&sum);原创 2017-09-20 20:46:13 · 3472 阅读 · 0 评论 -
STL中(queue)用法简单运用
注:这部分为网上贴的;1、创建(1)queue() 默认的构造函数,创建一个空的 queue 对象。queue q;//使用默认的双端队列为底层容器创建了一个空的queue队列对象q,数据元素为int类型(2)queue(const queue&) 复制构造函数,用一个queue对象创建新的queue对象。//queue > q1;queue > q原创 2017-09-05 20:11:23 · 316 阅读 · 0 评论 -
实现队列基本功能
在学习数据结构队列基本操作的时候,书上的都是伪码且限提供算法思想。能够看懂并实现书上的代码没必要往下看了。写这篇文章的目的是将自己对队列基本操作做个总结,也给那些正在学习数据结构的人提供点便利。欢迎一起来学习数据结构与算法。源代码如下(实现队列构建,读入,判空,删除,添加。。。。)#include#include#include using namespace原创 2017-08-28 21:59:40 · 747 阅读 · 0 评论 -
线索化二叉树(中序)
#include #include typedef char ElemType;typedef enum {Link, Thread} PointerTag; //Link = 0, Thread = 1; typedef struct BiThrNode{ char data; struct BiThrNode *lchild, *rchild; PointerTag原创 2017-11-01 20:07:14 · 376 阅读 · 0 评论 -
树的孩子兄弟表示法及遍历操作
代码贴上: /* @孩子兄弟表示法建立的一般树*/#include<iostream>#include <cstdio>#include <cstdlib>#include <cstring>#define OK 1#define ERROR 0#define FALSE 0#define TRUE 1#define OVER...原创 2017-11-11 17:12:37 · 15878 阅读 · 0 评论 -
二叉搜索树
#include <iostream>#include <cstdio>#include <cstdlib>using namespace std;typedef struct BiThrNode{ int data; struct BiThrNode *lchild, *rchild;}BiThrNode,*BiThrTree;v...原创 2017-10-30 09:25:35 · 251 阅读 · 1 评论