摘要: 问题描述:先有一文本串T,一模式串P,找出P在T中首次出现的位置,若不存在返回-1。算法思想:若能在T中找到P那么则意味着 T[[i + j] = P[j],其中i代表T与P匹配时候的首字母下标,0<=j<length(P)。当T与P匹配失败的时候,将P向右滑动,依次将P与T所对应的字符进行匹配。大致过程如图所示:其中红色字符代表匹配成功,灰色代表匹配失败。核心代码: 1 int NaiveStringMatch(char* T,char* P) 2 { 3 //T为文本串,P为模式串 4 int tLen,pLen; 5 int i,j; 6 tLen = s... 阅读全文
posted @ 2013-09-20 09:35 Howey 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 概念 优先级队列是一种用来维护一组元素集合的数据结构,这一组元素都具有关键字key,对于此队列,优先级高的先出队列,优先级低的后出队列。有两种优先级队列:1.最大优先级队列:关键字越大,优先级越高,其本身建立在大根堆之上。2.最小优先级队列:关键字越小,优先级越小,其本身建立在小根堆之上。最小优先级队列 由于两种队列在实现的时候相类似,因此在此只介绍最小优先级队列。如果对对堆这个概念不是很清楚,可以参考下Howey写的堆排序。网址为:http://www.cnblogs.com/heweiyou1993/p/3330195.html在此先给出小根堆核心代码: 1 int left(int .. 阅读全文
posted @ 2013-09-20 09:30 Howey 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 堆 (二叉)堆数据结构是一种数组对象,可以看做成一个完全二叉树,除最后一层外树的每一次都必须填满。下面给出数组与树之间的关系图: 为了满足堆的有关性质,数组下标应从1开始记起。可以看出在这个所谓堆的二叉树中其子节点与父节点满足的关系为 parent(i) = i/2,即下标为 i 的节点的父节点为下标为 i/2 的节点;left(i) = i*2,即下标为 i 的节点的左子节点为下标为 i*2 的节点; right(i) = i*2+1,即下标为i的节点的右子节点为下标为 i*2+1 的节点。大根堆 所谓的大根堆即父节点的值总是比子节点的值大,即可以推出 A[i] >= A[i*2] , 阅读全文
posted @ 2013-09-20 09:22 Howey 阅读(205) 评论(0) 推荐(0) 编辑
摘要: Knuth-Morris-Pratt 字符串查找算法(常简称为 “KMP算法”)是在一个文本串 S内查找模式串T 的出现,通过观察发现,在不匹配发生的时候这个词自身包含足够的信息来确定下一个匹配将在哪里开始,以此避免对以前匹配过的字符重新检查。通俗点说就是一种在一个字符串中定位另一个串的高效算法,它的时间复杂度为O(m+n)。 阅读全文
posted @ 2013-09-15 11:52 Howey 阅读(514) 评论(0) 推荐(0) 编辑
摘要: 在看普通母函数之前,先了解一下什么是母函数,为此我们先看一个多项式: (1+a1*x)(1+a2*x)…(1+an*x) = 1 + (a1 + a2 + …+an)x + (a1*a2 + a1*a3 + … + an-1*an)x^2 + …+ a1*a2*…*an*x^n 我们可以看出: (1) x项的系数是从n个元素(a1,a2,…,an)中取一个元素组合的全体,有C(n,1)个。 (2)x^2项的系数是从n个元素(a1,a2,…,an)中取两个元素组合的全体,有C(n,2)个。 … (n)x^n项的系数是n个元素(a1,a2,…,an)中取n个元素组合的全体,有C(n,n)个。 阅读全文
posted @ 2013-09-05 18:49 Howey 阅读(455) 评论(0) 推荐(0) 编辑
摘要: 定义 由若干个一元线性同余方程组构成的方程组,叫做一元线同余方程组。 求解 我们可以将其统一划成a*x ≡ b(mod m)的形式,这样有利于算法的实现。 既然是对同余方程组求解,那么必然得先会对同余方程求解 阅读全文
posted @ 2013-09-04 20:06 Howey 阅读(1561) 评论(0) 推荐(1) 编辑
摘要: 定义 a,b是整数,m是正整数,形如a * x ≡ b (mod m),且x是未知数的同余式称为一元线性同余方程。 理论基础与求解 定理1:假设d = gcd(a , m),假设对于整数xx和yy有 d = a * xx + m * yy。若d|b(d能够整出b),那么方程 a * x ≡ b (mod m)有一个解X满足式子 X = xx * (a/b) % m ,其中xx可以用扩展欧几里得算法获得。 阅读全文
posted @ 2013-09-04 19:59 Howey 阅读(2584) 评论(0) 推荐(0) 编辑
摘要: 定义   设a和b不全为0,则存在整数x和y,使得a*x + b*y = gcd( a, b) = d,其中d为最大公约数。 实现原理   对于gcd( a, b) = d,用辗转相除法可以得到gcd( d, 0),此时把a = d,b = 0代入a*x + b*y = d中可以得到x = 1,y为任意值。现在将该过程进行逆推,以满足任何情况下的a*x + b*y = d: 阅读全文
posted @ 2013-09-04 19:51 Howey 阅读(533) 评论(0) 推荐(0) 编辑