算法与数据结构
经典的数据结构以及操作的算法
算法导论中涉及到的经典算法
其他算法书看重的涉及到的优秀的算法
统统进行摘录和讲解
GMFTBY
for all
展开
-
胜者树 败者树 K-路最佳归并树 高效外部排序
外部排序 外部排序和内部排序还是有非常的的不同的,我们的外部排序主要针对的优化目标也是不同的,这里我先从外部排序的物理基础开始进行讲解1.外存:外部存储设备,相对于我们的内部存储设备而言具有一些特点1.优点:永久存储能力,便携性,存储空间大2.缺点:访问速度相对于内存的访问速度来说极其低下(相差约5~6个数量级)因此对于外存来说,我们要遵守的基本操作原则就是:尽原创 2016-12-02 16:33:21 · 9296 阅读 · 1 评论 -
关于快速排序算法本质的重要说明 - 考试考了不会就不要怪我
说明,本文章的针对已经大致的理解了快速排序的同学双向扫描 VS 单向扫描我们都知道,快速排序算法存在两种实现机制,一种是单向扫描法,一种是优化后的双向扫描法单向扫描:首先,我们需要知道,单向扫描是最正规的《算法导论》上给出的基本实现的过程伪代码如下data - array wait to sortn - the count of the arrayi - head po原创 2016-11-28 21:47:26 · 1548 阅读 · 1 评论 -
Shell-Sort 增量排序算法 总结
1.Shell - Sort希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。我们都知道直接插入排序算法是相对来说比较低效的算法,但是正是插入排序算法的特性决定了我们在数据量小的时候,数据基本有序的时候的排序效果往往比一些高级排序算法构架行之有效,更加快速在我们开始了解Shell-Sor原创 2016-11-27 23:49:19 · 3059 阅读 · 0 评论 -
AVL - 自平衡二叉树 - 详解
1.AVL说到AVL,我们就必须先要了解一下BSTLantian的BST总结在了解了有关BST的性质之后,我们现在就明白了因为在我们的插入的节点有序的情况下,我们的BST会出现偏树的情况,这会导致我们的ASL(平均查找长度)大大增加从而降低我们的查找效率因此,我们就需要一种BST的优化版本取克服这种输入造成的弊端(现在证明,在平均情况下,出现偏树的概率大致在45.6%),所以说,我原创 2016-11-23 16:26:18 · 1599 阅读 · 0 评论 -
Euler Graph - 欧拉图 详解
1.从哥尼斯堡七桥问题到欧拉图哥尼斯堡七桥问题:18世纪中叶在欧洲普鲁士的哥尼斯堡城内有一条贯穿全市的和河中有两个小岛,现在四块陆地有七座桥连接,引入问题,如何规划线路才能保证我们可以走过所有的边但是却保证不会重复呢这就是著名的哥尼斯堡七桥问题,现在通过图论证明哥尼斯堡问题是不存在解的,第一个发表论文证明了这个事实的人就是欧拉,该论文也是目前为止发现的最早的关于图论的论文,当然,这种问原创 2016-11-19 19:18:34 · 19708 阅读 · 2 评论 -
DAG - AOV - AOE - CPM - Topological-Sort 详解
1.DAG(Directed acycline graph)DAG图,又称有向无环图,简称为DAG,DAG是相对更像是有向树一样的数据结构,用处十分的广泛1.表达式树:DAG可以模拟表达式树,按照数据结构老师的话来说,在操作系统方面的用处更加的广泛2.检查图的环路:我们都知道检查一个无向图是否存在回路是非常的简单的,我们只需要DFS遍历一遍就能判断出来但是我们检查一个有向图原创 2016-11-16 12:17:38 · 2068 阅读 · 0 评论 -
GCD Extends_GCD 欧几里得算法+扩展欧几里得算法详解
1.欧几里得算法:我们从小学开始老师都会让我们求解一一种问题,叫做最大公约数,这里的最大公约数就叫做GCD当然求解最大公约数的算法也是非常的重要,我们在这里就引入欧几里得的算法,也就是著名的辗转相除法首先给出定义:GCD(a,b)=GCD(b,a%b)在这里有的人会问a,b到底哪个大才能使对的,其实在这里我们的a,b是没有大小之分的,要是硬说影响的话,是有那么一点影响,但是无关原创 2016-11-05 21:00:55 · 1102 阅读 · 0 评论 -
Miller-Rabin概率素数测试算法
本文首先鸣谢以下资料文章: 资料1 资料2 资料3 下面我们开始正文,从源头开始真正的梳理一下素数测试1.素数我们都知道,素数在当今的数论中占有非常重要的地位,主要原因就是素数最根本的性质——除了1,和自身以外,不会被任何一个数整除 并且,素数现在在我们的日常生活中伴有非常重要的地位,这一点的其一主要原因就是素数已经是密码学中最重要的一点,我们当今的密码学常常要涉及到利用超大素数作为我们的原创 2016-11-05 16:37:23 · 12122 阅读 · 0 评论 -
快速幂取模算法详解
1.大数模幂运算的缺陷:快速幂取模算法的引入是从大数的小数取模的朴素算法的局限性所提出的,在朴素的方法中我们计算一个数比如5^1003%31是非常消耗我们的计算资源的,在整个计算过程中最麻烦的就是我们的5^1003这个过程缺点1:在我们在之后计算指数的过程中,计算的数字不都拿得增大,非常的占用我们的计算资源(主要是时间,还有空间)缺点2:我们计算的中间过程数字大的恐怖,我们现有的计算机原创 2016-11-05 10:40:41 · 44318 阅读 · 14 评论 -
快排光芒下被忽视的Partition函数
1.前言:看到这篇标题,没有学过快排的人自然是不知道Partition函数的意思和作用,这里附上学习的连接Lantian的快排总结我们现在都是被快排蒙蔽了双眼,没有意识到快最核心的划分函数Partition,当然Partition函数也就不止于快排这里,本文就从多方面来为展示Partition函数的本质和扩展作用2.快排中的Partition及其优化:在算法导论中我们对Partit原创 2016-11-02 19:33:53 · 3786 阅读 · 0 评论 -
ELFhash - 优秀的字符串哈希算法
1.字符串哈希:我们先从字符串哈希说起在很多的情况下,我们有可能会获得大量的字符串,每个字符串有可能重复也有可能不重复C不像Python有字典类型的数据结构,我们没有办法吧字符串当做是键值来保存,所以说我们需要一种hash函数将每个字符串都尽可能减少冲突的情况下去应设一个唯一的整形数据,方便我们的保存,这里我们就引入了字符串hash算法现在,有非常多的字符串hash算法都很原创 2016-10-29 22:12:37 · 14810 阅读 · 3 评论 -
位运算全解(含位段)
1.位运算操作符符号 描述 运算规则 by MoreWindows& 与两个位都为1时,结果才为1| 或 两个位都为0时,结果才为0^ 异或两个位原创 2016-10-21 22:50:28 · 1319 阅读 · 0 评论 -
埃拉托色尼素数筛法
1.算法原理埃拉托色尼素数筛法是有古希腊数学家发明的一种快速求解范围内所有的素数的算法在我们讲解埃拉托色尼素数筛法之前,我们需要了解一下朴素的求素数的算法的工作原理首先:对于朴素的求素数的算法我们有过编程基础的人都会知道算法的原理很简单,首先从定义出发,一个数既然是素数那么就说明这个数除了1和本身以外不存在任何一个因子,所以朴素的算法就很直接的遍历一遍整个范围,我们对范围内原创 2016-10-17 13:12:59 · 4741 阅读 · 1 评论 -
蒙特卡洛算法
1.何为蒙特卡洛算法蒙特卡罗方法于20世纪40年代美国在第二次世界大战中研制原子弹的“曼哈顿计划”计划的成员S.M.乌拉姆和J.冯·诺伊曼首先提出。数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。在这之前,蒙特卡罗方法就已经存在。1777年,法国Buffon提出用投针实验的方法求圆周率∏。这被认为是蒙特卡罗方法的起源。原创 2016-10-11 22:50:14 · 6207 阅读 · 0 评论 -
Segment Tree 线段树总结
1.何为线段树准确的来说,线段树是一种平衡二叉树,当我们的要换分的区间大小是2的幂的话,刚好我们的线段树就是一颗满二叉树,但是如果不是的话,我们最多只能叫他是平衡二叉树正因为是一颗平衡二叉树,所以说,线段树的划分是均匀的,树高也稳定在logn上(这也就是我们的优化的源泉)上面只是个人的一点小理解,下面我们步入正题线段树Segment Tree,是BST二叉搜索树而一种应用,原创 2016-10-07 19:00:55 · 2536 阅读 · 0 评论 -
巧用循环不变式书写正确的二分查找算法(看不懂我撞墙)
1.二分查找介绍在进行开始之前,我们县要来正确的认识一下什么是二分查找算法上过数值分析这门课的同学一定在迭代那一刻里面清楚的了解过一个名词叫做对分法实际上,对分法的本质就是二分查找下面我们来介绍一下二分查找算法Binary-Search是不同于顺序扫描的一种极其高效的查找算法首先我们县要来了解一下二分查找算法相对于朴素的顺序查找算法的优劣对于朴素的顺序查找算法(不局原创 2016-10-10 00:25:27 · 2345 阅读 · 2 评论 -
字典树 Trie
1.什么是字典树字典树,又称单词查找树或者键树,或者前缀树,是哈希树的一种变种,典型的应用就是保存大量的字符串的信息,统计和排序大规模字符串,因为采用了前缀的概念,压缩存储了部分的字符串,所以说,查询和查找效率都非常的高,接近于哈希主要思想就是,利用了空间换时间的思路,将多个字符串的最大公共前缀压缩存储示例图:2.字典树的ADT描述如下:1.根节点不含有键值2.原创 2016-10-03 12:52:06 · 875 阅读 · 0 评论 -
Radix-Sorting(线性阶 多关键字排序算法 基数排序)
1.引入:我们发现也经过证实,交换式的排序的算法的时间复杂度的下界是O(n*lgn),但是这真的就是我们的排序算法的极限了吗,事实并不是这样的,我们的多关键字的分配式排序--本文的基数排序就是如此却是打破了这样的瓶颈分配式的Radix-Sorting算法成功的将我们的算法的复杂度优化到无限接近线性阶的完美的O(n),下面,我们就来一一道来2.前身:桶式排序:我们先假定排序这样的原创 2016-09-30 13:55:10 · 1376 阅读 · 0 评论 -
LCS问题求解-动态规划
1.何为LCS问题:在求解LCS问题之前,我们需要先了解一下什么叫做最长公共子序列最长公共子序列:用我们最容易通俗理解的话语来解释的话,最长公共子序列就是两个或者多个串中,最长的相同的子序列ps:子序列可以不连续,但是有先后的次序关系LCS问题应用非常的广泛2.如何求解LCS问题:1.暴力搜索LCS问题如果我们只仅限于两个的=字符串的话,我们的首先的思考的策略是原创 2016-09-15 00:11:54 · 6980 阅读 · 2 评论 -
哈夫曼(最优二叉树)
最优二叉树:定义:路径:数的路径就是从书中的一个节点到树中的另一个节点的分支的个数长度,路径上的分支数目我们称之为长度树的路径长度:从树根到每一个节点的长度之和(完全二叉树是一种树的路径最短的二叉树)节点的带权路径长度:从根节点到该节点的路径的分支数目与节点的权值的乘积树的带权路径的长度:树中的所有的节点的带权路径长度之和,并且,我们将改长度定义为WPL最优二叉树(哈夫曼树原创 2016-09-08 16:15:48 · 4142 阅读 · 0 评论 -
并查集总结
1.并查集:什么是并查集,我们将并查集称之为不相交集合,在处理例如查找几个元素是否属于相同的集合的时候我们使用并查集可以达到非常高的处理速度(在合并和查找方面),我们利用并查集的思想有一点很重要就是我们我们利用的森林(父亲表示树)来对不同的不相交集合的状态,我们利用每个集合的根作为代表元素来对整个集合的数据进行“牵一发动全身”的合并处理这里我们的额=编号和处理对都是整数,但是如果我原创 2016-08-29 10:06:27 · 950 阅读 · 0 评论 -
树及二叉树
1.基础概念:树是一种扩展性的数据结构,体现在树额一对多的方面上一.树的表示方法1.双亲表示树:结构体包含数据域和指向双亲的指针域,我们也可以添加指向长子的指针域和只想有兄弟的指针域2.孩子表示树:两种结构体,一种结构体建立出顺序的数组结构,保存数据域和指向孩子的指针域 第二种结构体,包含有指向对应的孩子的指针域,还包含指向与其有相同的双亲的兄弟的节点原创 2016-08-04 16:59:46 · 488 阅读 · 0 评论 -
线性表——线性表+抽象链表类+单向链表讲解
1.讲解:线性表两种分类:顺序表,链表线性表>记录(数据元素)>数据项顺序表:只有唯一一个节点只存在一个后继,不存在前驱,只有唯一一个节点存在前驱,不存在后继,中间所有的节点都存在位移的前驱和后继顺序表的优点:可以随机存取,方便访问,存储密度大,空间利用率高顺序表缺点:难以实现插入数据的操作,而且空间一旦定义就会固定,不能动态控制空间内存的大小链表的缺点原创 2016-08-24 17:46:36 · 560 阅读 · 0 评论 -
快速幂详解以及例题解析
借鉴两位大神的笔记,略有通悟点击打开链接点击打开链接在这里我总结一下:快速幂算法用来求解大数的取幂操作,这应用的数学知识有两点1. 2.算法基础在于模运算的基本性质: (a*b)%n = ( (a%n) * (b%n) ) %n下面我通过代码模板进行详细的解释:#include"iostream"#include"cstdio"using原创 2016-07-10 14:41:24 · 1045 阅读 · 0 评论 -
哈希表全解(简介+构造+冲突处理+查找分析计算+诸多要点)
目前参考了大量的优秀的大牛的博文自己总计的超详细哈希表1.哈希表的简介2.哈希表的哈希函数构造3.冲突处理4.查找分析计算5.C++完整实现代码原创 2016-08-10 22:09:42 · 3851 阅读 · 0 评论 -
全排列生成算法
1.什么是全排列:我们假如有一串式子,排列组合的结果会有很多种,全排列就是按照字典序有序的将所有的排列组合的性质的陈列出来问题可以这么描述:对于给定的集合A{a1,a2,...,an},其中的n个元素互不相同,如何输出这n个元素的所有排列(全排列)2.求解算法:1.DFS(我们大多数人所谓的递归的方法):我们来这么看这个问题,加入有n个数据要进行全排列,我们可以假想我们原创 2016-08-11 23:06:25 · 1192 阅读 · 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 · 1299 阅读 · 0 评论 -
最短路径算法汇总
最短路径算法精讲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 · 24328 阅读 · 4 评论 -
二叉查找树BST总结
二叉查找树BST总结分析1.ADT(抽象数据类型)ADT BST{ 数据元素:数据节点(键值,位置信息)数据关系:父子关系基本操作:插入节点查找节点删除节点遍历节点(前中后层序)}2.二叉查找树性质:(不存在相同键值的节点)1.空树2.非空树并且左子树所有节点的键值均小于本节点的键值 右子树所有的节点的键值原创 2016-07-31 22:59:16 · 3054 阅读 · 0 评论 -
从BST到SBT(田劲峰老师论文读后感)6.
优劣:优点:查找的时间复杂度:O(logn)非常高效的查找速度缺点:对于存在部分有序的输入序列,会导致BST偏向于偏树,进而使得树的深度逐渐变大,导致查找速度不断退化,最坏的退化情况是退化成双向链表引出:对于BST的缺点,我们需要克服,我们最终需要的而是一种技能高效的查找数据又可以避免特殊的输入序列而导致的BST 的退化,所以这时候,我们引入了一种新的数据结构——自平衡二叉树,通过不同的操作,是的,这种进化过得BST可以拥有自动调节树高的能力,是的我们查找的时间复杂度稳定在O(logn)附近,避免原创 2016-08-18 08:28:08 · 1451 阅读 · 1 评论 -
归并排序算法及分析
#include"iostream"#include"cstdio"#define inf 9999999 //注意inf代表监视哨,在从小到大排序时,监视哨是做当前条件下的无限大值,否则,监视哨用作当前环境下的绝对最小值using namespace std; //小心当数组不是全局变量的时候,完全可以用指针实现相应的功能int a[]={0,449,原创 2016-02-29 14:52:40 · 588 阅读 · 0 评论 -
归并排序经典应用求逆序数
在开始思考之前,应该明确:1.归并排序在返回合并的过程中,两个分块是各自有序的2.整个过程是递归的我们的求逆序对的时候将数组不断地二分二分,但是无论二分的过程有多少,二分的每个小块怎么排序,逆序对数是不会改变的在merge函数中我们将两部分的数组进行有序合并的过程中前一个a[begin+i]后一个a[centre+1+j]当a[begin+i]>a[centre原创 2016-02-29 23:03:19 · 531 阅读 · 0 评论 -
堆排序 两种实现(最小堆和最大堆)
堆排序算法是建立在二叉树的堆结构上的,通过交换堆(一维数组)中的元素,并进行上浮或下沉函数运算实现多次调整堆排序算法的复杂度低,和快速排序属于相同速度级别的一种快速的排序算法下面以最小堆和最大堆来进行堆排序算法的实现,具体内容在代码中进行讲解1.最小堆 堆排序#include"iostream"#include"cstdio"using namespace原创 2016-03-12 23:31:35 · 3052 阅读 · 0 评论 -
最小生成树算法汇总
较为完全的初学者学习最小生成树的利器,想要玩转ACM的小编倾情奉献原创 2016-07-28 15:38:29 · 4665 阅读 · 1 评论 -
快速排序全面讲解(含复杂度证明)——即将引出八大排序算法
快速排序最经典额讲解,一看就会,不会以抽我耳刮子都可以原创 2016-08-07 23:07:58 · 9753 阅读 · 8 评论 -
归并排序全解(含复杂度证明)
史上最全的归并排序讲解1.归并排序实现2.归并排序复杂度证明3.归并排序应用4.归并排序的优化原创 2016-08-08 12:32:13 · 8029 阅读 · 0 评论 -
手摇算法(三重反转算法/内存反转算法)
手摇算法最完整的讲解附带讲解手摇算法对归并排序的优化,你值得一看原创 2016-08-08 21:48:35 · 2713 阅读 · 0 评论