![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法学习
文章平均质量分 59
iteye_8466
这个作者很懒,什么都没留下…
展开
-
递归算法
递归是指在定义自身的同时又出现了对自身的引用(比如在函数体内直接或间接的调用自己)。如果一个算法直接或间接地调用用自已,则称这个算法是一个递归算法。 任何一个有意义的递归算法总是由两部分组成:递归调用与递归终止条件。如果没有递归终止条件那么递归将会无休止的进行下去,如果没有递归调用,则递归算法就不成其为递归算法。递归算法的执行过程中会多次进行自我调用,这个调用过程是如何...原创 2012-08-05 18:57:04 · 147 阅读 · 0 评论 -
广度优先搜索学习五例之一
有两种常用的方法可用来搜索图:即深度优先搜索和广度优先搜索。它们最终都会到达所有连通的顶点。深度优先搜索通过栈或递归来实现,而广度优先搜索通过队列来实现。 广度优先搜索: 它首先访问起始顶点的所有邻接点,然后再访问较远的区域。它是用队列来实现的。下面图中的数字显示了广度优先搜索顶点被访问的顺序。[img]http://dl.iteye.com/upload/att...原创 2012-10-13 15:27:58 · 105 阅读 · 0 评论 -
广度优先搜索学习五例之三
广度优先搜索是以某一节点为出发点,先拜访所有相邻的节点。 再依序拜访与刚才被拜访过的节点相邻但未曾被拜访过的节点,直到所有相邻的节点都已被拜访过。 因此,进行广搜 时,需要使用queue ,以便记录拜访的顺序。一般有下面的模板:[code="java"]public void bfs(int v) { //队列用来保存被访问节点的分支节点 Queye< Integer>...原创 2012-10-14 19:19:47 · 95 阅读 · 0 评论 -
广度优先搜索学习五例之四
例:输出由数字0,1,2..n组成的全部可重复全排列[code="java"]import java.util.Scanner;import java.util.Queue;import java.util.LinkedList;public class Permutation{ public static void main(String[] args){ S...原创 2012-10-16 15:26:44 · 81 阅读 · 0 评论 -
广度优先搜索学习五例之五
如果已经知道搜索的开始状态和结束状态,要找一个满足某种条件的一条路径(一般是最短路径),为了避免无谓的“组合爆炸”产生,就可以采取双向广度搜索算法,也就是从开始状态和结束状态同时开始搜索,一个向前搜,一个向后找。 直至在两个扩展方向上出现同一个子结点,搜索结束,这就是双向搜索过程。出现的这个同一子结点,我们称为相交点,如果确实存在一条从初始结点到目标结点的最佳路径,那么按双向搜索进行搜索必然...原创 2012-10-17 21:11:31 · 88 阅读 · 0 评论 -
深度优先搜索学习五例之一(JAVA)
深度优先搜索DFS(Depth First Search)(一)深度优先搜索遍历类似于树的先根遍历,是树的先根遍历的推广。(二) 深度优先搜索就是在搜索树的每一层时始终先只扩展一个子节点,不断地向纵深前进直到不能再前进(到达叶子节点或受到深度限制)时,才从当前节点返回到上一级节点,沿另一方向又继续前进。这种方法的搜索树是从树根开始一枝一枝逐渐形成的。 深度优先搜索亦称为纵向...原创 2012-10-19 14:54:24 · 114 阅读 · 0 评论 -
深度优先搜索学习五例之二(JAVA)
继续“深度优先搜索学习五例之一 ”中的第一例子:[url]http://128kj.iteye.com/blog/1701628[/url]例:写出数字1,2,3,4,5的所有全排列(深搜用栈实现,上文中是用递归)[code="java"]import java.util.Stack;public class Permutation{ private int M=5;...2012-10-20 12:24:06 · 87 阅读 · 0 评论 -
深度优先搜索学习五例之三(JAVA)
一、深度优先搜索框架一递归实现,流程如下: [code="java"] public void dfs(int v) { visited[v] = true; //访问起点v System.out.print(v+" "); for (int i = 0; i < k; i++) { //递归调...原创 2012-10-20 20:43:19 · 96 阅读 · 0 评论 -
深度优先搜索学习五例之四(JAVA)
先继续“深度优先搜索学习五例之三”[url]http://128kj.iteye.com/admin/blogs/1702286[/url]中的迷宫,那里用栈实现了深搜,但只输出了一条路径,下面程序用递归实现深搜,输出所有到出口的路径和数目:[code="java"]import java.util.Stack; /////////////////////////////////...原创 2012-10-21 17:25:34 · 89 阅读 · 0 评论 -
深度优先搜索学习五例之五(JAVA)
一、深度优先搜索遍历磁盘文件目录[code="java"]import java.io.File;import java.io.IOException;import java.util.Stack;import java.util.Queue;import java.util.LinkedList;public class ListFile{ public...原创 2012-10-22 15:48:27 · 92 阅读 · 0 评论 -
并查集入门精讲,实例2个(JAVA)
一、什么是并查集 并查集:即不相交集合。一种简单的用途广泛的集合,实现了较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。并查集实现方法: 每个集合用一棵“有根树”表示; 定义数组 int[] father int[] rank father[i...2012-10-30 14:47:54 · 110 阅读 · 0 评论 -
图解Bellman-Ford算法
Bellman-Ford算法: 为了能够求解边上带有负值的单源最短路径问题,Bellman(贝尔曼)和Ford(福特)提出了从源点逐次绕过其他顶点,以缩短到达终点的最短路径长度的方法。[img]http://dl.iteye.com/upload/attachment/0076/0621/e2977195-d3bb-34bb-b4aa-168452a7ff26.gif[/i...原创 2012-11-03 19:39:20 · 262 阅读 · 0 评论 -
SPFA算法求单源最短路径
很多时候,给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了。简洁起见,我们约定有向加权图G不存在负权回路,即最短路径一定存在。当然,我们可以在执行该算法前做一次拓扑排序,以判断是否存在负权回路。 我们用数组dist记录每个结点的最短路径估计值,而且用邻接表(或邻接矩阵)来存储图G。采取的方法是动...原创 2012-11-04 23:00:00 · 133 阅读 · 0 评论 -
回溯法入门学习之一
一: 回溯法 有时我们要得到问题的解,先从其中某一种情况进行试探,在试探过程中,一旦发现原来的选择是错误的,那么就退回一步重新选择, 然后继续向前试探,反复这样的过程直到求出问题的解。比喻:“下棋”: 每一次走棋的位置都要考虑到是否是损人利己,如果是害人害己的走法就要回撤,找下一步损人利己的走法。又如玩RPG游戏中碰到“迷宫”大家是怎样出来的? 回溯跟深度优先遍历是分不开的,我...2012-11-10 15:53:41 · 177 阅读 · 0 评论 -
回溯法入门学习之二(九宫格与数独)
回溯法的基本做法是搜索解空间,一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。上文“回溯法入门学习之一”[url]http://128kj.iteye.com/blog/1722216[/url]中已给出了一个框架:[color=blue]"深度优先搜索+回溯"递归框架: [/color]函数DFS(节点){ 如果(节点=目标节点) {找到目标,跳出} 遍历...2012-11-11 08:53:28 · 292 阅读 · 0 评论 -
田忌赛马: POJ 2287(贪心解法)
POJ 2287问题描述:你一定听过田忌赛马的故事吧? 如果3匹马变成1000匹,齐王仍然让他的马按从优到劣的顺序出赛,田忌可以按任意顺序选择他的赛马出赛。赢一局,田忌可以得到200两银子,输一局,田忌就要输掉200两银子,平局的话不输不赢。 请问田忌最多能赢多少银子?关于输入: 输入包含多组测试数据,每组测试数据的第一行是一个整数n(1 vQi.get(j)) ...原创 2013-01-03 19:24:55 · 309 阅读 · 0 评论 -
求推箱子的最小步数(java)
题目(poj1475):推箱子,要求箱子移动步骤最小。如图:T为目标地,B为箱子,S为推箱子的人,要求将B推到T,步骤最少。[img]http://dl2.iteye.com/upload/attachment/0096/7986/b93c4a42-fabe-3be3-a381-7ba018c683fa.jpg[/img][img]http://dl2.iteye.com/upload/a...2014-05-06 08:32:51 · 556 阅读 · 0 评论 -
广度优先搜索学习五例之二(JAVA)
再次强调:图的广度优先搜索,要遵守以下规则:(0) 选取某一顶点作为开始搜索的起点(当前顶点),标记为已访问。(1) 访问当前顶点的下一个未被访问的邻接点,这个点必须是当前顶点的邻接点,标记它,并把它插入到队列中。(2) 如果因为已经没有未访问的邻接点而不能执行规则1时,那么从队列头取一个顶点,并使其成为当前顶点。(3) 如果因为队列为空而不能执行规则2,则搜索结束。...原创 2012-10-12 14:32:42 · 80 阅读 · 0 评论 -
动态规划算法学习十例之十
凸多边形最优三角剖分 一凸8边形P的顶点顺时针为{v1,v2,… ,v8},任意两顶点间的线段的权重由矩阵D给出。若vi与vj是P上不相邻的两个顶点,则线段vivj 称为P的一条弦。求P的一个弦的集合T,使得T中所有的弦恰好将P 分割成互不重迭的三角形,且各三角形的权重之和为最小(一个三角形的权重是其各边的权重之和)。/* int graph[][]={ ...原创 2012-10-08 21:00:28 · 1011 阅读 · 0 评论 -
一些经典小问题的算法(java)
1.判断闰年与日、月、年是否有效的函数 四年一闰;百年不闰;四百年再闰。 static boolean isValidDate(int d, int m, int y) { if (d < 1 || m < 1 || m > 12) return false; if (m == 2) { if (isLeapYear(y))...原创 2012-08-08 17:13:45 · 57 阅读 · 0 评论 -
迭代算法
利用迭代算法解决问题,需要做好以下三个方面的工作: 一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。 二、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。 三、对迭代过程进行控制。在什么时...原创 2012-08-09 10:11:53 · 183 阅读 · 0 评论 -
分治算法
一、分治法的基本思想 任何一个可以用计算机求解的问题所需的计算时间都与其规模N有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。 例如,对于n个元素的排序问题,当n=1时,不需任何计算;n=2时,只要作一次比较即可排好序;n=3 时只要作3次比较即可,…。而当n较大时,问题就不那么容易处理了。要想直接解决一个规模较大的问题,有时是相当困难的。 分治法的设计...原创 2012-08-10 20:24:13 · 74 阅读 · 0 评论 -
穷举(枚举)算法
穷举法,或称为暴力破解法(名字来源于对于密码的破译方法,即将密码进行逐个推算直到找出真正的密码为止)是程序设计中使用得最为普遍(并不是在被逼无奈时最后的狂吼)之一,它利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检查,从中找出符合要求的答案。用穷举算法解决问题,通常可以从两个方面进行分析:一、问题所涉及的情况:问题所涉及的情况有哪些,情况...原创 2012-09-23 15:25:18 · 291 阅读 · 0 评论 -
贪心算法
贪心算法是指从问题的初始状态出发,通过若干次的贪心选择而得出最优值(或较优解)的一种解题方法。并不是从整体上加以考虑,它所做出的选择只是在某种意义上的局部最优解。 例如平时购物找钱时,为使找回的零钱的硬币数最少,不考虑找零钱的所有各种方案,而是从最大面值的币种开始,按递减的顺序考虑各币种,先尽量用大面值的币种,当不足大面值币种的金额时才去考虑下一种较小面值的币种。这就是在使...原创 2012-09-25 13:22:43 · 197 阅读 · 0 评论 -
采用贪心法求解着色问题(JAVA)
贪心法求解着色问题。 给图的所有结点着色,限制是一条边的两个端点不能用同样的颜色,要求所使用的不同颜色的数目最少。“贪心”算法的思想是首先 用第一种颜色对图中尽可能多的顶点着色(“尽可能多”表现出“贪心”);然后用第二种颜色对余下的顶点中尽可能多的顶点着色;如此等等,直到把所有的顶点都着完色。当用一种新颜色对余下的顶点着色时,我们采取下列步骤:(1)选取某个未着色的顶点,并...原创 2012-09-26 21:43:07 · 908 阅读 · 0 评论 -
动态规划算法学习十例之一
动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。 动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决。1...原创 2012-09-29 09:48:21 · 100 阅读 · 0 评论 -
动态规划算法学习十例之二
例一:计算二项式系数: 在排列组合里面,我们有下面的式子(很容易用组合的定义来证明):[img]http://dl.iteye.com/upload/attachment/0074/5221/2f21cf96-e6c5-3676-a114-3698fce0aec9.jpg[/img] 这个式子将C(n , k)的计算问题表述为了(问题描述)C(n-1 , k...原创 2012-09-29 13:49:42 · 131 阅读 · 0 评论 -
动态规划算法学习十例之三
例一: 给出N台电脑和K辆卡车,要求每辆卡车至少放一台电脑。问共有多少种放法运走这些电脑?数据范围N (1原创 2012-09-29 14:32:22 · 138 阅读 · 0 评论 -
动态规划算法学习十例之四
好文章,来自:http://blog.csdn.net/shuqin1984/archive/2010/09/02/5859223.aspx 0/1背包问题的动态规划法求解,前人之述备矣,这里所做的工作,不过是自己根据理解实现了一遍,主要目的还是锻炼思维和编程能力,同时,也是为了增进对动态规划法机制的理解和掌握。 值得提及的一个问题是,在用 JAVA 实现时, 是按算法...原创 2012-09-30 20:11:28 · 327 阅读 · 0 评论 -
弗洛伊德(Floyd)算法求任意两点间的最短路径
Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理带权有向图或负权的最短路径问题 解决此问题有两种方法:其一是分别以图中每个顶点为源点共调用n次Dijkstra[url]http://128kj.iteye.com/blog/1678532[/url]算法;其二是采用Floyd算法。两种算法的...原创 2012-10-01 07:46:37 · 804 阅读 · 0 评论 -
动态规划算法学习十例之五
1、最优二叉搜索树的动态规则算法二叉搜索树是一颗满足如下条件的树:1.每个节点包含一个键值2.每个节点有最多两个孩子3.对于任意两个节点x和y,它们满足下述搜索性质:a)如果y在x 的左子树里,则key[y] =key[x] 基于统计知识,我们可统计出一个数表(集合)中各元素的查找概率,理解为集合各元素的出现频率。比如中文输入法字库中各词条(单字、词组等)的先验概...原创 2012-10-03 00:12:37 · 112 阅读 · 0 评论 -
动态规划算法学习十例之六
一、数组的最大子段和问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最大值为: Max{0,a[i]+a[i+1]+…+a[j]},1...原创 2012-10-03 15:13:21 · 144 阅读 · 0 评论 -
动态规划算法学习十例之七
一、最长公共子序列(LCS)问题: 给定两个序列 X = {x1, x2, ......, xm } 和 Y = {y1, y2, ......, yn },找出 X 和 Y 的最长公共子序列。 一个给定序列的子序列是在该序列中删去若干个元素后得到的序列。给定两个序列 X 和 Y ,当另一序列 Z 既是 X 的子序列又是 Y 的子序列时,称 Z 是序列 X 和 Y 的公共子序列...原创 2012-10-04 11:15:25 · 118 阅读 · 0 评论 -
动态规划算法学习十例之八
矩阵链乘法最优结合问题一、《问题的引出》 看下面一个例子,计算三个矩阵连乘{A1,A2,A3};维数分别为10*100 , 100*5 , 5*50按此顺序计算需要的次数((A1*A2)*A3):10X100X5+10X5X50=7500次按此顺序计算需要的次数(A1*(A2*A3)):10X5X50+10X100X50=75000次所以问题是:如何确定运算...原创 2012-10-05 15:14:44 · 99 阅读 · 0 评论 -
动态规划算法学习十例之九
最长单调递增子序列的长度问题 所谓子序列,就是在原序列里删掉若干个元素后剩下的序列,以字符串"abcdefg"为例子,去掉bde得到子序列"acfg",。现在的问题是,给你一个数字序列,你要求出它最长的单调递增子序列的长度(LIS)。 设给定序列为 array[],大小为 n, 最长单调子序列必定以序列array[]中的某一个元素结尾,这是废话。 设lis[i]为以a...原创 2012-10-07 15:50:28 · 64 阅读 · 0 评论 -
龙抬头
[img]http://dl2.iteye.com/upload/attachment/0102/9273/e3b2b44f-3ffc-332f-8eb5-57a0101305c7.gif[/img][img]http://dl2.iteye.com/upload/attachment/0102/9275/635e45ce-5039-397e-acc6-df51fab4b7ea.gif[/im...原创 2014-11-10 15:06:57 · 98 阅读 · 0 评论