算法
boat_7
世人皆被命运安排,而我安排命运
展开
-
常用STL笔记2
集合集合是数学中的一个基本概念,通俗地理解,集合是由一些不重复的数据组成的。比如{1,2,3}就是一个有1,2,3三个元素的集合在c++中我们常用的集合是setc++中直接构造一个set的语句为:sets。这样我们定义了一个名为s的,储存T类型的集合,其中T是集合要存储的数据类型。初始的时候s是空集合。插入元素c++中用insert()函数向集合中插入一个新的元素。注意如果集合中已经存在了某个元素,再次插入不会产生任何效果,集合是不会出现重复元素的判断元素是否存在c++中如果你想知道某个元素是原创 2021-02-23 20:55:17 · 59 阅读 · 0 评论 -
常用STL笔记1(c++)
常用STL动态数组引用库构建动态数组插入元素获取长度并且访问元素修改元素删除元素清空应用用动态数组储存自定义数据构造函数动态数组有些时候想开一个数组,但是却不知道应该开多大的数组合适,因为我们需要用到的数组可能会根据情况变动。这时候我们就需要用到动态数组。所谓动态数组,也就是不定长数组,数组的长度是可以根据我们的需要动态改变的。动态数组的实现射表,栈,队列等数据结构和排序,查找等算法。我们可以很方便的调用标准库来减少我们的代码量c++中动态数组写作vector引用库c++中vector的实现在一个原创 2021-02-23 16:25:53 · 55 阅读 · 0 评论 -
枚举笔记
枚举枚举就是根据提出的问题,列出该问题的所有可能的解,并在逐一列出的过程中,检测每个可能解是否是问题的真正解,如果是就采纳这个解,如果不是就判断下一个。枚举法一般比较直观,容易理解,但由于要检测所有的可能解,由此进行效率低能够用枚举法解决的问题往往是最简单的一类题目,这种题目具有以下特点:1.解枚举范围是有穷的2.检测条件是确定的先来个简单的问题某人说:“我的年龄是个两位数,我比儿子大27岁,如果把我的年龄的两位数字交换位置,刚好死我儿子的年龄“请你计算:某人的年龄有多少种可能情况。我们来原创 2021-02-23 15:25:19 · 57 阅读 · 0 评论 -
树的笔记
树在介绍树之前,我们先介绍两个图的概念路径在无向图G中,如果从顶点vi出发,沿着图中的边经过一些顶点vp1,vp2,vpm到达顶点vj,则称顶点序列(vi,vp1,…,vpm,vj)为从顶点vj到顶点vj的一条路径(path),其中(vi,vp1),(vp1,vp2),…(vpm,vj)均为G中的边,如果G是有向图,则(vi,vp1>,<vp1,vp2>,…<vpm,vj)均为G中的有向边。路径中边的数量称为路径长度,如果路径中的顶点均不重复,则称这条路径为简单路径,如果路径原创 2021-02-16 18:23:45 · 155 阅读 · 0 评论 -
图的遍历笔记4
图的遍历邻接表的链表实现在实现邻接表时,我们使用vector这个结构来存储从每个顶点连出的所以边,但是,由于vector的常数较大,对于某些时间限制较为严格的情境,使用vector存储邻接表会导致程序有超时的风险因此,我们需要一种更为高效的存储所以从一个顶点连出的所以边的方法——基于链表的邻接表什么是链表我们把链表想象成火车,火车头便是链表的表头,每节车厢就是链表的元素,车厢里载的人和物就是元素的数据库,连接车厢的部件就是元素的指针,由此,我们可以得出链表的一个特点,元素之间前后依赖,串联而成还原创 2021-02-16 17:35:25 · 57 阅读 · 0 评论 -
图的遍历笔记3
图的遍历在社交网络中,不能单纯的用0,1来表示两个人是否为朋友,当两个人是朋友时,有可能是很好的朋友,也可能是一般的朋友,还有可能是不熟悉的朋友我们用一个数值来表示两个人之间的朋友关系强弱,两个人的朋友关系越强,对应的值就越大,而这个值就是两人在图中对应的边的权值,简称边权,对应的图我们称之为带权图邻接矩阵存储用邻接矩阵存储带权图和之前的方法一样,用G[a][b]来表示a和b之间的边权(我们需要用一个数值来表示边的不存在,如0)。同样,这个矩阵依然是对称的邻接表存储用邻接表存储带权图和之前的实原创 2021-02-09 22:07:54 · 58 阅读 · 0 评论 -
图的遍历笔记2
图的遍历图的存储方式邻接矩阵例题邻接表例题图的存储方式邻接矩阵所谓邻接矩阵存储结构就是每个顶点用一个一维数组存储边的信息,这样所以点合起来就是用矩阵表示图中各顶点之间的邻接关系。所谓矩阵其实就是二维数组在邻接矩阵上,我们可以直观的看出两个顶点之间是否有边,并且很容易求出每个顶点的度,入度和出度顶点的出度,即为邻接矩阵上点对应行上所以值的总和顶点的入度,即为点对应列上所以值的总和用邻接矩阵来构建图需要如下几步,我们可以用二维数组G来表示一个图初始化可以借助memset来快速的将一个数组中的所原创 2021-02-06 20:36:13 · 73 阅读 · 0 评论 -
图的遍历笔记1
图图的概念有向图和无向图形式化定义图度度的性质判断序列是否可图图的概念什么是图?图是由一系列顶点和若干连结顶点集合内两个顶点的边组成的数据结构。有向图和无向图如果用边来表示好友关系,对于微信这种双向关注的社交网络没有问题,但是对于微博这种单向的关注如何表示?于是引出了两个新的概念:有向边和无向边简而言之,一条有向边必然是从一个点指向另一个点,而相反方向的边在有向图中则不一定存在,而有的时候我们并不在意构成一条边的两个顶点具体谁先谁后,这样得到的一条边就是无向边。就像在微信中,A是B的好友,那B原创 2021-02-02 11:24:46 · 92 阅读 · 0 评论 -
广度优先搜索笔记
广度优先搜索用bfs解决迷宫问题例题2广度优先搜索又称为宽度优先搜索,简称bfs,与深度优先搜索不同的是,广度优先搜索会先将与起始点距离较近的点搜索完毕,再继续搜索较远的点,而深搜却是沿着一个分支搜到最后bfs从起点开始,优先搜索离起点最近的点,然后由这个最近的点扩展其他稍近的点,这样一层一层的扩展,就像水波扩散一样bfs需要借助队列实现:1.初始的时候把起点放到队列中,并标记起点访问2.如果队列不为空,从队列中取出一个元素x,否则算法结束3.访问和x相连的所有点v,如果v没有被访问,把v入队,原创 2021-02-01 11:09:16 · 74 阅读 · 0 评论 -
深搜的剪枝策略笔记
深搜的剪枝策略最优性剪枝迷宫问题2重复性剪枝奇偶性剪枝搜索的过程最后会生成一颗搜索树剪枝,顾名思义,就是通过一些判断,砍掉搜索树上不必要的子树,有时候,我们会发现某个结点对应的子树的状态都不是我们要的结果,那么我们没有必要对这个分支进行搜索,砍掉这个子树,就是剪枝最优性剪枝对于求最优解的一类问题,通常可以用最优性剪枝,比如在求解迷宫最短路的时候,如果发现当前的步数已经超过了当前最优解,那么当前状态的搜索都是多余的,因为这样搜索下去永远都搜不到更优的解,通过这样的剪枝,可以省去大量多余的计算此外,在原创 2021-01-28 11:31:30 · 121 阅读 · 0 评论 -
深度优先搜索笔记
深度优先搜索迷宫问题深度优先搜索按照深度优先的方式进行搜索,通俗点就是“一条路走到黑”。注意,这里的搜索不是指的我们平时在文件或者网络上查找的某些信息,搜索是一种穷举的方式,把所以可行的方案都列举出来,不断去尝试,直到找到问题的解。深度优先搜索和递归的区别是:深度优先搜索是一种算法,注重的是思想;递归是一种基于编程语言的实现方式。深度优先搜索可以用递归实现,也就是说递归是我们用计算机编程语言来实现深度优先搜索这个算法的手段迷宫问题字符S表示起点,字符T表示终点,字符*表示墙壁,字符.表示平地。你需要原创 2021-01-27 13:39:09 · 110 阅读 · 0 评论 -
栈和队列笔记2
栈和队列栈栈的定义栈的特性举例队列队列的定义队列的特点举例栈栈的定义也称为堆栈,是一种先进后出,删除和插入都在栈顶操作的线性表栈的特性栈的特性:先进后出,后进先出最先放入栈的内容最后被拿出来,最后放入栈的内容最先被拿出来举例解密回文#include <stdio.h>#include <string.h>int main(){ char a[101], s[101]; int len,mid,next,top; gets(a); len=strlen(原创 2021-01-25 23:09:12 · 72 阅读 · 0 评论 -
栈和队列笔记1
栈和堆栈栈的用途模式识别队列队列的用途栈栈的用途1.可以用栈作为辅助,实现深度优先搜索或者将递归转换成while循环2.递归本身就是相当于把函数本身一层一层加到操作系统的内存栈上3.入栈操作相当于递归调用自身,出栈操作相当于递归返回模式识别1.通过栈实现特殊顺序的读取由于栈具有后进先出的特性,如需实现任何特定顺序的读取操作,往往可以借助两个栈互相“倾倒”来实现特定顺序。另一个栈作为辅助2.有一类问题有这样的特性:当前节点的解依赖后驱节点对于某个当前节点,如果不能获知后驱节点,就无法得到有原创 2021-01-23 19:08:59 · 104 阅读 · 0 评论 -
2021-01-22
每日一题1程序实现先输入一个正整数 n不作任何处理;在它的左边加上一个正整数,但该正整数不能超过原数的一半;加上数后,继续按此规则进行处理,直到不能再加正整数为止。程序实现#include <iostream>using namespace std;int n;int f[1001];//存每一位数的种类int main(){ cin>>n; for(int i=1;i<=n;i++){ //1-n的递推 for(int j=原创 2021-01-22 19:44:25 · 156 阅读 · 0 评论 -
递归笔记
递归裴波那契数列例子递归的功能是什么?反复调用自己什么时候应该结束这个递归,它的边界条件是什么?递归需要关系和出口假如我们有1,2,3…n个数计为f(1),f(2),…f(n)可以表示为f(n)=f(n-1)+1 关系f(1)=1 出口如果只有一个关系式是无法表示唯一数列,需要写出口裴波那契数列例子#include <iostream>using namespace std;//裴波那契数列//f(1)=1 //f(2)=1//f(n)=f(n-1)+f(n-2原创 2021-01-22 19:09:53 · 84 阅读 · 0 评论