
算法精讲
GMFTBY
for all
展开
-
二叉查找树BST总结
二叉查找树BST总结分析1.ADT(抽象数据类型)ADT BST{ 数据元素:数据节点(键值,位置信息)数据关系:父子关系基本操作:插入节点查找节点删除节点遍历节点(前中后层序)}2.二叉查找树性质:(不存在相同键值的节点)1.空树2.非空树并且左子树所有节点的键值均小于本节点的键值 右子树所有的节点的键值原创 2016-07-31 22:59:16 · 3115 阅读 · 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 评论 -
埃拉托色尼素数筛法
1.算法原理埃拉托色尼素数筛法是有古希腊数学家发明的一种快速求解范围内所有的素数的算法在我们讲解埃拉托色尼素数筛法之前,我们需要了解一下朴素的求素数的算法的工作原理首先:对于朴素的求素数的算法我们有过编程基础的人都会知道算法的原理很简单,首先从定义出发,一个数既然是素数那么就说明这个数除了1和本身以外不存在任何一个因子,所以朴素的算法就很直接的遍历一遍整个范围,我们对范围内原创 2016-10-17 13:12:59 · 4859 阅读 · 1 评论 -
Segment Tree 线段树总结
1.何为线段树准确的来说,线段树是一种平衡二叉树,当我们的要换分的区间大小是2的幂的话,刚好我们的线段树就是一颗满二叉树,但是如果不是的话,我们最多只能叫他是平衡二叉树正因为是一颗平衡二叉树,所以说,线段树的划分是均匀的,树高也稳定在logn上(这也就是我们的优化的源泉)上面只是个人的一点小理解,下面我们步入正题线段树Segment Tree,是BST二叉搜索树而一种应用,原创 2016-10-07 19:00:55 · 2582 阅读 · 0 评论 -
最小生成树算法汇总
较为完全的初学者学习最小生成树的利器,想要玩转ACM的小编倾情奉献原创 2016-07-28 15:38:29 · 4719 阅读 · 1 评论 -
关于快速排序算法本质的重要说明 - 考试考了不会就不要怪我
说明,本文章的针对已经大致的理解了快速排序的同学双向扫描 VS 单向扫描我们都知道,快速排序算法存在两种实现机制,一种是单向扫描法,一种是优化后的双向扫描法单向扫描:首先,我们需要知道,单向扫描是最正规的《算法导论》上给出的基本实现的过程伪代码如下data - array wait to sortn - the count of the arrayi - head po原创 2016-11-28 21:47:26 · 1600 阅读 · 1 评论 -
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 评论 -
Euler Graph - 欧拉图 详解
1.从哥尼斯堡七桥问题到欧拉图哥尼斯堡七桥问题:18世纪中叶在欧洲普鲁士的哥尼斯堡城内有一条贯穿全市的和河中有两个小岛,现在四块陆地有七座桥连接,引入问题,如何规划线路才能保证我们可以走过所有的边但是却保证不会重复呢这就是著名的哥尼斯堡七桥问题,现在通过图论证明哥尼斯堡问题是不存在解的,第一个发表论文证明了这个事实的人就是欧拉,该论文也是目前为止发现的最早的关于图论的论文,当然,这种问原创 2016-11-19 19:18:34 · 19985 阅读 · 2 评论 -
胜者树 败者树 K-路最佳归并树 高效外部排序
外部排序 外部排序和内部排序还是有非常的的不同的,我们的外部排序主要针对的优化目标也是不同的,这里我先从外部排序的物理基础开始进行讲解1.外存:外部存储设备,相对于我们的内部存储设备而言具有一些特点1.优点:永久存储能力,便携性,存储空间大2.缺点:访问速度相对于内存的访问速度来说极其低下(相差约5~6个数量级)因此对于外存来说,我们要遵守的基本操作原则就是:尽原创 2016-12-02 16:33:21 · 9488 阅读 · 1 评论 -
最短路径算法汇总
最短路径算法精讲1.Floyed2.Dijstra3.SPFA(队列优化Bellman算法)4.Best-First-Search——A算法5.启发式A*6.启发式的A*的平局打破7.目前自学存在的急需解决的问题8.最短路径算法的优劣比较9.各个算法的路径记录的策略1.Floyed(全局最短路径算法)1)数据结构的选择:原创 2016-07-19 21:07:42 · 24424 阅读 · 4 评论 -
AVL - 自平衡二叉树 - 详解
1.AVL说到AVL,我们就必须先要了解一下BSTLantian的BST总结在了解了有关BST的性质之后,我们现在就明白了因为在我们的插入的节点有序的情况下,我们的BST会出现偏树的情况,这会导致我们的ASL(平均查找长度)大大增加从而降低我们的查找效率因此,我们就需要一种BST的优化版本取克服这种输入造成的弊端(现在证明,在平均情况下,出现偏树的概率大致在45.6%),所以说,我原创 2016-11-23 16:26:18 · 1651 阅读 · 0 评论 -
ELFhash - 优秀的字符串哈希算法
1.字符串哈希:我们先从字符串哈希说起在很多的情况下,我们有可能会获得大量的字符串,每个字符串有可能重复也有可能不重复C不像Python有字典类型的数据结构,我们没有办法吧字符串当做是键值来保存,所以说我们需要一种hash函数将每个字符串都尽可能减少冲突的情况下去应设一个唯一的整形数据,方便我们的保存,这里我们就引入了字符串hash算法现在,有非常多的字符串hash算法都很原创 2016-10-29 22:12:37 · 15134 阅读 · 3 评论 -
GCD Extends_GCD 欧几里得算法+扩展欧几里得算法详解
1.欧几里得算法:我们从小学开始老师都会让我们求解一一种问题,叫做最大公约数,这里的最大公约数就叫做GCD当然求解最大公约数的算法也是非常的重要,我们在这里就引入欧几里得的算法,也就是著名的辗转相除法首先给出定义:GCD(a,b)=GCD(b,a%b)在这里有的人会问a,b到底哪个大才能使对的,其实在这里我们的a,b是没有大小之分的,要是硬说影响的话,是有那么一点影响,但是无关原创 2016-11-05 21:00:55 · 1135 阅读 · 0 评论 -
Miller-Rabin概率素数测试算法
本文首先鸣谢以下资料文章: 资料1 资料2 资料3 下面我们开始正文,从源头开始真正的梳理一下素数测试1.素数我们都知道,素数在当今的数论中占有非常重要的地位,主要原因就是素数最根本的性质——除了1,和自身以外,不会被任何一个数整除 并且,素数现在在我们的日常生活中伴有非常重要的地位,这一点的其一主要原因就是素数已经是密码学中最重要的一点,我们当今的密码学常常要涉及到利用超大素数作为我们的原创 2016-11-05 16:37:23 · 12238 阅读 · 0 评论 -
快速排序全面讲解(含复杂度证明)——即将引出八大排序算法
快速排序最经典额讲解,一看就会,不会以抽我耳刮子都可以原创 2016-08-07 23:07:58 · 9879 阅读 · 8 评论 -
并查集总结
1.并查集:什么是并查集,我们将并查集称之为不相交集合,在处理例如查找几个元素是否属于相同的集合的时候我们使用并查集可以达到非常高的处理速度(在合并和查找方面),我们利用并查集的思想有一点很重要就是我们我们利用的森林(父亲表示树)来对不同的不相交集合的状态,我们利用每个集合的根作为代表元素来对整个集合的数据进行“牵一发动全身”的合并处理这里我们的额=编号和处理对都是整数,但是如果我原创 2016-08-29 10:06:27 · 973 阅读 · 0 评论 -
微软面试百题003(归并排序/动态规划)
微软面试百题003 求子数组最大和原创 2016-08-08 13:17:34 · 1358 阅读 · 0 评论 -
手摇算法(三重反转算法/内存反转算法)
手摇算法最完整的讲解附带讲解手摇算法对归并排序的优化,你值得一看原创 2016-08-08 21:48:35 · 2816 阅读 · 0 评论 -
归并排序全解(含复杂度证明)
史上最全的归并排序讲解1.归并排序实现2.归并排序复杂度证明3.归并排序应用4.归并排序的优化原创 2016-08-08 12:32:13 · 8164 阅读 · 0 评论 -
从BST到SBT(田劲峰老师论文读后感)6.
优劣:优点:查找的时间复杂度:O(logn)非常高效的查找速度缺点:对于存在部分有序的输入序列,会导致BST偏向于偏树,进而使得树的深度逐渐变大,导致查找速度不断退化,最坏的退化情况是退化成双向链表引出:对于BST的缺点,我们需要克服,我们最终需要的而是一种技能高效的查找数据又可以避免特殊的输入序列而导致的BST 的退化,所以这时候,我们引入了一种新的数据结构——自平衡二叉树,通过不同的操作,是的,这种进化过得BST可以拥有自动调节树高的能力,是的我们查找的时间复杂度稳定在O(logn)附近,避免原创 2016-08-18 08:28:08 · 1508 阅读 · 1 评论 -
高精度总结
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 评论 -
LCS问题求解-动态规划
1.何为LCS问题:在求解LCS问题之前,我们需要先了解一下什么叫做最长公共子序列最长公共子序列:用我们最容易通俗理解的话语来解释的话,最长公共子序列就是两个或者多个串中,最长的相同的子序列ps:子序列可以不连续,但是有先后的次序关系LCS问题应用非常的广泛2.如何求解LCS问题:1.暴力搜索LCS问题如果我们只仅限于两个的=字符串的话,我们的首先的思考的策略是原创 2016-09-15 00:11:54 · 7080 阅读 · 2 评论 -
巧用循环不变式书写正确的二分查找算法(看不懂我撞墙)
1.二分查找介绍在进行开始之前,我们县要来正确的认识一下什么是二分查找算法上过数值分析这门课的同学一定在迭代那一刻里面清楚的了解过一个名词叫做对分法实际上,对分法的本质就是二分查找下面我们来介绍一下二分查找算法Binary-Search是不同于顺序扫描的一种极其高效的查找算法首先我们县要来了解一下二分查找算法相对于朴素的顺序查找算法的优劣对于朴素的顺序查找算法(不局原创 2016-10-10 00:25:27 · 2402 阅读 · 2 评论 -
哈夫曼(最优二叉树)
最优二叉树:定义:路径:数的路径就是从书中的一个节点到树中的另一个节点的分支的个数长度,路径上的分支数目我们称之为长度树的路径长度:从树根到每一个节点的长度之和(完全二叉树是一种树的路径最短的二叉树)节点的带权路径长度:从根节点到该节点的路径的分支数目与节点的权值的乘积树的带权路径的长度:树中的所有的节点的带权路径长度之和,并且,我们将改长度定义为WPL最优二叉树(哈夫曼树原创 2016-09-08 16:15:48 · 4368 阅读 · 0 评论 -
位运算全解(含位段)
1.位运算操作符符号 描述 运算规则 by MoreWindows& 与两个位都为1时,结果才为1| 或 两个位都为0时,结果才为0^ 异或两个位原创 2016-10-21 22:50:28 · 1351 阅读 · 0 评论 -
快速幂取模算法详解
1.大数模幂运算的缺陷:快速幂取模算法的引入是从大数的小数取模的朴素算法的局限性所提出的,在朴素的方法中我们计算一个数比如5^1003%31是非常消耗我们的计算资源的,在整个计算过程中最麻烦的就是我们的5^1003这个过程缺点1:在我们在之后计算指数的过程中,计算的数字不都拿得增大,非常的占用我们的计算资源(主要是时间,还有空间)缺点2:我们计算的中间过程数字大的恐怖,我们现有的计算机原创 2016-11-05 10:40:41 · 44627 阅读 · 14 评论 -
Shell-Sort 增量排序算法 总结
1.Shell - Sort希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。我们都知道直接插入排序算法是相对来说比较低效的算法,但是正是插入排序算法的特性决定了我们在数据量小的时候,数据基本有序的时候的排序效果往往比一些高级排序算法构架行之有效,更加快速在我们开始了解Shell-Sor原创 2016-11-27 23:49:19 · 3176 阅读 · 0 评论