algorithm
kdb_viewer
这个作者很懒,什么都没留下…
展开
-
算法导论 chapter32 字符串匹配
在一个文本文件中查找指定模式的问题,就是一个字符串匹配问题,形式化定义:文本是一个长为n的数组T[1..n],模式是一个长为m的数组P[1..m],其中,进一步假设P和T的元素都是来自一个有限字符集的字符,例如={0, 1}或者。字符数组P和T就是我们所说的字符串。若,并且,那么说模式P在文本T中出现,并且偏移是s,这里s是数组下标。若P在T中以偏移s出现,称s是有效偏移,否则是无效偏移。字符...原创 2018-08-22 19:38:42 · 271 阅读 · 0 评论 -
分治算法定理、平面最近点问题
分:递归解决较小的问题治:从子问题构建原问题的解分治算法的时间:定理1:方程的解是:证明用叠缩求和法定理2:方程的解是定理3:若,则方程的解是证明:使用数学归纳法,这个方程的意义是,若将原问题分解成若干不到原问题100%的若干个子问题加上合并子问题的线性时间,那么算法时间是最近点问题:输入平面上的点列P,若,,那么两点之间的欧几里得距离是,找...原创 2018-10-18 09:38:06 · 194 阅读 · 0 评论 -
贪婪算法
贪婪算法每个阶段选择当前的局部最优解,保证正确性的前提下,能保证得到一个正确解,但是无法保证贪婪算法的结论是最优解作业调度问题:有作业,对应的运行时间是,只有一个处理器,如何安排作业使得所有作业完成的时间最小?解:第一个作业在时间之后完成,第二个作业在时间之后完成,以此类推,得到总时间是整理为式中第一项无论怎么安排作业都是一定的,第二项必须运行时间少的作业在前面,否则若存在使得...原创 2018-10-14 17:47:03 · 618 阅读 · 0 评论 -
分治算法解决一个最坏O(N)时间的选择问题
分治算法的一个基础定理如下定理1:若,则方程的解是意思是,把原问题分解成若干子问题,若这些子问题的规模之和没有原问题大,那么再加上处理这些子问题的时间,算法的时间界是选择问题:在N个数中抽取第k小的,有几种解法:1.可以用优先队列得到一个或者的时间,若k是中位数那么时间就是2.可以使用快速选择算法,每次处理一个不到原问题的子问题和线性附加时间,平均时间,但是无法保证枢纽元的坏选...原创 2018-10-18 10:44:44 · 1137 阅读 · 0 评论 -
分治算法解决大整数乘法问题
整数相乘:小整数相乘在算法时间分析中可以认为是常数时间,但是对于大整数,时间需要考虑。两个N位数的整数X和Y相乘,常规方法花费时间是,因为X的每一位都要和Y的每一位相乘,是两层循环。分治算法解决整数相乘问题:例如,X是12345678,Y是87654321,将X和Y都拆成两半,得到即,,得到这个方程由4个乘法组成,即,每个问题是原问题的大小,加上增加一堆0的附加...原创 2018-10-18 11:05:09 · 6400 阅读 · 1 评论 -
动态规划和几个例子
一.斐波那契队列递归解法:int fib(int N){ if (N >= 0) return 1; else return fib(N - 1 ) + fib(N - 2);}若编译器不进行优化,那么递归解法效率很低,因为时间界本身也按照fibonacci分布动态规划解法,时间是:int fib(int N){...原创 2018-10-18 17:35:04 · 536 阅读 · 0 评论 -
回溯算法
回溯算法本质是穷举,实现手段是递归,在递归的每个阶段,做如下操作:1.预占资源2.递归处理子问题3.若失败,回溯,释放资源收费公路重建问题:给定N个点,都位于x轴上,是点的坐标,那么对于这N个点,有个两点之间的距离,可以花费时间排序,得到一个距离的集合。收费公路重建问题是,从这些距离重新构建一个点集。代码如下:/* 收费公路重建问题 */int Turnpike(int X...原创 2018-10-18 19:01:34 · 178 阅读 · 0 评论 -
博弈和α、β裁剪
考虑棋类游戏作为一个人机博弈模型,采用机器学习中对于棋盘学习的方法,给每个棋盘位置的好坏进行一个打分,几个概念:极大极小策略:能使计算机获胜的位置,打分为1,平局是0,计算机负是-1,显然计算机要尽量让每一步的得分极大,人要让每一步的得分极小终端位置:若某个位置能直接决定结果,那么这个位置叫做终端位置,若一个位置不是终端位置,那么该位置的值通过递归假设双方的最优棋步决定后继位置:P的后...原创 2018-10-18 19:39:18 · 399 阅读 · 0 评论 -
优先队列
优先队列满足两种操作:insert和deletemin(deletemax),insert类似入队列,deletemin类似出队列,最小堆和最大堆是事先决定好的,这里全用最小堆应用:操作系统进程、外部排序、贪婪算法实现方式:1.使用简单链表,表头O(1)插入,deletemin花费O(N),或者始终让链表排序,插入O(N),deleteminO(1),由于删除次数一定小于插入,因此采用...原创 2018-10-09 18:22:43 · 142 阅读 · 0 评论 -
左式树
左式树是二叉堆,儿子节点的值比父亲大,特点是趋于不平衡,目的是为了合并操作,因为诸如AVL树,二叉堆等结构对于merge操作支持的很不好零路径长:从一个节点到一个没有两个儿子的节点的最短路径长,没有儿子的节点或者有一个儿子的节点的npl是0,因为是到自己的路径长,为了方便,设计NULL节点的npl值为-1。任何一个节点的npl比它的诸儿子的npl的最小值多1。左式树性质:1.对于每个节...原创 2018-10-09 19:53:20 · 325 阅读 · 0 评论 -
二项队列
是对左式树的改进,对于insert操作有O(1)平均时间源码如下:#ifdef _cplusplusextern "C" {#endif#include <stdio.h>#include <stdlib.h>#include <string.h>#define MaxTrees 16#define Infinity 0x800000...原创 2018-10-10 17:24:45 · 179 阅读 · 0 评论 -
插入排序
由N - 1趟排序组成,设P是排序趟数,从1到N - 1,每次保证从位置0到位置P - 1的元素是排序的,本质是每次将一个新的元素插入到前面的排序数组中,代码如下:void InsertionSort(int *a, int N){ int j, P, Tmp; /* 每趟让排序的数量增加1,即将后面的一个插入到前面的排序数组中 */ for (P = 1; P ...原创 2018-10-10 17:48:05 · 113 阅读 · 0 评论 -
深度优先搜索
深度优先搜索是对先序遍历的推广,从某个顶点v开始处理v,然后递归遍历所有和v邻接的顶点,在图中应用深度优先遍历需要注意的问题是图可能有圈,每次访问到一个节点需要标记这个节点是已经访问过的,然后对所有没有被标记的节点递归调用深度优先搜索。深度优先遍历的通用模板如下:void Dfs(Vertex V){ Visited[V] = True; for each W adjace...原创 2018-10-12 17:50:33 · 438 阅读 · 0 评论 -
最小生成树
最小生成树:无向图G的最小生成树是连接G的所有顶点的边构成的树,并且总价值最低,最小生成树存在当且仅当图是连通的。最小生成树不是唯一的,它是树,因为无圈;是生成树,因为包含每一个顶点。有两种算法1.Prim算法是贪婪算法,分步进行,每一步,都把一个顶点当作根加入树中。在每个阶段,有一个已知顶点的集合,其余顶点未知,选择未知顶点中到已知顶点集中距离最短的,声明为已知并加入到树中,代码如下:...原创 2018-10-12 16:22:22 · 1522 阅读 · 0 评论 -
c++ primer plus 16.4.3 STL算法 next_permutation
c++ primer plus 16.4.3中关于next_permutation的描述是每次提供唯一的序列,实际是按照字典序排列的,从小到大输出,例如对于如下排列13542,下一个排列应该是14235,原理是:1.从右到左找第一个左邻比右邻小的,这里3比5小,找到32.然后找从右往左第一个比3大的,这里找到43.交换3,4,得到145324.然后对4右边的数字排序,得到14235...原创 2018-09-19 22:54:54 · 150 阅读 · 0 评论 -
树(三)AVL树
AVL树是对二叉查找树的改进,注意任何对二叉查找树的改进都必须保证树具有O(logN)的深度或摊还深度,若深度增加到O(N)级别,就和链表一样了,没有意义。AVL树保证了O(logN)深度的同时具有平衡性,是一种自平衡二叉查找树。AVL树平均高度大概是1.44logN + c,c是常数,是O(logN)级别。比二叉查找树增加的结构性:要求每个节点的左子树和右子树的高度相差最多为1,(为了方便N...原创 2018-09-19 23:46:10 · 910 阅读 · 0 评论 -
堆排序
在二叉堆中进行deletemin操作的时间是O(logN),进行N次,时间就是O(NlogN),为了防止使用额外的空间,直接在原始数组上进行处理,每次deletemin得到的结果放到最后一个位置上,使用的堆类型和排序要求是相反的,若要升序排序,那么需要使用max堆,否则需要使用min堆。代码如下:#include <stdio.h>/* 标准二叉堆有一个哑头,数据部分下标从1...原创 2018-10-11 09:59:48 · 125 阅读 · 0 评论 -
归并排序
使用递归,最坏O(NlogN),本质是一种分治算法,将一个数组排序的问题分成两个子数组排序和合并两个排序子数组的问题,由于需要线性附加内存和数组拷贝,不适用于主存排序,应用场景是外部排序,代码如下:#include <stdio.h>#include <stdlib.h>/* 合并两个排序数组,注意这两个数组是连续的,lpos是第一个数组开始的位置,rpos是第...原创 2018-10-11 10:19:22 · 99 阅读 · 0 评论 -
快速排序
是一种分治算法,步骤如下:1.若数组S中元素个数是0或者1,返回2.取S中的一个元素v,作为枢纽元3.将S - {v}中分成两个不相交的集合,,4.返回quicksort(S1),继随v,继而quicksort(S2)快速排序性能的关键是枢纽元的选择,最好的枢纽元是恰好将元素分成2份,几种选择:1.使用第一个元素,不好,很容易对一段预排序的数组进行O(N ^2)时间处理...原创 2018-10-11 10:55:38 · 129 阅读 · 0 评论 -
选择问题
选择问题是,在N个数中选择第k小的,有几种方法:1.N个元素建立最小堆,k次deletemin,时间O(klogN)2.k个元素建立最大堆,N次percdown,时间O(Nlogk)3.使用分治算法,改进快速排序,每次解决两个子问题中的一个,平均时间O(N)4.改进方法3中枢纽元的选择,使用五分化中项的中项或者七分化中项的中项,最坏时间O(N)快速选择问题步骤:1.若集合S...原创 2018-10-11 11:27:08 · 733 阅读 · 0 评论 -
决策树与排序算法的一般下界
定理:任何只用到比较的算法最坏情况下需要次比较决策树:用于证明排序算法的下界,是一个二叉树,每个节点是元素之间一组可能的排序,比较的结果是树的边,下图表示将a,b,c排序的算法排序算法比较次数等于最深的树叶的深度,平均次数是平均深度引理1:令T是深度为d的二叉树,那么T最多有个树叶证明:显然引理2:有L片树叶的二叉树的深度至少是证明:显然定理1:只用元素之间比较的任...原创 2018-10-11 11:53:49 · 1467 阅读 · 0 评论 -
不相交集
不相交集用来解决等价问题,特点是编程实现很简单但是分析复杂。关系:对于每一对元素,或者为true或者为false,称在集合S上定义关系R。若aRb是true,那么a和b有关系等价关系:是满足以下3个性质的关系R:1.自反性,对所有,aRa2.对称性,aRb当且仅当bRa3.传递性,若aRb,bRc,那么aRc一个例子:不是等价关系,满足自反性和传递性,但是不满足对称性用...原创 2018-10-11 20:10:33 · 688 阅读 · 0 评论 -
图基本概念
一个图由顶点集V和边集E组成。每条边是一个点对,其中有向图:点对有序,即和是不同的邻接:顶点v和w邻接当且仅当,在无向图中,v和w邻接意味着w和v也邻接路径:一个顶点序列,使得,路径长是路径上的边数,等于环:图含有一个节点到它自身的一条边,路径就是一个环简单路径:所有顶点互异,除了开始和结束的顶点圈:是一个常用于有向图中的一个概念,满足并且长度至少是1的路径,无圈的有向图称...原创 2018-10-12 10:59:25 · 124 阅读 · 0 评论 -
图的拓扑排序
拓扑排序:对DAG的一种排序方式,要求若存在一条从到的路径,那么在排序中出现在后面特点:1.不能有圈,否则不可能拓扑排序2.拓扑排序不是唯一的入度:顶点v的入度是,边的条数,拓扑排序显然从入度为0的顶点开始一个简单的思想是,找一个入度为0的顶点,打印,将它和边删除,继续找下一个,代码如下:#ifdef persudo_code/* 有向图拓扑排序,简单方法,时间O(V...原创 2018-10-12 11:17:32 · 262 阅读 · 0 评论 -
最短路径算法
权:与每条边相联系的是穿越这条边的代价赋权路径长:一条路径的值为,无权路径长就是边的条数单源最短路径问题:给定一个赋权图和一个特定顶点s作为输入,找出从s到G中每个其他顶点的最短赋权路径负值圈:若图中存在负值圈,那么会有问题,因为可以在负值圈中一直转,让路径无限小性能:由于图是不可拆分的,因此不存在找从s到某一个顶点比从s到所有顶点快多于常数因子的算法,这也是图的问题无法应用任何并...原创 2018-10-12 15:36:48 · 283 阅读 · 0 评论 -
逆序对和排序算法的下界
逆序对:对于数组中两个位置的元素,具有性质但是的序偶。例如,1,4,5,2,3中有4个逆序对,是(4,2),(4,3),(5,2),(5,3),这就是插入排序执行的交换次数,因为每次交换两个顺序不对的元素恰好消除一个逆序对,最终排序好的数组没有逆序对,插入排序的时间就是,其中是逆序对的数量,是遍历的时间,若数组是排序的,那么时间就是定理:N个互异数的数组的平均逆序数是定理:通过交换相邻元素...原创 2018-10-10 18:36:58 · 210 阅读 · 0 评论