算法
来日浅谈
天下古今之庸人,皆以一惰字致败。
天下古今之才人,皆以一傲字致败。
展开
-
【经典排序算法】(二)--- 非比较类排序(计数排序,桶排序,基数排序)
【经典排序算法】(二)--- 非比较类排序(计数排序,桶排序,基数排序)概述算法复杂度相关概念1. 计数排序1.1 介绍:1.2 算法描述:1.3 代码演示:1.4 算法分析2. 桶排序2.1 介绍:2.2 算法描述:2.3 代码演示:2.4 算法分析3. 基数排序3.1 介绍:3.2 算法描述:3.3 代码演示:3.4 算法分析比较类算法链接:【经典排序算法】(一)— 比较类排序(冒泡排序,快速排序 ,简单插入排序,希尔排序,简单选择排序,堆排序,归并排序)概述不通过比较来决定元素间的相对次序,它可原创 2020-12-10 17:14:10 · 974 阅读 · 0 评论 -
【数据离散化】
【数据离散化】1. 什么是离散化2. 离散化的方法2.1 使用数组标记实现2.2 通过STL中的函数实现2.2.1 unique 函数2.2.2 通过数组实现2.2.3 通过vector实现很多算法的复杂度与数据中的最大值有关,比如树状数组和纯用数组实现的一对一标记。时常会遇到这种情况:数据的范围非常大或者其中含有负数,但数据本身的个数并不是很多(远小于数据范围)。在这种情况下,如果每...原创 2019-12-01 21:06:44 · 903 阅读 · 0 评论 -
【快速读入数据(快读)】
【快速读入数据(快读)】为什么要使用快读?快读的思路快读的代码快读模板代码优化为什么要使用快读?刚学C++时,我喜欢用这种方式来读入数据:int x;cin >> x;这个读入简单方便,但是到后面我们做题的过程中,我们发现cin 虽然读入方式简单方便,但是它的效率却是极低。于是我在网上查找资料有没有方法让cin的速度提高,功夫不负有心人,我开始用下面的方法读入数据:std...原创 2019-10-23 15:21:06 · 952 阅读 · 1 评论 -
大神详细的ACM训练计划
看完人家的博客,发现任重道远。。。一位高手对我的建议:一般要做到50行以内的程序不用调试、100行以内的二分钟内调试成功.acm主要是考算法的,主要时间是花在思考算法上,不是花在写程序与debug上。下面给个计划你练练:第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出...原创 2019-10-20 22:08:09 · 697 阅读 · 0 评论 -
【约瑟夫环】
【约瑟夫环】问题描述通过链表解决(待更新)通过数组模拟解决(待更新)通过数学推导公式解决思路代码1:代码2问题描述约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。通过链表解决(待更新)通过数组模拟解决(待更新)通过数学推导公式解决思路首先,我先剧透一下推导公式:f(N,M)=(f(N−1...原创 2019-04-29 21:27:19 · 967 阅读 · 2 评论 -
【Warshall算法】
【Warshall算法】定义方法一方法二定义方法一#include <iostream>using namespace std;int n;const int MAXN = 100;int arr[MAXN][MAXN];int main(){ cout << "请输入矩阵的阶数:"; cin >> n; cout << ...原创 2019-05-16 21:22:05 · 1094 阅读 · 0 评论 -
【计算完全最短路径的Floyd算法】
【计算完全最短路径的Floyd算法】定义算法思想原理算法描述定义Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。算法思想原理Floyd算法是一个经典的动态规划算法...原创 2019-05-17 17:33:48 · 920 阅读 · 2 评论 -
【C++】STL --- 常用算法
【C++】STL --- 常用算法一. 函数对象1. 函数对象2. 谓词3. 内建函数对象4. 函数对象适配器二. 算法概述三. 常用遍历算法四. 常用查找算法五. 常用排序算法六. 常用拷贝算法七. 常用算数生成算法八. 常用集合算法一. 函数对象1. 函数对象重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(funct...原创 2019-07-21 15:33:28 · 318 阅读 · 0 评论 -
【最大公约数 GCD】 --- 常用四大算法(辗转相除法,穷举法,更相减损法,Stein算法)
【最大公约数 GCD】 --- 常用的四大算法1. 辗转相除法(又名欧几里德算法)2. 穷举法(也称枚举法)3. 更相减损法 (又名辗转相减法)4. Stein算法1. 辗转相除法(又名欧几里德算法)欧几里得算法,也叫辗转相除,简称 gcd,用于计算两个整数的最大公约数定义: gcd(a,b) 为整数 a 与 b 的最大公约数引理:gcd(a,b)=gcd(b,a%b)证明:设 r=...原创 2019-08-03 01:06:27 · 3579 阅读 · 0 评论 -
【哈夫曼树(最优二叉树)】 --- 概念以及构造
【哈夫曼树(最优二叉树)】 --- 概念以及构造哈夫曼树产生的背景准备概念哈夫曼二叉树的概念以及构造哈夫曼树产生的背景准备概念哈夫曼二叉树的概念以及构造...原创 2019-08-23 22:30:52 · 2068 阅读 · 1 评论 -
【线段树详解】
【线段树详解】1. 什么是线段树2. 使用线段树的必要条件 - 区间加法3. 线段树的基本操作3.1 初始化(建树)3.2 单点修改3.3 区间修改3.4 区间查询4.线段树的整体代码(例: POJ - 3468 A Simple Problem with Integers)1. 什么是线段树线段树,是一种二叉搜索树。它将一段区间划分为若干单位区间,每一个节点都储存着一个区间。它功能强大,支...原创 2019-09-28 15:10:17 · 441 阅读 · 0 评论 -
【树状数组详解】
【树状数组详解】什么是树状数组树状数组的基本操作单点更新区间查询树状数组与线段树的比较树状数组的整体代码(例:HDU - 1166 排兵布阵)什么是树状数组树状数组是一个查询和修改复杂度都为log(n)的数据结构。主要用于数组的单点修改&&区间求和. 另外一个拥有类似功能的是线段树. 具体区别和联系如下:两者在复杂度上同级, 但是树状数组的常数明显优于线段树, 其编程复杂度...原创 2019-10-04 21:38:42 · 585 阅读 · 0 评论 -
【Trie树(字典树,前缀树)】
【Trie树(字典树,前缀树)】1. 思考(字典树的应用场景)2. 什么是字典树3. 字典树的基本操作3.1 建树3.2 添加3.3 查询3.4 释放4. 字典树的应用5. 字典树的整体代码(例:hihocoder 1014 Trie树)1. 思考(字典树的应用场景)一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词。对于给定字符串,查询某字典中以该字符串开头的字...原创 2019-10-06 20:37:58 · 288 阅读 · 0 评论 -
【俄式乘法】
俄式乘法这篇博文我来介绍一下一个非主流算法 /斜眼笑 俄式乘法思路:假设x和y是两个正整数,计算xy,现在用n的输入作为实例规模的度量标准。假设x是偶数,一个规模为原来一半的实例必须要对x/2进行处理,xy=x / 2 * 2y假设n是奇数,只需要对公式进行简单调整,xy=(x-1)/ 2 * 2y并且使用1y=y作为终止条件。我们写下来一个例子就会发现:所有当前x的值是...原创 2019-04-28 22:57:18 · 2350 阅读 · 0 评论 -
【硬币收集问题】
【硬币收集问题】1. 问题描述2. 解决方案1. 问题描述在n*m格木板中放有一些硬币,每格的硬币数目最多为一个,在木板左上方的一个机器人需要收集尽可能多的硬币并把它们带到右下方的单元格。每一步,机器人可以从当前的位置向右移动一格或向下移动一格。当机器人遇到一个有硬币的单元格时,就会将这枚硬币收集起来。设计一个算法找出机器人能找到的最大硬币数并给出相应的路径。2. 解决方案解题思路:...原创 2019-05-04 12:00:11 · 5006 阅读 · 3 评论 -
【找零问题】
【找零问题】1. 问题描述2. 解决方案2.1 动态规划(一维数组实现)2.2 动态规划(二维数组实现)1. 问题描述需要找零的金额为n,最少要用多少面值为value[1]<value[2]<value[3]…<value[m]的硬币?2. 解决方案2.1 动态规划(一维数组实现)解题思路:设f[n]为总金额为n的数量最少的硬币数目,方便定义f[0]=0.获得n的途...原创 2019-05-04 11:16:57 · 1576 阅读 · 0 评论 -
汉诺塔问题详解--递归实现
汉诺塔问题详解--递归实现汉诺塔问题来源:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。思考:有三根柱子(A,B,C)。A柱子上面套着n个圆盘。这些圆盘...原创 2019-03-19 20:13:40 · 12004 阅读 · 14 评论 -
旅行商问题(TSP) --- 蛮力法(深度优先遍历算法DFS),贪心算法,动态规划
旅行包问题(TSP) --- 蛮力法(深度优先遍历算法DFS)问题描述蛮力法(深度优先遍历算法DFS)问题描述TSP问题(Traveling Salesman Problem,旅行商问题),由威廉哈密顿爵士和英国数学家克克曼T.P.Kirkman于19世纪初提出。问题描述如下:有若干个城市,任何两个城市之间的距离都是确定的,现要求一旅行商从某城市出发必须经过每一个城市且只在一个城市逗留...原创 2019-04-12 09:47:38 · 24429 阅读 · 9 评论 -
最近对问题---蛮力法,分治法实现
最近对问题 --- 蛮力法,分治法实现问题描述:解决方案:1. 蛮力法:2. 分治法:问题描述:给定某空间中(直线空间或平面空间)n个点,请找出它们中的最近点对并输出。解决方案:1. 蛮力法:解题思路:使用结构体数组保存每个坐标。通过双重for循环遍历所有坐标之间的距离,找到其中距离最小的两个点将其输出。(距离应该为sqrt((x1-x2)^2 + (y1-y2)^2),但是...原创 2019-04-09 20:07:31 · 1688 阅读 · 0 评论 -
凸包问题 --- 蛮力法,Graham扫描法
凸包问题 --- 蛮力法,Graham扫描法问题描述蛮力法问题描述给定一个平面上n个点的集合,它的凸包就是包含所有这些点的最小凸多边形,求取满足此条件的所有点。另外,形象生动的描述:(1)我们可以把这个问题看作如何用长度最短的栅栏把n头熟睡的老虎围起来。(2)也可以这样看:请把所讨论的点想象成钉在胶合板上的钉子,胶合板代表平面。撑开一根橡皮筋圈,把所有的钉子都围住,然后啪一声松开手。凸包...原创 2019-04-10 00:27:13 · 2103 阅读 · 1 评论 -
【经典排序算法】(一)--- 比较类排序(冒泡排序,快速排序 ,简单插入排序,希尔排序,简单选择排序,堆排序,归并排序)
【经典排序算法】(一)--- 比较类排序概述算法复杂度相关概念一. 交换排序1. 冒泡排序2. 快速排序二. 插入排序1. 简单插入排序2. 希尔排序三. 选择排序1. 简单选择排序2. 堆排序四. 归并排序1. 二路归并排序2. 多路归并排序概述通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。算法复杂度排序方法时间复杂度...原创 2019-04-17 01:08:01 · 2584 阅读 · 3 评论 -
背包问题 --- 蛮力法,动态规划
背包问题 --- 蛮力法,动态规划问题描述蛮力法动态规划问题描述给定重量分别为,价值分别为的n件物品,和一个承重为W的背包。求这些物品中一个最有价值的子集,并能装到背包中。蛮力法背包问题的蛮力解法是穷举这些物品的所有子集,找出能够装到背包中的所有子集,并在这些子集中找出价值最大的子集。//背包问题:蛮力法#include <iostream>#include <c...原创 2019-04-13 14:19:10 · 2483 阅读 · 0 评论 -
【经典算法】--- 拓扑排序(通过入度表,DFS与栈,队列分别实现)
【经典算法】--- 拓扑排序介绍方法通过入度表(直接遍历)通过DFS和栈实现通过队列实现(待更新)介绍对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称...原创 2019-04-21 16:44:11 · 6229 阅读 · 1 评论 -
分配问题 --- 蛮力法
分配问题 --- 蛮力法问题描述蛮力法问题描述假设有n个任务需要分配给n个人执行,每个任务只分配给一个人,每个人只分配一个任务,且第j个任务分配给第i个人的成本是C[i, j](1≤i , j≤n),任务分配问题要求找出总成本最小的分配方案。蛮力法思路:通过递归遍历所有方案,找到成本最小的那个方案。//分配问题:蛮力法#include <iostream>#inclu...原创 2019-04-14 15:42:17 · 4404 阅读 · 0 评论 -
生成排列 --- 蛮力法,Johnson-Trotter算法
生成排列 --- 蛮力法,Johnson-Trotter算法蛮力法Johnson-Trotter算法蛮力法思路:通过递归遍历所有的排列方式。代码演示:#include <iostream>using namespace std;const int MAXSIZE = 100;int n;int arr[MAXSIZE];int visit[MAXSIZE];...原创 2019-04-23 00:50:43 · 1898 阅读 · 0 评论 -
生成子集问题 --- 位向量法,增量构造法,二进制法
生成子集问题 --- 位向量法,增量构造法,二进制法问题描述位向量法增量构造法二进制法问题描述之前我们写过背包问题,知道背包问题是找到最有价值的子集,但是如果需要把所有的子集全部输出出来该怎么做呢?即:给定一个集合,枚举所有的可能的子集。位向量法思路:其实我觉得这更可以叫做直接选择法,在需要枚举的1-n中选择第i个选择是否要放入当前子集。代码演示:#include <io...原创 2019-04-28 14:02:10 · 674 阅读 · 0 评论 -
【折半查找】
折半查找定义:折半查找技术,也就是二分查找。它的前提是线性表中的记录必须是关键码有序(通常从大到小有序),线性表必须采用顺序存储。折半查找的基本思想是:取中间记录作为比较对象,若给定值与中间记录的关键字,则在中间记录的关键字相等,则查找成功;若给定值小于中间记录的作伴去继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录...原创 2019-04-28 17:52:09 · 512 阅读 · 0 评论 -
【币值最大化问题】
【币值最大化问题】1. 问题描述2. 解决方案 --- 动态规划1. 问题描述给定一排n个硬币,其面值均为正整数c1,c2,…,cn,这些整数并不一定两两不同。请问如何选择硬币,使得在其原始位置互不相邻的条件下,所选硬币的总金额最大。2. 解决方案 — 动态规划解题思路:我们可以将问题划分为取最后一枚硬币和不取最后一枚硬币。根据不相邻这一条件,若取最后一枚硬币,则我们继续判断前n-2枚...原创 2019-05-04 09:54:51 · 5912 阅读 · 5 评论 -
探讨8+88+888+8888...的前20项之和(java)
探讨8+88+888+8888...的前20项之和首先,我们先分析一下题,前20项貌似超过了int的取值范围,很多朋友瞬间就想到了long或者long long 但是Java不像C/C++有long long这个基本数据类型。所以我们先去试一试long能否成功,并且顺便看看long的最大值:.package Demo_2;public class Demo { public static...原创 2019-03-06 13:57:07 · 2520 阅读 · 0 评论