算法
文章平均质量分 52
ACM
Starzkg
你已经是一个成熟的程序猿了,要学会自己DEBUG了。
展开
-
阿里巴巴2021秋招笔试题20210806
第一题题目描述大概定义了一年mmm个月,一个月ddd天,一周www天已知mmm,ddd,www求第kkk年,第jjj月,第iii天是星期几星期几用小写字母表示1<=w<=26其他数据范围忘了,反正很正常。解决方案JAVA版本package io.shentuzhigang.exam.alibaba;import java.util.Scanner;/** * @author ShenTuZhiGang * @version 1.0.0 * @email 160原创 2021-08-06 20:14:20 · 843 阅读 · 2 评论 -
C++——《算法分析与设计》实验报告——箱子装载问题
实验名称: 箱子装载问题 实验地点: 实验目的: 1、 理解和复习所学各种算法的概念; 2、 掌握和复习所学各种算法的基本要素; 3、 掌握各种算法的优点和区别; 4、 通过应用范例掌握选择最佳算法的设计技巧与策略; 实验原理 回溯法原理: 从开始结点出发,以深度优先方式搜索整个解空间。这个节点成为活结点,同时也成为当前的扩展节点。在当前的扩展节点处,搜索向纵深方向一致一个...原创 2020-06-04 15:24:31 · 1988 阅读 · 0 评论 -
C++——《数据结构与算法》实验——排序算法的实现
问题描述1) 动态输入一组数字序列;2)实现直接插入排序、简单选择排序、冒泡排序、快速排序算法;3)在主函数中,依次测试上述算法。类型定义#define MAX SIZE 100typedef int KeyType ;typedef struct RecType{ KeyType key ; /*关键字码*/ infoType otherinfo; /* 其他域*/} RecType ;typedef struct SqList{ ..原创 2020-05-24 18:59:31 · 795 阅读 · 0 评论 -
C++——《算法分析与设计》实验报告——二分搜索算法
实验名称: 二分搜索算法 实验地点: 实验目的: 理解分治算法的概念和基本要素; 理解递归的概念; 掌握设计有效算法的分治策略; 通过二分搜索技术学习分治策略设计技巧; 实验原理 二分搜索算法也称为折半查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完...原创 2020-05-07 14:09:01 · 2427 阅读 · 0 评论 -
RSA加密算法
基本概念RSA加密算法:RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。RSA是目前最有影响力的公钥加密算法,该算法基...原创 2020-01-15 20:06:07 · 5979 阅读 · 0 评论 -
设计模式(Design Pattern)
简介设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。...原创 2019-11-06 12:12:03 · 476 阅读 · 0 评论 -
拓扑排序(Topology_Sort)
基本思想对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。...原创 2019-02-25 16:24:10 · 752 阅读 · 0 评论 -
区间DP
一、定义在一段区间内的动态规划。二、思路把一个大区间拆分成几个小区间,先求小区间的最优值,然后合并起来求大区间的最优值。三、例题 四、参考文章http://www.cnblogs.com/xFANx/p/7193067.htmlhttps://www.cnblogs.com/rmy020718/p/9515963.htmlhttps://www.cnblogs....原创 2019-01-30 15:53:06 · 248 阅读 · 0 评论 -
欧拉降幂(Euler_Power_Formula)
一、欧拉降幂公式 二、证明欧拉降幂公式与证明 三、例题https://ac.nowcoder.com/acm/contest/330/E四、参考文章https://blog.csdn.net/weixin_38686780/article/details/81272848https://blog.csdn.net/weixin_43272781/articl...原创 2019-01-30 10:53:28 · 400 阅读 · 0 评论 -
数位DP
一、定义给定的范围[l,r]中,满足(不满足)某个条件的数字,有多少个。二、思路从高位开始想低位,按位遍历,递归向下,求第i位的时候,需要第i-1位的所有可能性的和。三、例题http://acm.hdu.edu.cn/showproblem.php?pid=3555http://acm.hdu.edu.cn/showproblem.php?pid=2089(题解:https...原创 2019-01-28 17:23:52 · 236 阅读 · 0 评论 -
因子(Number_Of_Factors)
一、定义因子:假如整数n除以m,结果是无余数的整数,那么我们称m就是n的因子。质因子:在数论里,某一正整数的质因子指能整除该数的质数整数。完数:一个数的因子之和等于它本身,则该数为完数。二、性质1、因子性质无2、质因子性质两个没有共同质因子的正整数称为互质。数字1与任何正整数(包括1 本身)都是互质。This is because it has no pri...原创 2019-01-21 21:34:15 · 2628 阅读 · 0 评论 -
莫队算法(Mo's_Algorithm)
一、定义二、应用莫队算法可用于解决一类可离线且在得到区间[l,r]的答案后,能在O(1)或O(log2n)得到区间[l,r+1]或[l−1,r]的答案的问题三、分析http://www.cnblogs.com/hzf-sbit/p/4056874.htmlhttps://zhuanlan.zhihu.com/p/25017840四、例题https://www.lyds...原创 2019-01-21 18:51:04 · 552 阅读 · 0 评论 -
字典树(Trie)
一、定义Trie树,又称为前缀树(Prefix Tree)、单词查找树或键树,是一种多叉树结构。二、基本性质根节点不包含字符,除根节点外的每一个子节点都包含一个字符。 从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。 每个节点的所有子节点包含的字符互不相同。三、代码#include <iostream>#include <stri...原创 2019-01-19 23:32:33 · 454 阅读 · 0 评论 -
最小公倍数(Least_Common_Multiple)
一、定义几个数共有的倍数叫做这几个数的公倍数,其中除0以外最小的一个公倍数,叫做这几个数的最小公倍数。自然数a、b的最小公倍数可以记作[a、b],自然数a、b的最大公最小公倍数因数可以记作(a、b),当(a、b)=1时,[a、b]= a×b。如果两个数是倍数关系,则它们的最小公倍数就是较大的数,相邻的两个自然数的最小公倍数是它们的乘积。最小公倍数=两数的乘积/最大公约(因)数, 解题时...原创 2019-01-18 23:47:19 · 3792 阅读 · 0 评论 -
最大公约数(Greatest_Common_Divisor)
一、定义如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。二、性质重要性质:gcd(a,b)=gcd(b,a) (交换律)gcd(-a,b)=gcd(a,b)gcd(a,a)=|a|gcd(a,0)=|a|gcd(a,1)=1gcd(a,b...原创 2019-01-18 23:40:03 · 4165 阅读 · 0 评论 -
悬线法
一、最大子矩阵问题在一个给定的矩形中有一些障碍点,找出内部不包含障碍点的、轮廓与整个矩形平行或重合的最大子矩形。二、定义子矩形有效子矩形:内部不包含障碍点的、轮廓与整个矩形平行或重合的子矩形。极大子矩形:每条边都不能向外扩展的有效子矩形。最大子矩形:所有有效子矩形中最大的一个(或多个)。三、极大化思想在一个有障碍点的矩形中最大子矩形一定是极大子矩形。设计算法的思路:...原创 2019-03-01 16:27:34 · 602 阅读 · 0 评论 -
欧拉路径(Euler_Path)和欧拉回路(Euler_Loop)
一、基本概念欧拉路径:欧拉路是指从图中任意一个点开始到图中任意一个点结束的路径,并且图中每条边通过的且只通过一次。欧拉回路:欧拉回路是指起点和终点相同的欧拉路。二、存在欧拉路的条件1.无向连通图存在欧拉路的条件:所有点度都是偶数,或者恰好有两个点度是奇数,则有欧拉路。若有奇数点度,则奇数点度点一定是欧拉路的起点和终点,否则可取任意一点作为起点。2.有向连通图存在欧拉路的...原创 2019-03-14 15:22:16 · 3685 阅读 · 0 评论 -
强连通分量(Strongly_Connected_Components)
一、基本概念强连通图(Strongly Connected Graph)是指在有向图G中,如果对于每一对vi、vj,vi≠vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图。有向图中的极大强连通子图称做有向图的强连通分量。连通分量:对于图G来的一个子图中,任意两个点都可以彼此到达,这个子图就被称为图G的连通分量(一个点就是最小的连通分量)最大连通分量:对于图G的一个子图,...原创 2019-03-14 18:20:47 · 2120 阅读 · 0 评论 -
《数据结构与算法》实验报告——单链表的就地反转
《数据结构与算法》实验报告 学号: 2018329621200 机房号 10-525 姓名: 申屠志刚 日期: 2019/10/12 程序名: main.cpp 实验内容: 单链...原创 2019-10-11 18:57:09 · 2268 阅读 · 0 评论 -
线段树合并
一、基本概念线段树合并:将已有的两棵线段树合并为一棵,相同位置的信息整合到一起,通常是权值线段树比较裸的,就是将一棵线段树的每一个位置取出来插入另一棵中,但比较高效的线段树合并可以参照可并堆的合并方式二、算法假设两棵线段树树:合并线段树合并的原理:对于两颗树的节点u和v①如果u为空,返回v②如果v为空,返回u③否则,新建节点t,整合u和v的信...原创 2019-07-10 20:20:06 · 1082 阅读 · 2 评论 -
差分数组
一、基本概念差分数组:对于已知有n个元素的离线数列d,我们可以建立记录它每项与前一项差值的差分数组f:显然,f[1]=d[1]-0=d[1];对于整数i∈[2,n],我们让f[i]=d[i]-d[i-1]。二、性质(1)计算数列各项的值:观察d[2]=f[1]+f[2]=d[1]+d[2]-d[1]=d[2]可知,数列第i项的值是可以用差分数组的前i项的和计算的,即d[i]=f[i]的...原创 2019-07-13 16:44:06 · 369 阅读 · 0 评论 -
线段树——区间离散化/压缩
一、基本概念线段树:线段树基本概念离散化:把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如:原数据:1,999,100000,15;处理后:1,3,4,2;原数据:{100,200},{20,50000},{1,400};处理后:{3,4},{2,6},{1,5};二...原创 2019-04-30 17:56:49 · 793 阅读 · 0 评论 -
回文字符串(Palindromic_String)
一、基本概念回文字符串:是一个正读和反读都一样的字符串。二、问题与算法(1)判断思想:1、初始化标志flag=true;2、输入字符串str,并获取其长度len;3、定义并初始化游标i=0,j=len-1,分别指向字符串开头和末尾;4、比较字符str[i]和str[j],若i==j,转至7,否则往下执行5;5、若str[i]和str[j]相等...原创 2019-04-30 17:07:49 · 63654 阅读 · 0 评论 -
ACM基础知识及算法
ACM 算法 难度 数据结构 栈 栈 1 单调栈 队列 一般队列 1 优先队列/单调队列 1 循环队列 2 双端队列 2 链表 一般链表 1 ...原创 2019-04-14 00:40:55 · 1105 阅读 · 0 评论 -
欧几里得算法和扩展欧几里得算法(Euclidean_Algorithm and Extended_Euclidean_Algorithm)
一、基本概念欧几里得算法:又名辗转相除法,计算两个整数a,b的最大公约数。扩展欧几里得算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。二、基本性质gcd函数的基本性质:gcd(a,b)=gcd(b,a)=gcd(-a,b)=gcd(|a|,|b|)贝祖定理:即如果a、b是整数...原创 2019-04-25 20:53:48 · 1545 阅读 · 0 评论 -
堆(Heap)
一、定义计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。二、特点Heap是一种数据结构具有以下的特点:1)完全二叉树;2)heap中存储的值是偏序;Min-heap: 父节点的值小于或等于子节点的值;Max-heap: 父节点的值大于或等于子节点的值;三、算法思想不必将值一个个地插入堆中,通过交换形成堆。假设根的...原创 2019-03-12 22:49:18 · 354 阅读 · 0 评论 -
ST表
一、定义ST表的功能很简单它是解决RMQ问题(区间最值问题)的一种强有力的工具它可以做到O(nlogn)预处理,O(1)查询最值二、算法ST表是利用的是倍增的思想拿最大值来说我们用Max[i][j]表示,从i位置开始的2j个数中的最大值,例如Max[i][1]表示的是i位置和i+1位置中两个数的最大值那么转移的时候我们可以把当前区间拆成两个区间并分别取最大值(注意这...原创 2019-03-10 23:39:56 · 395 阅读 · 0 评论 -
SG函数和SG定理(Sprague_Grundy)
一、必胜点和必败点的概念 P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败。 N点:必胜点,处于此情况下,双方操作均正确的情况下必胜。必胜点和必败点的性质: 1、所有终结点是 必败点 P 。(我们以此为基本前提进行推理,换句话说,我们以此为假设) 2、从任何必胜点N 操作,至少有一种方式可以进入必败点 P...原创 2019-01-07 00:02:15 · 4413 阅读 · 30 评论 -
矩阵快速幂(Matrix_Fast_Power)
一、基础知识(1)矩阵乘法https://blog.csdn.net/weixin_43272781/article/details/82899737简单的说矩阵就是二维数组,数存在里面,矩阵乘法的规则:A*B=C其中c[i][j]为A的第i行与B的第j列对应乘积的和,即:代码:const int N=100;int c[N][N];void multi(int ...原创 2019-01-07 00:01:36 · 865 阅读 · 0 评论 -
高精度计算(High-Precision_Calculation)
在说高精度加减乘除运算之前,我们先搞明白什么是高精度运算? 实际上高精度就是说参与运算的数据和运算结果的范围,超出标准数据类型能表示的数据大小范围的运算。这个时候,如果要得到正确的计算结果,显然不能依靠普通方法实现了。而要在普通运算原理的基础上,加以辅助算法来实现超大数据的计算。例如:求两个100位的数据的和,或者计算两个100位的数字乘积。这时就要用到高精度算法了。一、高精度...原创 2018-12-31 17:05:29 · 1251 阅读 · 0 评论 -
二分法
二分查找的解读汇总(一) 二分查找,最基本的算法之一,也是面试中常被考察的重点,因为基本的算法最能反映出一个人的基础是否扎实。本文对二分查找相关题目做一个总结。 在学习算法的过程中,我们除了要了解某个算法的基本原理、实现方式,更重要的一个环节是利用big-O理论来分析算法的复杂度。在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度。 时间复杂度按优劣排差不多...原创 2018-11-03 10:58:07 · 851 阅读 · 0 评论 -
Kruskal算法
1.概览Kruskal算法是一种用来寻找最小生成树的算法,由Joseph Kruskal在1956年发表。用来解决同样问题的还有Prim算法和Boruvka算法等。三种算法都是贪婪算法的应用。和Boruvka算法不同的地方是,Kruskal算法在图中存在相同权值的边时也有效。 2.算法简单描述1).记Graph中有v个顶点,e个边2).新建图Graphnew,Graphnew中...原创 2018-10-31 19:42:05 · 1097 阅读 · 0 评论 -
Prim算法
Prim算法1.概览普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英...原创 2018-10-31 19:40:52 · 562 阅读 · 0 评论 -
线段树
线段树原理 线段树是一颗二叉树,他的每个节点对应的都是一个区间,主要是通过对区间的分割和合并来修改节点的值, 然后再得到答案。 现在给你一个 目的为求区间和 所造出来的线段树 线段树。如下图所示。仔细观察,第一二三行方框内的值是他的下面2个子区间的和, 第四行的方框内的数字代表的是自身的值, 蓝色代表的是这个方框他包含的区间, 红色代表的是这个元素在数组中所...原创 2018-10-26 17:42:08 · 894 阅读 · 0 评论 -
离散化
离散化,就是把一些很离散的点给重新分配。举个例子,如果一个坐标轴很长(>1e10),给你1e4个坐标,询问某一个点,坐标比它小的点有多少。很容易就知道,对于1e4个点,我们不必把他们在坐标轴上的位置都表示出来,因为我们比较有多少比它小的话,只需要知道他们之间的相对大小就可以,而不是绝对大小,这,就需要离散化。而离散化又分为两种,分为的两种是对于重复元素来划分的。第一种是重复元素离...原创 2018-10-29 23:17:43 · 311 阅读 · 0 评论 -
扫描线
扫描线是一种用来处理矩形相交的面积问题的算法 渐近时间复杂度约为O(nlogn)O(nlogn)Q1.在坐标系给定n个矩形(以左下/右上角坐标给出) 求这些矩形面积的并例如下图 n=2 矩形1: (1,1) (3,3) 矩形2: (2,2) (4,4) A1.扫描线的过程大致可以描述为 将整个面积并 以n个矩形的 2n条纵边为界 分割为2n-1个部分求解即上图中...原创 2018-10-29 23:15:41 · 1426 阅读 · 1 评论 -
最长上升子序列(Longest increasing subsequence)
问题描述 对于一串数A={a1a2a3…an},它的子序列为S={s1s2s3…sn},满足{s1<s2<s3<…<sm}。求A的最长子序列的长度。动态规划法算法描述: 设数串的长度为n,L[i]为以第i个数为末尾的最长上升子序列的长度,a[i]为数串的第i个数。 L[i]的计算方法为:从前i-1个数中找出满足a...原创 2018-10-21 12:24:25 · 509 阅读 · 0 评论 -
背包问题-C++
第一讲 01背包题目给定物品个数n,背包容量v,每个物品都有一个体积c和价值w,要求向背包中装物品使得总价值最高.基本思路状态表示:f(i,j)表示前i个物品试图装入一个容量为j的背包的最大价值. 边界情况:f(0,j)=0. 状态转移:f(i,j)=max(f(i-1,j),f(i,j-save[i])+value[i]). 即装或不装第i个物品 时间复杂度O(VN) ...原创 2018-10-20 16:41:14 · 2368 阅读 · 0 评论 -
背包问题
前言本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作一份较为完善的NOIP难度的动态规划总结,名为《解动态规划题的基本思考方式》。现在你看到的是这个写作计划最先发布的一部分。背包问题是一个经典的动态规划模型。它既简单形象容易理解,又在某种程度上能够揭示动态规划的本质,故不少教材都把它作为动态规划部分的第一道例题,我也将它放在我的写作计划的...原创 2018-10-20 15:59:22 · 743 阅读 · 1 评论 -
动态规划(DP)算法
动态规划相信大家都知道,动态规划算法也是新手在刚接触算法设计时很苦恼的问题,有时候觉得难以理解,但是真正理解之后,就会觉得动态规划其实并没有想象中那么难。网上也有很多关于讲解动态规划的文章,大多都是叙述概念,讲解原理,让人觉得晦涩难懂,即使一时间看懂了,发现当自己做题的时候又会觉得无所适从。我觉得,理解算法最重要的还是在于练习,只有通过自己练习,才可以更快地提升。话不多说,接下来,下面我就...原创 2018-10-17 12:38:00 · 871 阅读 · 0 评论