算法
政教处挨批
这个作者很懒,什么都没留下…
展开
-
Dijkstra
Dijkstra算法牵涉到几个非常重要的状态变量1)长度为N的一维数组Dist[N],用来存放从源点到图中其它节点的最短路径长度;2)Dijkstra算法需要维护两个非常重要的集合,假设这两个集合分别为V和S,V集合用来存放目前还没有计算节点,S集合用来存放已经得到最短路径的节点集合。刚开始时,集合V包含图中所有节点,集合S为空。3)辅助二维数组path_matrix,用来记录源点到图原创 2014-03-13 17:23:34 · 696 阅读 · 0 评论 -
最大子序列和
问题描述:给定N个整数(有正有负),求它的最大子序列和,若全是负数则返回0。例如:-84 33 -40 36 -34 4 5 88 74 -29这10个数的最大子序列和是 173(74+88+4+5+(-34)+36)解法:1)穷举求解(三次循环,复杂度O(n^3))for(i=0;i!=n;i++)/*对数组的元素全部遍历*/{原创 2014-03-23 16:57:42 · 857 阅读 · 0 评论 -
BF算法和KMP算法
一.BF算法BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。 举例说明: S: ababcababa P: ababa BF算法匹配的步骤如下原创 2014-08-29 13:28:17 · 652 阅读 · 0 评论 -
最长回文子串
首先讲讲什么是回文, 看看Wiki是怎么说的:回文,亦称回环,是正读反读都能读通的句子,亦有将文字排列成圆圈者,是一种修辞方式和文字游戏。回环运用得当,可以表现两种事物或现象相互依靠或排斥的关系, 比如madam,abba,这样正反都一样的串就是回文串。今天要写的问题了就是在一个字符串中找出最长的回文字串,比如串:"abcdedabakml", 他的最长回文字串就是"abcdedaba"。一般原创 2014-08-14 15:17:11 · 401 阅读 · 0 评论 -
匈牙利匹配算法
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。-------等等,看得头大?那么请看下面的版本:通过数代人的努力,你终于赶上了剩男剩女的大潮,假设你是一位光荣的新世纪媒人,在你的手上有N个剩男,M个剩女,每个人都可能原创 2014-08-08 12:25:55 · 1383 阅读 · 0 评论 -
完全背包
本文包含的内容: 问题描述 基本思路(直接扩展01背包的方程) 转换为01背包问题求解(直接利用01背包) O(VN)的算法---------------------------------------------1、问题描述已知:有一个容量为V的背包和N件物品,第i件物品的重量是weight[i],收益是cost[i]。条件:每种物品都有无限件,能放多原创 2014-08-07 20:19:08 · 482 阅读 · 0 评论 -
多重背包
本文包含的内容: 问题描述 基本思路(和完全背包类似) 转换为01背包问题求解(直接利用01背包)---------------------------------------------1、问题描述已知:有一个容量为V的背包和N件物品,第i件物品最多有Num[i]件,每件物品的重量是weight[i],收益是cost[i]。问题:在原创 2014-08-07 20:21:58 · 468 阅读 · 0 评论 -
01背包
01背包问题描述已知:有一个容量为V的背包和N件物品,第i件物品的重量是weight[i],收益是cost[i]。限制:每种物品只有一件,可以选择放或者不放问题:在不超过背包容量的情况下,最多能获得多少价值或收益相似问题:在恰好装满背包的情况下,最多能获得多少价值或收益这里,我们先讨论在不超过背包容量的情况下,最多能获得多少价值或收益。基本思路01背包的特点:每种物品只原创 2014-08-07 19:57:03 · 682 阅读 · 0 评论 -
单调递增最长子序列
一.概述先解释下什么叫子序列。若a序列删去其中若干个元素后与b序列完全相同,则称b是a的子序列。我们假定存在一个单调序列{An}(以递增序列为例),现在在其后面添加一个元素a(n+1),有两种情况:1.a(n+1)>a(n) 。此时,a(n+1)可以添加到An序列的尾部,形成一个新的单调序列,并且此序列长度大于之前An的长度;2.a(n+1)经过分析,我们可以得出这样的结论原创 2014-07-31 12:28:12 · 728 阅读 · 0 评论 -
c语言单链表的实现
一个简单结点的结构体表示为: struct note { int data; /*数据成员可以是多个不同类型的数据*/ struct note *next; /*指针变量成员只能是-个*/ };原创 2014-07-10 19:36:11 · 564 阅读 · 0 评论 -
并查集
本文主要介绍解决动态连通性一类问题的一种算法,使用到了一种叫做并查集的数据结构,称为Union-Find。更多的信息可以参考Algorithms一书的Section 1.5,实际上本文也就是基于它的一篇读后感吧。原文中更多的是给出一些结论,我尝试给出一些思路上的过程,即为什么要使用这个方法,而不是别的什么方法。我觉得这个可能更加有意义一些,相比于记下一些结论。关于动转载 2014-07-24 12:25:37 · 357 阅读 · 0 评论 -
中国剩余定理
一.定理描述若某数x分别被d1、、…、dn除得的余数为r1、r2、…、rn,则可表示为下式:x=R1r1+R2r2+…+Rnrn+RD其中R1是d2、d3、…、dn的公倍数,而且被d1除,余数为1;(称为R1相对于d1的数论倒数)R1 、R2 、… 、Rn是d1、d2、…、dn-1的公倍数,而且被dn除,余数为1;D是d1、d2、…、的最小公倍数;R是任意整数原创 2014-07-22 18:09:41 · 375 阅读 · 0 评论 -
矩阵乘法求解线性递推(一)
原创 2014-03-27 10:36:18 · 918 阅读 · 1 评论 -
二分 + 矩阵乘法
题意:已知一个n*n的矩阵A,和一个正整数k,求S= A + A2 + A3+ … + Ak。思路:矩阵快速幂。首先我们知道 A^x 可以用矩阵快速幂求出来(具体上篇博文)。其次可以对k进行二分,每次将规模减半,分k为奇偶两种情况,如当k = 6和k = 7时有:k = 6 有: S(6) = (1 + A^3) * (A + A^2 + A^3) = (1 + A^3) *原创 2014-03-27 11:15:23 · 548 阅读 · 0 评论 -
矩阵乘法求解线性递推(二)
矩阵快速幂运算矩阵的快速幂是用来高效地计算矩阵的高次方的。将朴素的o(n)的时间复杂度,降到log(n)。原理:一般一个矩阵的n次方,我们会通过连乘n-1次来得到它的n次幂。但做下简单的改进就能减少连乘的次数,方法如下:把n个矩阵进行两两分组,比如:A*A*A*A*A*A => (A*A)*(A*A)*(A*A)这样变的好处是,你只需要计算一次A*A,然后将原创 2014-03-27 11:11:27 · 967 阅读 · 0 评论 -
二叉树前序、中序、后序遍历相互求法
首先,我们看看前序、中序、后序遍历的特性: 前序遍历: 1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历: 1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 后序遍历: 1.后序遍历左子树 2.后序遍历右子树 3.访问根节点已知前序、中序遍历,求后序遍历原创 2014-03-25 19:31:50 · 814 阅读 · 0 评论 -
二叉树的前序·中序·后序遍历
二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说原创 2014-10-12 11:13:48 · 1259 阅读 · 1 评论