
算法
文章平均质量分 58
John_pascal
这个作者很懒,什么都没留下…
展开
-
二分查找
二分查找:二分查找,是查找一个数的好方法。其优点在于:因为是折半查找,时间复杂度:O(logn)而缺点在于:查找的序列必须得是有序序列。对于二分查找,我们一般是查找一个数列的里的一个数,代码如下:var n,i,l,r,mid,x:Longint; a:Array[1..100] of longint;begin rea原创 2016-03-20 21:59:34 · 789 阅读 · 0 评论 -
浅析最长不下降子序列一题的方法
对于最长不下降子序列一题,问题描述如下:有长度为N的序列:A1 A2 …..An求最长不下降子序列:Ai1,Ai2,,,,,Aik, 其中ai1求最长不下降子序列的长度 一看最长不下降子序列,最先想到的肯定是O(n²)的DP解法,当然,这里还是写下代码,加深理解:var a,f:array[1..1000] of longint; n原创 2016-08-08 15:08:38 · 1187 阅读 · 0 评论 -
2016.7.20晚 听课收获
今天,跟着昨天晚上的图的相关知识,他又讲了图的遍历,也就是求最短路径。求最短路径先讲了floyd算法。最大的收获就是明白了为什么中转点k要放在外里面。可以用反证法。意思就是:如果当前中转点放在外面或i,j循环的中间时,就会使得如果当前第k个点都大于i,j的话,第i个点到第k个点或第j个点到k点就会还没算好,如果还没算好再去更新i到j的最短路径就没有意义了,也就会使得答案错误。而放在里面则不原创 2016-07-21 22:54:49 · 464 阅读 · 0 评论 -
7.18 图的相关知识
首先,那个师兄跟我们讲了讲图的一些基础,例如邻接矩阵可以用邻接表代替之类什么的(然而在没听过邻接表这个东西的时候就一般都这样储存了,原因是我们拥有智商)。接下来统一记录我们以前不知道的一些知识:无向图有向图:其实顾名思义,无向图就是没有方向,只要与其相连的边都可以互相到达。而有向图就是指只能按照一条边边的方向到达一条边。阶:图中顶点的个数为阶。完全图:每一条边都与其余的每条边相连(原创 2016-07-20 20:21:37 · 361 阅读 · 0 评论 -
对于gcd欧几里得的拓展
对于函数gcd(欧几里得)的递归定理:gcd(a,b)=gcd(b,a mod b)对于这个函数的证明,真的是费劲了口舌,推出一大堆看的似懂非懂的公式,最后我只得出了一个结论:根本不需要公式证明。设gcd(a,b)=k,则a=xk,b=yk。而当a mod b之后答案也一定是zk。这个z是x mod y的结果,但是最后一定是跟着一个因数k的,所以我们知道a mod b与原创 2016-05-09 21:10:03 · 926 阅读 · 0 评论 -
浅析线性筛法
今天晚上,在家里自学了一下线性筛法,还是比较容易理解的,并没有想象的那么难。所谓线性就是O(n)的效率咯,线性筛法较快的一个本质就是他不会干重复的事,例如12——普通的筛法在素数2时候筛一次,素数3时筛一次,很明显这些是不必要的选择,我们可以舍去。所以,在线性筛法里的优化就是,如果枚举素数倍数的数除以当前所拥有的质数的其中一个数的余数为0的时候,则可以退出了。如原创 2016-08-05 22:00:43 · 999 阅读 · 0 评论 -
《对寻找第i个顺序统计的数》一文的研究。
对于寻找第i个顺序统计的数,可以形式的定义如下:对于这个问题,最原始的方法就是将1~n个数从小到大排序,然后输出第i个数。用快排的话,时间复杂度就是O(nlogn),但是我们其实可以对快速排序进行优化。快速排序是以二分的思想,对分出的每边进行排序,然而当我们要求第i个数时,知道在快拍的哪一边的时候,我们还需对快排的另一边排序吗?毋庸置疑,这是不用的,所以这就是优化—原创 2016-05-08 12:59:07 · 654 阅读 · 0 评论 -
堆的相关知识
我们知道在一个堆中满足任意子树的根大于其儿女则,这个堆为最大堆,反之亦然,为最小堆。我们也有如下几个较为重要的性质:(1):一个堆中至多有2^(n+1) -1个节点,至少有2^n个节点。(2):设堆A有n个节点,则其叶节点下标为⌊(n/2)⌋+1,⌊(n/2)+2⌋,⌊(n/2)+3⌋,……,n。(3):设MAX-HEAPIFY(i)过程可使以第i个节点为根的子树成为最大堆。(原创 2016-05-18 22:27:26 · 496 阅读 · 0 评论 -
高精度乘法
高精度乘法也很简单,只贴下代码:var len1,len2,i,j:longint; a,b,c:array[0..1000] of Longint; s1,s2,s:ansistring;begin readln(s1); readln(s2); if (length(s1)<length(s2原创 2016-04-17 21:51:56 · 408 阅读 · 0 评论 -
高精度减法
高精度减法也比较简单,与加法很相似,只贴一下代码吧:var len1,len2,i:longint; a,b,c:array[0..10010] of Longint; s1,s2,s:ansistring;begin readln(s1); readln(s2); if (length(s1)<原创 2016-04-17 21:48:03 · 330 阅读 · 0 评论 -
高精度加法
做高精度加法其实只要在草稿纸上画一下,模拟一下这个过程就很容易做出来了:代码:var len1,len2,i:longint; a,b,c:array[0..10010] of Longint; s1,s2,s:ansistring;begin readln(s1); readln(s2); if原创 2016-04-17 21:41:47 · 365 阅读 · 0 评论 -
Euler算法
Euler:欧拉回路是值在图G中恰好可以经过每条边一次。俗称一笔画问题。算法具体描述如下:假设有一张无向图G,且必有一个解,无向图中若存在欧拉回路,则必须所有顶点度数都为偶数,或者有且仅有两个顶点度数为奇数来做为起终点,才可以有欧拉回路,因规定必有一条欧拉回路,则有一个度数奇数的点则可以马上从这个点dfs了,因为故有下一个奇数,且从下一个奇数开始便不符合字典序了。如若没有奇数则从1开始原创 2016-04-16 11:52:08 · 1411 阅读 · 0 评论 -
SPFA算法
SPFA:对于spfa算法,摘自百度百科的一段话:{SPFA(Shortest Path Faster Algorithm)(队列优化)算法是求单源最短路径的一种算法,在Bellman-ford算法的基础上加上一个队列优化,减少了冗余的松弛操作,是一种高效的最短路算法。}注意他是一个队列优化,也有点像bfs,是在Bellman-ford算法的优化,也是一种高效的最短路算法,一般原创 2016-04-15 21:04:36 · 579 阅读 · 0 评论 -
Floyd算法
FLOYD:floyd算法可谓是初学者当中接触过最短路径的必学的一个算法,也是很多OIer转向学习算法的第一个算法,这个算法就是——floyd。floyd算法的经典例子就是{usaco 2.4.4Bessie Come Home回家}这道题目。典型的floyd算法,当然也可以用spfa解决。下面解释一下floyd算法:floyd是求一个单源最短路径,也就是一个点到其他点的距原创 2016-04-15 21:09:24 · 763 阅读 · 0 评论 -
快速求解1~n的每个数字出现的次数.
对于快速求解1~n中每个数字出现次数的问题:在做奥数题时,我们很多时候都会遇到这类问题:在1~999页中数字"1"出现了几次,数字"2"出现了几次...对于这类问题在用笔算时我们一般是把1~999分为几个阶段:1~910~99100~999...10^n~10^n*10-1这样子一个阶段一个阶段的求解,可以有效的快速的解答出来,然而在编程中,遇到这类问题,我们一般是原创 2016-03-21 20:13:58 · 2658 阅读 · 0 评论