算法与数据结构
文章平均质量分 82
jinixin
这个作者很懒,什么都没留下…
展开
-
A - B Problem(nyoj524,大数相等判断)
基本大数题,判断a与b是否相等。求A-B是否为0,可以转化成A是否等于BA,B用字符数组读入做以下几步操作:1.统一符号,正号消除,负号保留(+6==6)2.去除前导0(006==6)3.去除小数末尾的0(4.300==4.3,但4300的末尾0不用去除,即可认为只去除小数点后的0)4.最后用strcmp函数比较分别从a,b首元素开始扫,去除‘+’,前导‘0’,小数点后的末尾‘0’,把操作后的数存入x,y数组。原创 2015-03-21 11:37:30 · 685 阅读 · 0 评论 -
floyd求最短路径长度
floyd算法是非单源最短路算法的一种;非单源即算法运行一次,可求出任意节点至任意可到达节点的最短路长度,其时间复杂度为O(n^3)。相较于单源算法dijkstra求最短路,floyd有更简洁的代码。关于dijkstra求最短路长度,请点击这里;如果你还想记录dijkstra最短路的路径,请点击这里。floyd的思想,即从图中每次取出一个节点作为中途节点,看经过该中途节点,任意两节点间是否具有更小的距离,有则更新;算法在将所有节点均作为过中途节点之后结束。所以无论谁先作为中途节点,只要将所有节点均作为原创 2016-08-25 13:31:48 · 1456 阅读 · 0 评论 -
筛素法
筛素法是一种较快求得小于N的所有素数的方法,用时很短。我们先用模拟的方式来求10000以内的所有素数,再使用筛素法。相较于模拟的方法,筛素法的时间复杂度从O(n*n)接近了O(n)。原创 2017-04-17 20:05:07 · 645 阅读 · 0 评论 -
生成全排列
全排列在编程中不时会用到,全排列的生成可通过递归来实现,同时C++也为生成全排列提供了支持。代码中使用C++的“ next_permutation ”函数来产生全排列,注意:1. 数组中的n个元素必须从小到大有序排列,才能产生全部“n!”个全排列,否则只能产生部分排列。2. 假设数组有n个元素,“ next_permutation(p+i, p+n) ”表示固定第1~i位,只对第i+1位至第n位进行局部排列;当i为0时表示全排列。需要使用全排列的题目:Shower Line。原创 2017-04-17 20:35:35 · 783 阅读 · 0 评论 -
辗转相除法
辗转相除法可用于求两数的最大公约数与最小公倍数。输入两个数x、y,将较大的数赋值给a,较小的数赋值给b。通过上述代码运算后,“ a ”即为x与y的最大公约数,“ x*y/a ”为x与y的最小公倍数。使用辗转相处法的题目:Least Common Multiple原创 2016-08-06 20:16:07 · 1024 阅读 · 0 评论 -
哈夫曼编码的实现
哈夫曼编码虽然在acm上用到的似乎很少,但其经常作为一种基础算法出现在计算机类的书籍上。而我对哈夫曼编码的理解也仅仅局限在其用于编码领域,可以提高数据传输效率,或者是用于压缩文件?这些可能并不准确,我没有细细的去查证。哈夫曼编码可以通过构建哈夫曼树来得到。我们用一个简单的例子,来简单描述下哈夫曼编码是什么?有什么好处?场景:X地区需要向Y地区发送一些文本,两地之间通过电缆(或者通过电报)连接,要求用最少的二进制流传递信息:ABACDAAB原创 2016-08-08 21:13:17 · 21125 阅读 · 5 评论 -
统计难题(hdu1251,字典树)
字典树,Trie是个简单但实用的数据结构,通常用于实现字典查询。我们做即时响应用户输入的AJAX搜索框时,就是Trie本质上,Trie是一颗存储多个字符串的树。相邻节点间的边代表一个字符,这样树的每条分支代表一则子串,而树的叶节点则代表完整的字符串。和普通树不同的地方是,相同的字符串前缀共享同一条分支。1.构建字典树直接来个例子:输入“aed”和“ag”■首先存入“aed”字符串①先从root开始。发现root->p[0](“a”-“a”)并未分配内存,因此先分配内存,后将root->p[0]指原创 2015-03-25 16:41:29 · 683 阅读 · 0 评论 -
简述字典树
字典树主要用于字符串的存储与查询,其与哈希存储相比,具有近乎相同的时间效率和较高的空间效率,关键是字典树能完成一些用哈希很难解决又有较高时间要求的问题。假设给定我们一些小写英文字符构成的字符串,要求给一个前缀,能快速返回这组单词中拥有该前缀的数量,比如“brad”,“bread”,“bed”,“bedroom”,“bedding”这五个字符串。快速查找最好的办法就是用哈希了,时间复杂度为O(1)。但是查找具有相同前缀单词的数量,这个用哈希似乎并不能很好解决,下面我们看下字典树是如何处理的。如果没有定义val原创 2016-08-27 21:37:52 · 1316 阅读 · 0 评论 -
表达式求值
表达式求值的大致思想是将有运算符优先级顺序的算术表达式转换为无运算符优先级的后缀表达式,从而求出值。表达式分为三种;1. 前缀表达式(波兰式):前缀表达式是不含括号的算术表达式,它将运算符写在前面,操作数写在后面(如“3+4”的前缀表达式为“+34”)。2. 中缀表达式:可以包含括号,并且运算符处于操作数中间的算术表达式(“3+4”的中缀表达式仍为“3+4”),中缀表达式就是人们平时使用的算术表示方法。3. 后缀表达式(逆波兰式):不包含括号,运算符放在两个操作数后面的算术表达式(如“3+4”的原创 2017-04-16 21:20:31 · 2013 阅读 · 0 评论 -
广度优先搜索bfs
bfs即广度优先搜索算法,其是搜索算法中的一种。1. dfs常用于寻找是否存在解:其从A节点出发,选取一个临近点B,然后不断深入,在搜索完B的下属节点(EHIF)后,回到A再搜索临近A的C节点,以此类推。2. bfs则用于在最短的时间或最少的移动距离内找到解:其往往从A节点出发,搜索周围所有的围绕节点(BCD),然后再搜索所有围绕节点的临近围绕节点(EFGK),故bfs常常会超内存。acm中搜索算法常常表现为迷宫搜索。即在二维数组中告诉你初始坐标和最终目标,让你求最短的到达时间,每单位时间只能移原创 2016-08-06 16:35:21 · 1143 阅读 · 0 评论 -
快速排序算法模板(STL)
acm做题过程中经常要用到排序,一般都选用快排,在此对快排做个总结对于普通数组进行快排:qsort函数与sort函数;以绝对值排序,按真实值输出;对于字符串进行快排;对于多级结构体数组进行快排。①sort是一个改进版的qsort. std::sort函数,实验证明sort一般要快于qsort②优于qsort的一些特点:对大数组采取9项取样,更完全的三路划分算法,更细致的对不同数组大小采用不同方法排序。③sort是qsort的升级版,如果能用sort尽量用sort,使用也比较简单,不像qsort还得自原创 2015-03-21 22:55:11 · 1355 阅读 · 0 评论 -
A + B Problem II(hdu1002,大数加法)
想法:模拟计算的过程,从低位开始向高位分别测量字符数组a,b的长度计算他们的和并赋给c数组,c数组是倒过来存的,即c[0]=a的个位+b的个位....从a和b的低位往高位计算其中的t表示来自上一位的进位la与lb大小一般不同,但他们表示a和b中的同一位数(即都是个位,十位...)a[la]和b[lb]都是字符,必须变为数字后再相加(即分别减去'0')原创 2015-03-21 10:10:46 · 652 阅读 · 0 评论 -
dijkstra求最短路并记录路径
图中通过path数组来记录路径,path[i]=j表明节点i取得最小路径时,其最后一段走的是节点j到节点i。你也许会疑惑,我想知道的是整个路径呀,记录其中的最后一段有什么用呢?我们这样来看,path[5]=4表明0->5的最短路径最后走的一段是4->5;同理path[4]=2确定0->4的最短路径的最后一段是由节点2到达节点4;那么通过path[2]=3可以得到0->2最短路径最后一段是由节点3到达节点2;而path[3]=-1表示从出发节点0有一条直接路径连接到节点3。在这个过程中,我们获得经过的路径原创 2016-08-21 18:02:58 · 21808 阅读 · 10 评论 -
dijkstra求最短路径长度
dijkstra算法是单源最短路径算法的一种。所谓单源,即在一个有向图中,从一个顶点出发,算法可求该顶点至所有可到达顶点的最短路径长度。与之相对的称为非单源最短路,即算法运行一次可求出任意节点至任意可到达节点的最短路长度,其代表是floyd算法。单源最短路有两种常见算法,dijkstra算法和bellman-ford算法。前者只能用于求路径权值全部为非负值的最短路,但后者是可以求边权中出现负值的算法。既然非单源一次可以求出任意节点间的最短路,我们为什么还要使用单源算法呢?因为floyd的时间复杂度为O原创 2016-08-18 15:01:13 · 6116 阅读 · 1 评论 -
形参的改变如何影响实参
在编程中,形参的改变是无法影响实参的,那么有什么办法能将数据返还给调用自己的上层函数呢?通过return,全局变量,指针,引用即可。return的缺点是每次只能返回一个参数;如果想返回多个,可能需要将数据存入数组,然后将数组首地址返回给主调函数,较为麻烦。引用是C++中的概念,其相当于为变量起了个别名。其在初始化时必须赋值,且赋值后在程序中不可更改,这两点和指针有明显的区别。原创 2016-08-10 21:24:04 · 6775 阅读 · 0 评论 -
大菲波数(hdu1715,大数加法)
求0至1000的菲波数,本质上是大数加法。想法:先通过模拟菲波数列的推导过程,把0至1000的菲波数列全部计算出来(相当于计算1000次大数加法),将结果存入二维数组中,有点类似打表。最后根据输入的数,输出与之对应下标的菲波数。数是倒过来存在数组中的,即一个数的低位在数组的开头,高位在数组的末尾。java中有个大数类,用起来也比较方便。原创 2015-03-21 20:00:22 · 1046 阅读 · 0 评论 -
The Euler function(hdu2824,欧拉函数)
下面先对欧拉函数做一个简单介绍1.定义:对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目2.欧拉函数用φ函数表示。通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数。 比如φ(1)=1,φ(12)=12*(1-1/2)*(1-1/3)=4(12=2*2*3,12与1,5,7,11互质)想法:题意是告知a与b,要求求出a与b间的每个数的欧拉函数(包括a与b),且a与b很大原创 2015-03-22 20:40:29 · 841 阅读 · 0 评论 -
找新朋友(hdu1286,欧拉函数)
这道题大一的时候做过,那时候还不知道有欧拉函数,超时了n多次,最后借鉴了筛素法才过掉这道题是欧拉函数的基本题。想法:题意说的很清楚,求1~n中与n互质的数的数目首先将n的质因子求出,然后运用欧拉函数即可那么如何求质因子呢?可以看我转载的另一篇文章(“求一个数的质因数(1个或n个)”),用的是其中的第一种类型。其中的第二种类型将会在hdu2824中用到原创 2015-03-22 19:17:41 · 835 阅读 · 0 评论 -
今年暑假不AC(hdu2037,贪心算法-选择不相交区间)
下面先对”选择不相交区间“做个简单介绍描述:数轴上有n个区间(a,b)。选择尽量多的区间,使得这些区间两两没有公共点分析(可能有些绕):1. 如果有一个区间x包含区间y,那么我们选择时一定会选y。因为y更省空间,可以给其他区间留出更多的位置2. 现在我们先按b从小到大排列这些区间,将排列后的第一个区间加入“最优序列”,并向后选择下一个区间3. 然后根据上面1的规则,在多个区间的b相等的情况下,寻找是否存在一个区间的a大于”最优序列“中最后一个区间的b4. 如果存在,则把该区间加入序列末尾;如果不原创 2015-03-22 10:33:05 · 756 阅读 · 1 评论 -
牛顿迭代法(求函数的根)
在做二分与三分法的题时,听闻有牛顿迭代法(感觉很高大上),自己居然捧起书看了一些由于自己水平很渣,研究的并不深入。本篇未完结......个人感觉:1.使用牛顿迭代法,函数可以是任意2.优点:对其单调性无特殊要求 缺点:若在该函数值处有多个根,往往只能求出一个根3.与二分三分法比较 二分要求是单调函数 三分要求是凸性函数原创 2015-03-21 22:14:37 · 4333 阅读 · 0 评论 -
求一个数的质因数(1个或n个)
在做 “容斥原理” 题时经常需要求出一个数的质因子,而且不是所求数的位数很多,就是一次求n多数的质因子。第一种类型:用于每次只能求出一个数的质因子,适用于题目中给的n的个数不是很多,但是n又特别大的情况。第二种类型:求出1~n任意给定数的质因子,适用于题目中给的n比较多,但n不是很大的情况。原创 2015-03-22 10:58:29 · 5972 阅读 · 0 评论