![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
动起来才能健康快乐
这个作者很懒,什么都没留下…
展开
-
求组合数cnm
传统算法cnm=n!/m!/(n-m)!,当n比较大时,会溢出下面的方法可以避免LL cnm(LL n,LL m){ LL f=1; LL i,j=1; for(i=n-m+1;i<=n;i++) { f=f*i; if(f%j==0) { f=f/j; j++; } }...原创 2021-10-16 10:37:06 · 2415 阅读 · 0 评论 -
c++11以前中的hash_map
自己杜撰一个题目:对于一组数据,存在数组中a,现在输入多行,每行两个整数m,n要求输出每个a【m,n】中最大值。每次输入一对m,n就在hash_map中查找是否存在,若存在,则直接输出,若不错在则去a中查找,查找过程中产生的中间结果都加以记录。这样后面若遇到查过的,则不用再查了。————————————————#include <ext/hash_map> #include<bits/stdc++.h>using namespace std;//usi..原创 2021-10-09 20:09:55 · 238 阅读 · 0 评论 -
C++11中的unordered_map,底层基于hash table实现
在C++11中,有了基于哈希表的unordered_map和unordered_set,可以直接使用。但是,c、c++程序竞赛似乎不支持c++11.万能头文件#include<bits/stdc++.h>using namespace std;怎样使得dev-cpp支持c++ 11呢?(96条消息) 让devcpp支持c++11_速趴赛亚金的博客-CSDN博客1.选择菜单栏的--工具,打开编译选项。2.在编译项中勾选“编译时加入以下命令”,并加入命令 -std=c+.原创 2021-10-09 17:13:19 · 517 阅读 · 0 评论 -
C++关于字符串的读入操作
C++11中不允许使用gets()得到一行字符。若使用字符数组,C++ string的优秀功能不能使用。现找到使用getline的方法可以用C++11得到一行字符。特记之。一、string1、读入不能包含空白符的字符串string s;cin>>s;读入字符串,遇到空白符、回车符等结束。2、读入一行,以回车符结束string s; getline(cin,s);//s中不包含回车符 cout<<s;3、先读入一个整数n,再读...原创 2021-10-04 20:44:49 · 3592 阅读 · 0 评论 -
C++-重载运算符以利用sort函数对复杂类型(结构体类型)排序
在使用c++的sort函数时,其函数原型为:①两个参数的形式template <class RandomAccessIterator>void sort ( RandomAccessIterator first, RandomAccessIterator last );②三个参数的形式template <class RandomAccessIterator, class Compare> void sort ( RandomAccessIterator f..原创 2021-09-16 08:50:45 · 1024 阅读 · 0 评论 -
【转】C++ 万能头文件
#include<bits/stdc++.h>//包含了目前c++所包含的所有头文件!!!!using namespace std;int main(){ return 0;}转载 2021-09-16 08:39:35 · 1675 阅读 · 0 评论 -
C++的find_if函数
find_if函数可以查询复杂数据类型,比如结构体。///ttt.cpp//c++编译器下通过#include<stdio.h>#include<stdlib.h>#include<vector>#include<algorithm>#include<iostream>using namespace std;struct node{ int data; int count;};node x...原创 2021-09-13 20:56:35 · 2819 阅读 · 0 评论 -
C++中利用vector构建结构体类型的堆
怎样从vector中构建大顶堆或者小顶堆,网上多见以int型为例。但现实中复杂数据比较多,多用结构体表示。本文演示如何从结构体类型的vector构建堆。///ttt.cpp//c++编译器下通过#include<stdio.h>#include<stdlib.h>#include<vector>#include<algorithm>#include<iostream>using namespace std;st...原创 2021-09-13 17:00:49 · 538 阅读 · 0 评论 -
Hdu2062--01背包-动态规划法-递归-记忆化搜索
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2602从前到后推导参考:https://blog.csdn.net/tobe_numberone/article/details/89430223#include<string.h>#include <iostream>#include <algorithm>using namespace std;//http://acm.hdu.edu.cn/show.原创 2020-12-01 16:32:48 · 140 阅读 · 0 评论 -
Hdu2062--01背包-动态规划法
方法1:#include <stdio.h>#include <string.h>int dp[1001][1001];int max(int x,int y){ return (x>y?x:y);}int main(void){ int t,n,v,i,j; int val[1001],vol[1001]; scanf("%d",&t); while(t--) { scanf("%d原创 2020-12-01 16:22:08 · 153 阅读 · 0 评论 -
回溯法解决01背包-非递归算法-效率低
http://acm.zua.edu.cn/problem.php?cid=1025&pid=24解题思路:物体的个数为Num,背包的体积限制为Volum物品的体积是v[1]、v[2]、...、v[Num]物品的价值是w[1]、w[2]、...w[3]找出一个物品的组合,使得在不超过体积Volum的条件下,价值最大。用回溯法设置一个栈,解空间是一维数组。从初始空间开始,放入栈1、当栈不空时,取出栈顶元素,2、根据是否选取下一个物品,生成两个新的结点,放入栈顶.原创 2020-12-01 16:20:06 · 521 阅读 · 0 评论 -
回溯法解决01背包问题--效率低-适用于小规模数据问题
http://acm.zua.edu.cn/problem.php?cid=1025&pid=24解题思路:物体的个数为Num,背包的体积限制为Volum物品的体积是v[1]、v[2]、...、v[Num]物品的价值是w[1]、w[2]、...w[3]找出一个物品的组合,使得在不超过体积Volum的条件下,价值最大。用回溯法Num个物品分别编号1、2、...、Num对每个物品都有取或者不取两种情况。int Max;//最大价值int Volum;//背包容量.原创 2020-12-01 16:14:18 · 363 阅读 · 0 评论 -
利用next_permutation求解01背包问题--效率低,适用小数据量问题
http://acm.zua.edu.cn/problem.php?cid=1025&pid=24下面代码能解决上面问题,是由于后台测试数据量少。还是掌握动态规划为好#include<stdio.h>#include<algorithm> #include<iostream> using namespace std; #include "string.h"#include "stdio.h" int n,w;struct nod.原创 2020-12-01 16:06:08 · 132 阅读 · 0 评论 -
图--关键路径算法
#include"string.h" #include<vector>#include<iostream>#include<stack>using namespace std;#define max_vertex_num 20struct ArcNode//弧(边)结点{int adjvex;//该弧所指向的顶点的位置int weight;//权重ArcNode *nextarc;//指向下一条弧的指针};struct VexNode//表头结..原创 2020-11-24 21:35:13 · 338 阅读 · 0 评论 -
图-拓扑排序算法
#include<iostream>#include<stack>using namespace std;#define max_vertex_num 20struct ArcNode//弧(边)结点{int adjvex;//该弧所指向的顶点的位置ArcNode *nextarc;//指向下一条弧的指针};struct VexNode//表头结点,或者说弧头结点{ char vex[50];// ArcNode *firstarc;//第一条弧指针};..原创 2020-11-24 21:34:01 · 202 阅读 · 0 评论 -
图的最短路径算法-Floyd算法
#include"string.h"#include<iostream>#include<vector>using namespace std;#define max_vertex_num 20//顶点最大个数,假定不超过20个。//采用邻接矩阵作为图的存储结构int vex_num;//顶点的实际个数char v[max_vertex_num][20];//存储顶点的数组,假设顶点名字不超过20字符int arcs[max_vertex_num][max_ve.原创 2020-11-24 21:32:47 · 140 阅读 · 0 评论 -
图的最短路径算法-Dijkstra算法
// Dijkstra_C.cpp : Defines the entry point for the console application.//#include<string.h> #include<iostream>#include<vector>using namespace std;#define max_vertex_num 20//顶点最大个数,假定不超过20个。//采用邻接矩阵作为图的存储结构int vex_num;//顶点的实际个.原创 2020-11-24 21:31:22 · 195 阅读 · 0 评论 -
图的最小生成树算法-Kruscal算法-并查集-然而未采用堆排序技巧-效率依然低
#include <iostream>using namespace std;#define max_vertex_num 20int vex_num;//顶点个数char v[max_vertex_num];//存储顶点int arcs[max_vertex_num][max_vertex_num];//存储权值void Initialization();//图的初始化int LocateVex(char u);//定位顶点u,返回顶点在一维数组v中的下标void I..原创 2020-11-24 21:30:04 · 92 阅读 · 0 评论 -
图的最小生成树算法-Kruscal算法-笨方法
知识点:1、图的邻接矩阵表示法;2、Kruscal算法,不采用并查集。采用一维数组,合并集合时,把一个集合中的标签全部改成另一个集合的标签,顺序扫描,效率低。// MiniSpanTree_Kruskal.cpp//基于邻接矩阵的Kruscal算法//逐条边的加入,笨办法 #include <iostream>using namespace std;#define max_vertex_num 20int vex_num;//顶点个数char v[max_ve.原创 2020-11-24 21:27:50 · 281 阅读 · 0 评论 -
图的最小生成树算法-Prim算法
知识点:1、图的邻接矩阵表示法;2、Prim算法实现// MiniCostSpanTree_Prim.cpp //基于图的邻接矩阵表示法//图的最小生成树Prim算法//逐个顶点的找出最小生成树 #include <iostream>using namespace std;#define max_vertex_num 20int vex_num;//顶点个数char v[max_vertex_num];//存储顶点int arcs[max_vertex_nu.原创 2020-11-24 21:24:18 · 273 阅读 · 0 评论 -
图的邻接表表示法及深度优先、广度优先遍历算法
知识点:1、图的邻接表表示法;2、图的深度优先算法;3、图的广度优先算法。//图的邻接表表示法//基于邻接表表示法的图的遍历 #include "string.h" #include<stdlib.h>#include<queue> #include<iostream>using namespace std;typedef struct ArcNode{ int adjvex;//邻接点 double weight;//边的信息 A原创 2020-11-24 21:22:01 · 1041 阅读 · 0 评论 -
图的邻接矩阵表示法及深度优先、广度优先遍历算法
知识点:1、图的邻接矩阵表示法;2、图的深度优先遍历算法;3、图的广度优先遍历算法。//图的邻接矩阵表示法//基于邻接矩阵表示法的图的遍历 #include "string.h" #include<stdlib.h>#include<queue> #include<iostream>using namespace std;struct MGraph{ char* vexs[100];//存储顶点信息,0下标处不存储数据 doub.原创 2020-11-24 21:20:13 · 1535 阅读 · 0 评论 -
对一棵二叉树进行哈夫曼编码--递归法--回溯法
完全实现构造哈夫曼树、进行哈夫曼编码是一个浩大的工程。对于初学者,可能好久都不能把哈夫曼树构造出来。下面我们手工构造一棵基于二叉链表的树,且假定其就是哈夫曼树。然后,我们采用自上而下递归的方法对其进行编码。直接上代码啦。#include <string>#include <iostream>using namespace std;struct node{//树的结点结构。二叉链表表示法 char data; node *lchild,*rchild;原创 2020-11-17 18:34:15 · 915 阅读 · 0 评论 -
邱同学写的huffman编码程序
学过了哈夫曼编码知识点,邱同学就给我发来了相关程序,看起来还不错。贴出来,以飨大家。原创 2020-11-17 18:27:58 · 168 阅读 · 0 评论 -
二叉树的层次遍历-基于递归方法
在前面介绍了二叉树的层次遍历,是用非递归算法实现的。本文,我们基于递归算法实现。#include<queue>#include<iostream>using namespace std;struct node{//树的结点结构。二叉链表表示法 char data; node *lchild,*rchild;}; void layerTraverseRecurve(queue<node*> &q) {//递归部分 if(q.empt原创 2020-11-11 08:50:58 · 1612 阅读 · 1 评论 -
二叉树的层次遍历
本篇主要介绍二叉树的层次遍历算法。要点如下:1、采用二叉链表存储结构。2、手工构建一棵简单的静态二叉树。3、基于stl的队列queue构建层次遍历算法。一、测试用例中用到的二叉树二、定义二叉链表的结点类型struct node{//树的结点结构。二叉链表表示法 char data; node *lchild,*rchild;};三、构建静态二叉树为了将精力集中到二叉树的层次遍历上,我们构建一棵静态的二叉树。int main( ){ node a,b,原创 2020-11-11 08:43:35 · 795 阅读 · 0 评论 -
关于kmp字符串模式匹配算法中next函数修正值的说明
我们采用的教材是严蔚敏老师的数据结构教材。无论是旧版还是新版,关于kmp的部分是相同的。课本关于kmp的说明还算详细,仔细阅读不难看懂。问题在于,在实现get_next算法时,所使用的符号和描述方法根理论部分不一样!!!就好比你介绍的是用普通锅蒸米饭,举例的时候却用了电饭煲。下面我就不多言了,把我的get_next函数和get_nextval函数的代码贴过来。由于本人水平有限,如果发现错误,请留言哦。#include<iostream>#include<vect原创 2020-10-22 21:58:16 · 1728 阅读 · 2 评论 -
csdn博客不能内嵌mp4解决方案-转换成gif动图
有些算法,用伪代码描述起来也不太容易理解,如果能用动画或者视频的形式,效果会更好。但是,csdn的博客中不能内嵌mp4,只能上传图片。而gif是动图,可以显示多帧。下面我们介绍怎样把动态演示做成gif动图。1、可以在ppt上用多张ppt形成动态演示过程;2、播放ppt时,用录屏软件录下来,如傲软录屏等,存成mp4文件3、把mp4文件用格式工厂转换成gif动图4、把gif动图嵌入到csdn博客中。...原创 2020-09-20 18:33:21 · 205 阅读 · 0 评论 -
关于离散数学对后续课程的支撑--我的一点看法
关于离散数学:1、数理逻辑一章是传统人工智能的基础,比如推理,由发热、流鼻涕、吐黄痰等推断是感冒,然后开药,是传统专家系统的基础。但是这一分支在现在不流行了,被铺天盖地的机器学习掩盖了。有一个佳作prolog的人工智能语言,是搞推理的。https://blog.csdn.net/fdbvm/article/details/849379702、集合,比较容易理解,就是数学上的理解,集合的笛卡尔积这部分在数据库原理课程上有应用,是用sql语句查询的理论基础;3、图论和树,是数据结构中树和图的基础,涉原创 2020-09-20 09:48:39 · 1723 阅读 · 0 评论 -
约瑟夫环问题-链表-删头添尾法
一、问题描述 有15个人围成一圈,顺序从1到15编号。从第一个人开始报数,凡报到n的人退出圈子。用C语言写出程序,输入n(n>1)的值,输出最后留在圈子里的人的编号。二、算法描述void main( ){构建链表 L把1-15这15个数逐个插入到 L 的尾部输入nWhile(链表 L 中元素多于一个){for(i=1;i<n;i++){取L第一个元素 放到L的尾部;删除L第一个元素}输出L第一个元素删除L第一个元素...原创 2020-09-20 09:14:19 · 215 阅读 · 0 评论 -
约瑟夫环问题-顺序表-删头添尾法
一、问题描述 有15个人围成一圈,顺序从1到15编号。从第一个人开始报数,凡报到n的人退出圈子。用C语言写出程序,输入n(n>1)的值,输出最后留在圈子里的人的编号。二、算法描述void main( ){构建顺序表 L把1-15这15个数逐个插入到 L 的尾部输入nWhile(顺序表 L 中元素多于一个){for(i=1;i<n;i++){取L[0]放到L的尾部;删除L[0]}输出L[0]删除L[0];}...原创 2020-09-20 09:14:14 · 1012 阅读 · 0 评论 -
DS005数据结构-单链表实现原理探究-针对严蔚敏老师教材的示例
一、顺序表那么好,为什么还需要链表顺序表的缺点:•顺序表的除了表尾外其他位置插入和删除元素需要移动其他元素,效率低;平均时间复杂度为O(n)。•顺序表需要连续的空间,当数据量比较大时,如果没有足够的连续空间,顺序表失效!!为解决该缺点,设计了链表。链表的插入和删除不需要移动其他元素,插入删除效率高;但失去了随机存取的优势。另:这是一种颠覆性创新,另起炉灶,不在顺序存储的框架内修修补补!!单链表是最简单的链式结构,由此发散、引申,可以构造更复杂的结构,比如树、图。基础不..原创 2020-09-20 03:18:04 · 405 阅读 · 0 评论 -
DS007-二叉树-顺序表表示法-先根-中根-后根遍历
本篇介绍二叉树的顺序表表示法,及其先、中、后根遍历。以下面这棵二叉树为例。对应的顺序存储结构为: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ..原创 2020-09-16 06:20:26 · 1049 阅读 · 0 评论 -
DS007-二叉树-二叉链表表示法-先根-中根-后根遍历
本篇介绍二叉树的二叉链表表示法,及其先、中、后根遍历。以下面这棵二叉树为例。#include "stdafx.h"#include<iostream> using namespace std;template<typename T> class tree{//基于二叉链表的二叉树 struct node { T data; node *lchild; node *rchild; }; node *root; node a, b.原创 2020-09-16 06:19:50 · 412 阅读 · 0 评论 -
DS007-二叉树-伪指针表示法-先根-中根-后根遍历
本篇介绍二叉树的顺序表表示法,及其先、中、后根遍历。以下面这棵二叉树为例。对应的伪指针存储结构为:整体是一个顺序表,每个元素是一个结构体,包含本身元素,左孩子的下标,右孩子的下标。也可以包含双亲结点的下标,此例没有包含。参考代码如下:#include "stdafx.h"#include<iostream> using namespace std;template<typename T>class tree{//基于伪指针的二...原创 2020-09-16 06:18:39 · 749 阅读 · 0 评论 -
DS007-队列的原理-操作受限的线性表-queue的使用
本篇介绍基于顺序表的队列和基于单链表的队列的原理和实现。最后介绍一下C++ STL 模板库 queue的使用。一、什么是队列有些应用,处理的对象是线性关系,用线性表存储,但这些应用又有自己的特点,在一端进行插入操作,在另一端进行删除操作,中间不允许插入删除就像生活中的队列一样。插入数据的一端称为队头,删除数据的一端称为队尾。有两种存储方式,顺序的和链式的,那么队列也有两类实现方式,一类是基于顺序表的,一类是基于链表的。我们下面介绍基于顺序表的循环队列,基于单链表的队列原创 2020-09-15 11:40:54 · 130 阅读 · 1 评论 -
DS006-栈的原理-操作受限的线性表-C++ STL 栈模板stack
本篇先介绍顺序栈、链栈的原理,然后介绍C++STL栈模板的简单用法。原创 2020-09-14 06:21:10 · 183 阅读 · 0 评论 -
DS005-数据结构-双向循环链表一个实现--C++模板类实现
用C++的类模板实现了一个双向循环链表的部分功能,如插入数据、删除数据、得到第i个元素的地址,查找元素x是否存着等#include <iostream>using namespace std;template<typename T>class list{//双向循环链表 struct node { T data;原创 2020-09-13 18:42:53 · 231 阅读 · 0 评论 -
DS005-C++模板类实现-单向循环链表
当单链表的最后一个结点的next域存储头结点的地址时,就构成了单向循环链表。实现时需要注意的地方:1、初始化时,单向循环链表中只有头结点,next域指向自身;2、判断p是否为尾结点的条件是:p->next是否和头结点head相等#include "stdafx.h"#include <iostream>using namespace std;template<typename T>class list{//单向循环链表 struct n.原创 2020-09-13 18:39:00 · 182 阅读 · 0 评论 -
DS005数据结构-单链表实现原理探究-C++模板类实现
顺序表在插入和删除数据时需要移动其他数据,效率低。链表可以克服该缺点。本篇介绍单链表的基本原理。原创 2020-09-13 18:27:47 · 246 阅读 · 1 评论