算法
Mankind_萌凯
90后,计算机研究生,欢迎关注我的微信公众号:萌凯的程序人生
展开
-
排序算法之桶排序
目录本文将介绍排序算法中又快又简单的排序算法——桶排序,包括:桶排序计数排序基数排序1桶排序桶排序是在已经数据的范围的条件下,创建若干个桶,根据相应的比较规则将待排数据落入各个对应的桶...原创 2020-02-12 08:53:24 · 425 阅读 · 0 评论 -
排序算法之归并排序
引言本文将介绍排序算法中的归并排序,学习归并排序需要很好地理解计算机中的分治思想和递归思想。1分治思想归并排序,利用分而治之的思想,将大的问题,转换成简单的,小的问题来解决。分治,字面...原创 2020-02-11 09:36:03 · 242 阅读 · 0 评论 -
排序算法之快速排序,它为什么这么快?
目录本文将介绍排序算法中最常用,以及最重要的快速排序。包括:快速排序实例代码解析效率分析1快速排序实例快速排序由C. A. R. Hoare在1960年提出,是冒泡排序的一种改进。快速...原创 2020-02-10 09:34:29 · 1407 阅读 · 1 评论 -
二分查找,教你如何提高搜索效率
二分查找,是程序员入门必会的一个高效搜索算法。本文将对二分查找,以及时间复杂度等概念进行讲解。1 什么是算法和时间复杂度在计算机科学中,算法是指在有限时间内解决一个问题的一系列确定的指令。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度...原创 2020-02-05 09:23:53 · 1635 阅读 · 0 评论 -
排序算法之希尔排序
本文将介绍排序算法中的希尔排序,它是高级版的插入排序,是我们第一个介绍的有点难度的算法。1. 实例讲解希尔排序,是插入排序的一个升级版本。在插入排序中,无论数据是怎么分布的,依然循规蹈矩的一步一步比较,移动,插入。在希尔排序中,采用跳跃式的方式,按照某个增量gap将数组元素分成多组序列,并使用插入排序使得各自组内有序。随后逐步缩小gap,继续按组进行插入排序,直到增量为1。这样...原创 2020-02-09 10:20:43 · 814 阅读 · 0 评论 -
排序算法之插入排序,玩扑克牌必会
本文将介绍排序算法中的插入排序,包括: 插入排序实例 代码解析 效率分析 1 插入排序实例今天来学习插入排序,在讲插入排序之前,我们先来讲一讲扑克牌。每个人都会打扑克牌,不知道你们有没有注意到,我们在拿牌的时候,会习惯性地把手上的牌按照从小到大排好。这样我们在出牌的时候才不会手忙脚乱。当你的小伙伴正在发牌的时候,如果你习惯发一张拿一张,你可能会无意中用到插...原创 2020-02-08 13:06:08 · 646 阅读 · 0 评论 -
排序算法之冒泡排序,入门必学
本文将对排序算法中的冒泡排序进行讲解。1 冒泡排序今天介绍另外一种排序算法,冒泡排序。它的基本思想是,对相邻的元素进行两两比较,顺序相反则交换,这样,每趟会将最小(或最大)的元素浮到数组最后面,最终达到整体有序。冒泡排序也是较为直观的一种排序算法,以整体升序为例,我们先看看每一趟具体发生了什么:我们可以看到,每一趟过程中,从左到右,相邻的位置进行比较,如果不符合升序,就将其位置对调。...原创 2020-02-07 10:39:25 · 378 阅读 · 0 评论 -
排序算法之选择排序
排序算法是每个程序员必须掌握的基础知识。目前经典的排序算法,有冒泡排序,选择排序,插入排序,希尔排序,快速排序,堆排序,归并排序,桶排序。本文将对选择排序进行讲解。另外,我最近注册了个人公众号【萌凯的程序人生】,分享个人的一些学习总结和经验,欢迎大家关注。文章目录1.选择排序2.代码解析3.效率分析1.选择排序我们会经常遇到对数据进行排序的问题,比如,一组学生成绩按照从大到小的顺序排名...原创 2020-02-06 13:47:53 · 338 阅读 · 0 评论 -
【图论】最短路径算法大全
Dijkstra算法特点:单源最短路径,无负权边。算法思路:设置一个dis[i]数组记录i到源点的最小距离。一开始只有源点的dis为0,其他全为无限大。从源点出发,更新周围与它相连的点。进行顶点次数的循环,每次寻找与源点距离最近的点,标记为已访问,并从该点出发更新相连的点的状态。根据三角不等式dis[i]+map[i][j]跟dis[j]比较,如果小于,说明经过i再到j比原来源点到j的最短原创 2017-03-16 17:53:49 · 1356 阅读 · 0 评论 -
【数据结构】并查集
并查集是一种高级数据结构,它能够在很短的时间内判断出两个节点是否属于同一个连通区域。一般来说,并查集有以下基本操作。初始化一开始每个节点都是独立的,互不相关,他们的祖先节点就是他们本身。void init(int n){ for(int i=1;i<=n;i++) { set[i]=i;//每个节点的祖先初始化为自身 }}合并比如Merge(A,B原创 2017-05-18 13:25:57 · 414 阅读 · 0 评论 -
【动态规划】常见区间dp
所谓区间dp,就是在一个区间上进行的dp, 一般通过将大区间分割成小区间进行dp,常见的经典题型总结如下:乘积最大设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:有一个数字串:312, 当N=3,K=1时会有以下两种分法:1) 3*12=原创 2017-04-05 09:18:43 · 1659 阅读 · 0 评论 -
【数据结构】后缀数组模板+代码理解
后缀数组SA[i]:第i名是谁。它保存 1..n 的某个排列 SA[1] ,SA[2],……,SA[n],并且保证 Suffix(SA[i]) Rank[i]:第i位是第几名。名次数组 Rank[i]保存的是 Suffix(i)在所有后缀中从小到大排列的“名次 ” 。具体可以参考国家集训队论文《后缀数组——处理字符串的有力工具》 int wa[maxn],wb[原创 2017-05-18 09:05:45 · 508 阅读 · 0 评论 -
【数据结构】线段树专辑
线段树是一种高效的数据结构。它可以将一段区间组织为二叉树的结构,比如比如将[1,10]划分为两个子树[1,5],[6,10],再分别划分为[1,3],[4,5],[6,8],[9,10]……直至为左右两端相同的叶子节点。线段树具有二叉树的性质,它的操作都是nlgn的时间复杂度。下面我们通过代码来看一下线段树的应用。单点更新//线段树//hdu1166 敌兵布阵 单点增删,区间求原创 2017-05-16 23:25:13 · 506 阅读 · 0 评论 -
【图论】最小生成树之prim算法与kruskal算法
MST(Minimum Spanning Tree,最小生成树)所谓的最小生成树,即在一个有n个结点的连通图中,n个结点之间有若干条边相连,这些边有不同的权值,要求找到使这些点连通并且所得到的权值总和最小,这样的一棵树被叫做最小生成树。从一张图中找出最小生成树的算法有两种,prim算法与 kruskal算法。prim算法思路:prim算法的代码类似于dijkstra原创 2017-03-16 22:00:03 · 826 阅读 · 0 评论 -
【数论】gcd|扩展gcd|素数筛法|快速幂|欧拉函数(各种模板)
这里总结了一些基础的数学概念。整除:一个数可以被另一个数整除是数论中的一个关键概念。d|a(d整除a,a除以d)的含义是存在某个整数k,使得a=kd。称a是d的倍数,d是a的约数(因数)。带余数除法:a、b为两个正整数,且b≠,0,则存在唯一整数q和r,使得a=qb+r,0关于d|b的一些推论① d|a且d|b,则d|(a+b)且d|(a-b)② d|a且d|b原创 2017-03-15 14:08:55 · 1404 阅读 · 0 评论 -
【数位DP】模板+入门题HDU2089 FZU2109
数位dp 所谓数位dp,就是用来解决对一串数字有某些限制的这类题型。比如说,给定一个车牌号,要求不能有4出现或者是连续的62出现。这道题出现在HDU2089,可以说是数位dp的经典入门题型,解题思路我们可以用来作为模板。思路:一般适用dp[cur][state]来表示第cur层,状态为state的方案数,比如这道题,state就可以是0和1,来表示前一位是否为6,为什么需要这个原创 2017-03-26 11:09:49 · 668 阅读 · 0 评论 -
【二进制枚举】求在n个数中取任意个数加起来组成x的方案数
问题:n个互不重复的数,通过加法凑出X,求出有多少种方案?思路:由于n并不大,可以使用二进制枚举的方法。看代码就能够理解原创 2017-02-08 18:31:22 · 1315 阅读 · 2 评论 -
【匈牙利算法】二分图最大匹配(模板)
【匈牙利算法】这是一个在二分图中寻找最大匹配的算法。基本思路:寻找增广路径,它是一种用增广路径求二分图最大匹配的算法,找不到增广路时,达到最大匹配。所谓的增广路径,就是从一个未匹配点出发,经过非匹配边,匹配边,非匹配边,如果能到达一个未匹配点,则这条交替路称为增广路径。对于增广路径,我们必定能重新调整匹配,使得我们的匹配边+1。例子:现在假设有3个女生3个男生,每个人都原创 2017-02-18 20:42:39 · 797 阅读 · 0 评论 -
【组合数学】卡特兰数总结
卡特兰数问题:n对括号有多少种合法的匹配方式?(卡特兰数的常见应用之一)结论:对于n对括号,合法的排列共有C(n,2n)-C(n+1,2n)基本思路:考虑n对括号,有n个(和n个),对于任意一个)其前面必定有一个(跟他对应,如果没有则是非法序列。也就是说,对于),其前面的(的数量必须大于等于)的数量。假设(=1,)=-1。合法的序列是 1 -11 -1 1 -1,不合法的序原创 2017-02-18 23:52:55 · 1281 阅读 · 0 评论 -
【数据结构】c++Map的简单应用&& getline()细节
题意:给出字典,字典含有密文和对应的原文。然后读入密文,密文以START开头,以END结尾,其中有若干行,输出密文翻译后的文本,如果单词在字典中无对应的则按原样输出,也保留所有非英文字母的特殊符号。输入格式字典部分以START开始,以END结束。中间部分每行两个单词,第一个是英文,第二个是蒜厂秘籍文字,以单个空格隔开。接下来是历史书部分,同样以START开始原创 2017-02-15 13:53:09 · 538 阅读 · 0 评论 -
【动态规划/背包】整数划分的5种情况
1.将n划分成若干正整数之和的划分数(可以存在相同整数)。转移方程如下:dp[n][m]=dp[n][m-1]+ dp[n-m][m] dp[n][m]表示整数 n 的划分中,每个数不大于 m 的划分数。理解①:根据划分中包不包含m的情况分为2种,一种情况是划分中包含m,则剩下数的总和剩下n-m,相当于其划分数为dp[n-m][m]。另一种情况是划分中不包含m,那么其划分数为dp原创 2017-03-06 11:17:29 · 1239 阅读 · 0 评论 -
【图论】匈牙利算法与KM算法(寻找二部图最佳匹配与最佳完备匹配)
匈牙利算法对于一个二分图,如何找到其最大匹配,也就是匹配数最大的匹配?答案便是匈牙利算法,它利用增广路径来求二分图最大匹配。我们通过一个例子来更好地说明二分图的情况。思路:假设有3个男生3个女生,现在我们要帮他们做配对(男生不可以互相喜欢,女生也一样),如果没有任何限制,即男生对女生没有任何要求,女生对男生也没有任何要求,那显然最大匹配就是3对啦。而情况通常是,每个原创 2017-03-19 23:32:09 · 4247 阅读 · 2 评论 -
【图论】最大流之EK算法与Dinic算法及最小费用最大流
最大流:给出一张网络图,并指定源点和终点,每条边都有它的容量,起点有着无限的流量,求从源点到经过的所有路径的最终到达汇点的最大流量和。对于同一个节点,流入的流量之和和流出的流量之和相同,即假如结点1有12流量流入结点2,结点2分别有8流量流入结点3,4流量流入结点4,这种情况是可以的。 EK算法:而EK算法反复寻找源点s到汇点t之间的增广路径,若有,找出增广路径上每一段[容量-原创 2017-03-20 19:59:54 · 2454 阅读 · 0 评论 -
【动态规划】常见背包问题合集
01背包: 有N件物品和一个容量为V的背包。(每件物品只有一件)第i件物品的费用是c[i],价值是v[i],求解将哪些物品装入背包使总价值最大。转移方程:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]},可以优化只用一维数组.代码如下: for(int i=0;i<nPack;i++) for(int j=nMaxVolume;j>=w原创 2017-03-20 23:14:28 · 2661 阅读 · 0 评论 -
【图论】拓扑排序
拓扑排序 有一个拓扑排序的经典例子。在我们大学的计算机课程中,有c语言,数据结构,计算机网络,计算机组成原理,操作系统,数字电路等课程,而其中数据结构需要我们先掌握C语言才能进行学习,计算机组成原理需要我们掌握数字电路才能进行学习,除此之外还有许多的课程,他们有各自的前置课程,整张图错综复杂,而我们应该怎么去安排学生的课程呢?思路将所有的课程看做节点,每个节点跟它的前置节点之间由一原创 2017-03-25 16:19:02 · 702 阅读 · 0 评论 -
【蓝桥杯真题】垒骰子(矩阵快速幂优化)
蓝桥杯真题-垒骰子赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!我们先来规范一下骰子:11 的对面是 44,22 的对面是 55,33 的对面是 66。假设有 mm 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。atm 想计算一下有多少种不同的可能的垒骰原创 2017-03-12 15:37:41 · 1738 阅读 · 0 评论 -
【图论】欧拉图
所谓的欧拉图,就是我们小时候经常玩的一种"一笔画"游戏,从任意一个点出发,经过所有的边。而我们将这个模型抽象出来,对边和起点加了不同的限制,就得到了不同的定义。欧拉通路: 通过图中每条边且只通过一次,并且经过每一顶点的通路。欧拉回路: 通过图中每条边且只通过一次,并且经过每一顶点的回路。欧拉回路相关定理: 1、无向图为欧拉图(欧拉回路),当且仅当为连通图且所有顶点的度为偶数原创 2017-03-25 18:39:27 · 2384 阅读 · 0 评论 -
【图论】割边与桥,双连通分量与强连通分量
割点与桥割点:如果去掉一个点以及与它相关的边,使得整个图的连通分支数增加,那么这个点就是一个割点。桥:如果去掉一条边,使得整个图的连通分支数增加,那么这条边就是一座桥。tarjan算法求无向图的割点:定义low[u]为u或u的子树能够追溯到的最早的栈中节点的次序号,dfn[u]为节点u搜索的次序编号(时间戳)那么u是割点当且仅当u满足①u是dfs搜索树的树根,并且u含有原创 2017-03-25 22:00:12 · 1084 阅读 · 0 评论 -
【动态规划】最大子矩阵
问题:求一个n*m的矩阵中的最大子矩阵。思路:考虑只有一行的情况,在1*m的矩阵中,最大子矩阵可以很容易求出。 sum[j]=max(sum[j-1]+num[j], num[j])sum[j] 指的是从0开始到j的最大子段和。考虑两行的情况,最大子矩阵可能只有1行,也可能有2行。2行的最大子矩阵可以通过上下相加合并成一行,转换成最大子段和来求。考虑三行的情况,最大子矩阵可能有原创 2017-02-08 16:59:37 · 914 阅读 · 0 评论