
算法杂论
GMFTBY
for all
展开
-
ELFhash - 优秀的字符串哈希算法
1.字符串哈希:我们先从字符串哈希说起在很多的情况下,我们有可能会获得大量的字符串,每个字符串有可能重复也有可能不重复C不像Python有字典类型的数据结构,我们没有办法吧字符串当做是键值来保存,所以说我们需要一种hash函数将每个字符串都尽可能减少冲突的情况下去应设一个唯一的整形数据,方便我们的保存,这里我们就引入了字符串hash算法现在,有非常多的字符串hash算法都很原创 2016-10-29 22:12:37 · 15134 阅读 · 3 评论 -
Miller-Rabin概率素数测试算法
本文首先鸣谢以下资料文章: 资料1 资料2 资料3 下面我们开始正文,从源头开始真正的梳理一下素数测试1.素数我们都知道,素数在当今的数论中占有非常重要的地位,主要原因就是素数最根本的性质——除了1,和自身以外,不会被任何一个数整除 并且,素数现在在我们的日常生活中伴有非常重要的地位,这一点的其一主要原因就是素数已经是密码学中最重要的一点,我们当今的密码学常常要涉及到利用超大素数作为我们的原创 2016-11-05 16:37:23 · 12238 阅读 · 0 评论 -
快速幂取模算法详解
1.大数模幂运算的缺陷:快速幂取模算法的引入是从大数的小数取模的朴素算法的局限性所提出的,在朴素的方法中我们计算一个数比如5^1003%31是非常消耗我们的计算资源的,在整个计算过程中最麻烦的就是我们的5^1003这个过程缺点1:在我们在之后计算指数的过程中,计算的数字不都拿得增大,非常的占用我们的计算资源(主要是时间,还有空间)缺点2:我们计算的中间过程数字大的恐怖,我们现有的计算机原创 2016-11-05 10:40:41 · 44627 阅读 · 14 评论 -
位运算全解(含位段)
1.位运算操作符符号 描述 运算规则 by MoreWindows& 与两个位都为1时,结果才为1| 或 两个位都为0时,结果才为0^ 异或两个位原创 2016-10-21 22:50:28 · 1351 阅读 · 0 评论 -
蒙特卡洛算法
1.何为蒙特卡洛算法蒙特卡罗方法于20世纪40年代美国在第二次世界大战中研制原子弹的“曼哈顿计划”计划的成员S.M.乌拉姆和J.冯·诺伊曼首先提出。数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。在这之前,蒙特卡罗方法就已经存在。1777年,法国Buffon提出用投针实验的方法求圆周率∏。这被认为是蒙特卡罗方法的起源。原创 2016-10-11 22:50:14 · 6318 阅读 · 0 评论 -
哈夫曼(最优二叉树)
最优二叉树:定义:路径:数的路径就是从书中的一个节点到树中的另一个节点的分支的个数长度,路径上的分支数目我们称之为长度树的路径长度:从树根到每一个节点的长度之和(完全二叉树是一种树的路径最短的二叉树)节点的带权路径长度:从根节点到该节点的路径的分支数目与节点的权值的乘积树的带权路径的长度:树中的所有的节点的带权路径长度之和,并且,我们将改长度定义为WPL最优二叉树(哈夫曼树原创 2016-09-08 16:15:48 · 4368 阅读 · 0 评论 -
巧用循环不变式书写正确的二分查找算法(看不懂我撞墙)
1.二分查找介绍在进行开始之前,我们县要来正确的认识一下什么是二分查找算法上过数值分析这门课的同学一定在迭代那一刻里面清楚的了解过一个名词叫做对分法实际上,对分法的本质就是二分查找下面我们来介绍一下二分查找算法Binary-Search是不同于顺序扫描的一种极其高效的查找算法首先我们县要来了解一下二分查找算法相对于朴素的顺序查找算法的优劣对于朴素的顺序查找算法(不局原创 2016-10-10 00:25:27 · 2402 阅读 · 2 评论 -
微软面试百题008——后序遍历找BST
1.题目描述:通过我们给出的一个后序遍历结果,找出一颗二叉树满足要求,找到了,返回true,没找到返回false2.解法:又是一道BST 性质和后序遍历结合的题:首先BST我们就不过多赘语了:BST总结我们这道题主要考的使我们的后序遍历的性质:我们对一个给出的后序遍历可以这么来理解:我们把后序遍历先拆开两块:后序遍历的划分特点A |B |C原创 2016-08-13 21:25:32 · 1023 阅读 · 0 评论 -
KMP next数组优化的思路彻底解析
首先我们假设各位都已经了解了next数组的作用,在这里我们的next数组记录的是该位置之前的子模式串的最长公共前后缀非常浅显易懂的KMP算法讲解那么我们优化的思路就来了:这点优化的思路在于假设模式串中q号位置失配了,那么我们下一次要跳转到next[q-1]号位置进行匹配,但是如果pattern[q]==pattern[next[q-1]]的话,那么我们这一次的匹配还是失败的,我们需原创 2016-08-13 15:39:50 · 2183 阅读 · 0 评论 -
KMP算法总结(纯算法,为优化,没有学应用)
如果你看不懂KMP算法,那就看一看这篇文章( 绝对原创,绝对通俗易懂)时间 2014-03-09 20:32:21 CSDN博客原文 http://blog.csdn.net/u011564456/article/details/20862555主题 算法如果你看不懂 KMP 算法,那就看一看这篇文章 ( 绝对原创,绝对通俗易懂 )KMP 算法,俗称转载 2016-08-13 14:12:47 · 1332 阅读 · 0 评论 -
GCD Extends_GCD 欧几里得算法+扩展欧几里得算法详解
1.欧几里得算法:我们从小学开始老师都会让我们求解一一种问题,叫做最大公约数,这里的最大公约数就叫做GCD当然求解最大公约数的算法也是非常的重要,我们在这里就引入欧几里得的算法,也就是著名的辗转相除法首先给出定义:GCD(a,b)=GCD(b,a%b)在这里有的人会问a,b到底哪个大才能使对的,其实在这里我们的a,b是没有大小之分的,要是硬说影响的话,是有那么一点影响,但是无关原创 2016-11-05 21:00:55 · 1135 阅读 · 0 评论 -
Radix-Sorting(线性阶 多关键字排序算法 基数排序)
1.引入:我们发现也经过证实,交换式的排序的算法的时间复杂度的下界是O(n*lgn),但是这真的就是我们的排序算法的极限了吗,事实并不是这样的,我们的多关键字的分配式排序--本文的基数排序就是如此却是打破了这样的瓶颈分配式的Radix-Sorting算法成功的将我们的算法的复杂度优化到无限接近线性阶的完美的O(n),下面,我们就来一一道来2.前身:桶式排序:我们先假定排序这样的原创 2016-09-30 13:55:10 · 1440 阅读 · 0 评论 -
字典树 Trie
1.什么是字典树字典树,又称单词查找树或者键树,或者前缀树,是哈希树的一种变种,典型的应用就是保存大量的字符串的信息,统计和排序大规模字符串,因为采用了前缀的概念,压缩存储了部分的字符串,所以说,查询和查找效率都非常的高,接近于哈希主要思想就是,利用了空间换时间的思路,将多个字符串的最大公共前缀压缩存储示例图:2.字典树的ADT描述如下:1.根节点不含有键值2.原创 2016-10-03 12:52:06 · 910 阅读 · 0 评论 -
AVL - 自平衡二叉树 - 详解
1.AVL说到AVL,我们就必须先要了解一下BSTLantian的BST总结在了解了有关BST的性质之后,我们现在就明白了因为在我们的插入的节点有序的情况下,我们的BST会出现偏树的情况,这会导致我们的ASL(平均查找长度)大大增加从而降低我们的查找效率因此,我们就需要一种BST的优化版本取克服这种输入造成的弊端(现在证明,在平均情况下,出现偏树的概率大致在45.6%),所以说,我原创 2016-11-23 16:26:18 · 1651 阅读 · 0 评论 -
胜者树 败者树 K-路最佳归并树 高效外部排序
外部排序 外部排序和内部排序还是有非常的的不同的,我们的外部排序主要针对的优化目标也是不同的,这里我先从外部排序的物理基础开始进行讲解1.外存:外部存储设备,相对于我们的内部存储设备而言具有一些特点1.优点:永久存储能力,便携性,存储空间大2.缺点:访问速度相对于内存的访问速度来说极其低下(相差约5~6个数量级)因此对于外存来说,我们要遵守的基本操作原则就是:尽原创 2016-12-02 16:33:21 · 9488 阅读 · 1 评论 -
Euler Graph - 欧拉图 详解
1.从哥尼斯堡七桥问题到欧拉图哥尼斯堡七桥问题:18世纪中叶在欧洲普鲁士的哥尼斯堡城内有一条贯穿全市的和河中有两个小岛,现在四块陆地有七座桥连接,引入问题,如何规划线路才能保证我们可以走过所有的边但是却保证不会重复呢这就是著名的哥尼斯堡七桥问题,现在通过图论证明哥尼斯堡问题是不存在解的,第一个发表论文证明了这个事实的人就是欧拉,该论文也是目前为止发现的最早的关于图论的论文,当然,这种问原创 2016-11-19 19:18:34 · 19985 阅读 · 2 评论 -
快排光芒下被忽视的Partition函数
1.前言:看到这篇标题,没有学过快排的人自然是不知道Partition函数的意思和作用,这里附上学习的连接Lantian的快排总结我们现在都是被快排蒙蔽了双眼,没有意识到快最核心的划分函数Partition,当然Partition函数也就不止于快排这里,本文就从多方面来为展示Partition函数的本质和扩展作用2.快排中的Partition及其优化:在算法导论中我们对Partit原创 2016-11-02 19:33:53 · 3904 阅读 · 0 评论 -
DAG - AOV - AOE - CPM - Topological-Sort 详解
1.DAG(Directed acycline graph)DAG图,又称有向无环图,简称为DAG,DAG是相对更像是有向树一样的数据结构,用处十分的广泛1.表达式树:DAG可以模拟表达式树,按照数据结构老师的话来说,在操作系统方面的用处更加的广泛2.检查图的环路:我们都知道检查一个无向图是否存在回路是非常的简单的,我们只需要DFS遍历一遍就能判断出来但是我们检查一个有向图原创 2016-11-16 12:17:38 · 2154 阅读 · 0 评论 -
关于快速排序算法本质的重要说明 - 考试考了不会就不要怪我
说明,本文章的针对已经大致的理解了快速排序的同学双向扫描 VS 单向扫描我们都知道,快速排序算法存在两种实现机制,一种是单向扫描法,一种是优化后的双向扫描法单向扫描:首先,我们需要知道,单向扫描是最正规的《算法导论》上给出的基本实现的过程伪代码如下data - array wait to sortn - the count of the arrayi - head po原创 2016-11-28 21:47:26 · 1600 阅读 · 1 评论 -
最小生成树算法汇总
较为完全的初学者学习最小生成树的利器,想要玩转ACM的小编倾情奉献原创 2016-07-28 15:38:29 · 4719 阅读 · 1 评论 -
Segment Tree 线段树总结
1.何为线段树准确的来说,线段树是一种平衡二叉树,当我们的要换分的区间大小是2的幂的话,刚好我们的线段树就是一颗满二叉树,但是如果不是的话,我们最多只能叫他是平衡二叉树正因为是一颗平衡二叉树,所以说,线段树的划分是均匀的,树高也稳定在logn上(这也就是我们的优化的源泉)上面只是个人的一点小理解,下面我们步入正题线段树Segment Tree,是BST二叉搜索树而一种应用,原创 2016-10-07 19:00:55 · 2582 阅读 · 0 评论 -
埃拉托色尼素数筛法
1.算法原理埃拉托色尼素数筛法是有古希腊数学家发明的一种快速求解范围内所有的素数的算法在我们讲解埃拉托色尼素数筛法之前,我们需要了解一下朴素的求素数的算法的工作原理首先:对于朴素的求素数的算法我们有过编程基础的人都会知道算法的原理很简单,首先从定义出发,一个数既然是素数那么就说明这个数除了1和本身以外不存在任何一个因子,所以朴素的算法就很直接的遍历一遍整个范围,我们对范围内原创 2016-10-17 13:12:59 · 4859 阅读 · 1 评论 -
LCS问题求解-动态规划
1.何为LCS问题:在求解LCS问题之前,我们需要先了解一下什么叫做最长公共子序列最长公共子序列:用我们最容易通俗理解的话语来解释的话,最长公共子序列就是两个或者多个串中,最长的相同的子序列ps:子序列可以不连续,但是有先后的次序关系LCS问题应用非常的广泛2.如何求解LCS问题:1.暴力搜索LCS问题如果我们只仅限于两个的=字符串的话,我们的首先的思考的策略是原创 2016-09-15 00:11:54 · 7080 阅读 · 2 评论 -
全排列生成算法
1.什么是全排列:我们假如有一串式子,排列组合的结果会有很多种,全排列就是按照字典序有序的将所有的排列组合的性质的陈列出来问题可以这么描述:对于给定的集合A{a1,a2,...,an},其中的n个元素互不相同,如何输出这n个元素的所有排列(全排列)2.求解算法:1.DFS(我们大多数人所谓的递归的方法):我们来这么看这个问题,加入有n个数据要进行全排列,我们可以假想我们原创 2016-08-11 23:06:25 · 1231 阅读 · 0 评论 -
UESTC 1252 24点问题 DFS
1.问题描述:24点就是给你一串数字,问你是否通过加减乘除括号构成24点。沈爷觉得这个很好玩,就决定考考你,给你44个数,可以交换位置,可以用加减乘除和括号,是否能构成2424点呢?注意哦~这里的除法并不是整数除法,比如样例Input第一行TT,表示有多少组测试数据,1≤T≤501≤T≤50接下来TT行,每行44个正整数a1a1, a2a2, a原创 2016-08-11 21:19:46 · 953 阅读 · 0 评论 -
HDU3790 SPFA
我终于会了SPFA#include"iostream"#include"cstdlib"#include"cstring"#include"cstdio"using namespace std;int map[1005][1005];int cost[1005][1005];int dis[1005];int val[1005];int inf=9999999;int bo原创 2016-07-11 15:58:13 · 326 阅读 · 0 评论 -
HDU2544 spfa
#include"iostream"#include"cstdio"#include"cstdlib"#include"cstring"#include"queue" using namespace std;int u[70005];int v[70005];int w[70005];int first[105];int nextk[20010];int n,m;int原创 2016-07-11 15:29:36 · 307 阅读 · 0 评论 -
SPFA最短路径模板
int spfa(int src){ queue q; bool inq[SIZE] = {0}; for(int i = 0; i <= n; i++) d[i] = (i == src)? 0:INF; q.push(src); while(!q.empty()) { int x = q.front(); q.pop();原创 2016-07-11 12:24:32 · 302 阅读 · 0 评论 -
HDU 3790单源最短路径
这个题注意一点,千万不要用cin,太慢#include"iostream"#include"cstdio"#include"cstdlib"#include"cmath"using namespace std;int map[1005][1005];int cost[1005][1005];int book[1005];int dis[1005];int val[1005原创 2016-07-11 10:51:10 · 337 阅读 · 0 评论 -
HDU3003 快速幂取模
对于这道题,我们可以退出公式(2^(n-1)+1)%nACD代码如下:再次小心LL的问题#include"iostream"#include"cstdio"#include"cstdlib"using namespace std;long long quickmod(long long a,long long b,long long c){ long long ans=1;原创 2016-07-10 17:03:17 · 358 阅读 · 0 评论 -
HDU1061 快速幂取模
#include"iostream"#include"cstdio"using namespace std;int quickmod(long long a,long long b,int c){ int ans=1; while(b>0) { if(b%2==1) ans=(ans*a)%c; b/=2; a=(a*a)%c; } return ans;}原创 2016-07-10 16:42:04 · 338 阅读 · 0 评论 -
POJ3070 斐波那契矩阵快速幂
AC代码:#include"iostream"#include"cstdio"#include"cstdlib"using namespace std;typedef struct node{ int a[2][2];}point;point math(point c,point d){ point k; k.a[0][0]=k.a[1][1]=k.a[0][1]=k.a原创 2016-07-10 16:29:16 · 404 阅读 · 0 评论 -
POJ1995 快速幂取模
3POJ 19951642 33 44 55 63612312374859 30293821713 18132AC代码: 小心第二个用例中要求了int会爆掉所以我们用 long long#include"iostream"#include"cstdio"#include"cstdlib"using namespace原创 2016-07-10 15:39:33 · 429 阅读 · 0 评论 -
矩阵快速幂
和上一章一样,矩阵快速幂也是利用了乘法的结合律进行的优化唯一的不同就是,数乘转化成矩阵乘法点击打开链接大神的笔记真的很通悟原创 2016-07-10 15:38:26 · 251 阅读 · 0 评论 -
针对最近最短路径的问题的考虑
最近在做最短路径的题的时候,经常用到SPFA,但是我不是很喜欢用STL,所以自己模拟了一下队列,但是针对HDU上大数据的题总是RE 现在明白了,队列的话,我要是开的稍微小一点的话,那么队列的开头是一直在后退,但是队列的尾部一直在延伸,完全有可能会出现队列爆队的情况这时候就会运行时错误,造成RE了,以后一定注意原创 2016-07-11 16:03:03 · 276 阅读 · 0 评论 -
二叉查找树BST总结
二叉查找树BST总结分析1.ADT(抽象数据类型)ADT BST{ 数据元素:数据节点(键值,位置信息)数据关系:父子关系基本操作:插入节点查找节点删除节点遍历节点(前中后层序)}2.二叉查找树性质:(不存在相同键值的节点)1.空树2.非空树并且左子树所有节点的键值均小于本节点的键值 右子树所有的节点的键值原创 2016-07-31 22:59:16 · 3115 阅读 · 0 评论 -
哈希表全解(简介+构造+冲突处理+查找分析计算+诸多要点)
目前参考了大量的优秀的大牛的博文自己总计的超详细哈希表1.哈希表的简介2.哈希表的哈希函数构造3.冲突处理4.查找分析计算5.C++完整实现代码原创 2016-08-10 22:09:42 · 3979 阅读 · 0 评论 -
高精度总结
Copy from others:我们都知道 int类型占32bit 可表示范围: [-2147483648,2147483647] long long类型 64bit可表示范围:[-9223372036854775808,9223372036854775807]int可以完整表达9位数字,long long可以完整表达18位。(完整表达的意思是能表示到该位的任意数字)原创 2016-09-12 16:13:27 · 475 阅读 · 0 评论 -
微软面试百题001——BST转化有序双向链表
微软面试百题001题解,超详细的解释内容,算法实现,以及本博主倾力打造的BST总结连接,绝对让想学之人有所学,言简意赅,赚的就是回头客原创 2016-08-06 14:40:14 · 3103 阅读 · 0 评论 -
从BST到SBT(田劲峰老师论文读后感)6.
优劣:优点:查找的时间复杂度:O(logn)非常高效的查找速度缺点:对于存在部分有序的输入序列,会导致BST偏向于偏树,进而使得树的深度逐渐变大,导致查找速度不断退化,最坏的退化情况是退化成双向链表引出:对于BST的缺点,我们需要克服,我们最终需要的而是一种技能高效的查找数据又可以避免特殊的输入序列而导致的BST 的退化,所以这时候,我们引入了一种新的数据结构——自平衡二叉树,通过不同的操作,是的,这种进化过得BST可以拥有自动调节树高的能力,是的我们查找的时间复杂度稳定在O(logn)附近,避免原创 2016-08-18 08:28:08 · 1508 阅读 · 1 评论