随笔分类 -  Algorithm Introduction

算法设计是很有意思的
摘要:A*算法启发式搜索算法,是一种在平面图形上,有多个结点的路径,求出最低通过成本的算法。参考http://www.java3z.com/cwbwebhome/article/article2/2825.htmlhttp://blog.csdn.net/v_JULY_v/article/details/6093380http://blog.csdn.net/v_JULY_v/article/details/6238029DFS,深度优先搜索,可以使用stack实现,BFS,广度优先搜索,可以使用queue实现,这两种都是盲目型搜索。A*,启发式搜索:在当前搜索结点往下选择下一步结点时,可以通过一个 阅读全文
posted @ 2013-09-29 11:30 Frandy.CH 阅读(436) 评论(0) 推荐(0) 编辑
摘要:第7章,动态规划,Dynamic Programming 又是动态规划,上一次想整理动态规划,结果还没有整理完,实际上是没有整理的动力了,整理一道题都好费时间的。 现在又要整理,这次能整理多少了?已经开始写了,那至少有些成果吧。 最长公共子序列问题 书上例题,先简单分析一下,然后看与之类似的一个问题。 给出两个长度为n和m的字符串A=a1a2..an和B=b1b2..bm,确定A和B的最长公共子序列的长度。其中,子序列的定义是形式为ai1,ai2,..aik的字符串,ij满足1<i1<i2<..<ik<n,也就是没有要求子序列是元字符串中连续的字符序列。 为了使用 阅读全文
posted @ 2012-06-16 13:51 Frandy.CH 阅读(219) 评论(0) 推荐(0) 编辑
摘要:第6章,分治法,divide & conquer 分治,分而治之,先把问题划分为小问题,先解决小问题,然后把小问题的解组合得到的大问题的解。这跟归纳法类似之处在于,都是先解决小问题,再由小问题得到大问题的解。只是归纳法中小问题的解与大问题的解之间是递推关系,分治法多个小问题之间是并列关系。 经典算法有合并排序,快速排序,大整数乘法,矩阵分块乘法,寻找第k小元素,最近点对。下面先看排序算法。 在review1.2里面,已经给除了集中经典的排序算法的实现,并且给出归并排序和快速排序的时间复杂度都是O(nlogn),而这一章给出了一个平均比较次数(不是运行时间的)的测试结果,归并排序的性能比 阅读全文
posted @ 2012-06-16 13:49 Frandy.CH 阅读(167) 评论(0) 推荐(0) 编辑
摘要:第14章,随机算法,random algorithm。 随机算法,当算法在执行过程中面临一个选择时,随机行选择常比最优选择快,因此随机算法可以在一定程度上降低算法的复杂度。 由于随机过程的存在,对所求解问题的同一个输入,可能得到完全不同的输出。 随机算法一般分为四类,数值随机算法,蒙特卡罗(Monte Carlo)算法,拉斯维加斯(Las Vegas)算法和舍伍德(Sherwood)算法。 数值概率算法常用于数值问题的求解。这类算法所得到的往往是近似解。而且近似解的精度随计算时间的增加不断提高。在许多情况下,要计算出问题的精确解是不可能或没有必要的,因此用数值概率算法可得到相当满意... 阅读全文
posted @ 2012-06-16 13:38 Frandy.CH 阅读(267) 评论(0) 推荐(0) 编辑
摘要:复习算法,整理一下这个KMP算法。给定一个长为n的字符串S,和长为m的模式字符串P,判断P是否在S中出现,如果出现给出位移。直接的想法就是,循环,从S的第i位开始,比较S[i,..,i+m-1]与P是否相同,这样的循环要n-m+1次,每次循环的时间复杂度O(m),那么总的时间复杂度就是O(nm)。对字符串的查找有更快的线性时间算法,那就是KMP算法。K就是Knuth。KMP算法的主要思想是,对模式字符串预处理,得到自身匹配的位移信息,然后在与目标字符串匹配的过程中,如果发生不匹配,那么接下来根据自身匹配的位移信息进行移位,例如S=abababca,P=ababca,模式字符串自身匹配位移信息如 阅读全文
posted @ 2012-06-16 13:37 Frandy.CH 阅读(417) 评论(0) 推荐(0) 编辑
摘要:归纳法这一章里提到的其他算法有整数幂,多项式求值,生成排列和寻找多数元素的算法。 整数幂算法中,x^n,当指数n为偶数时,可以先求解y=x^(n/2),然后y=y^2即得到结果,当n是基数时,y=x^((n-1)/2),y=y^2,y=xy,只需要补充一步。当然,求解x^(n/2)是直接递归调用整数幂的过程。 多项式求值,将多项式改写为嵌套乘法的形式,以减少乘法操作的次数,使得算法加速。在http://www.cnblogs.com/skyivben/archive/2012/05/13/2497900.html#2376283 测试了这种优化方法,得出了一些很有意思的结果。 生成排... 阅读全文
posted @ 2012-05-15 20:42 Frandy.CH 阅读(206) 评论(0) 推荐(0) 编辑
摘要:第五章,归纳法,Induction。 对于带有参数n的问题,在寻找这类问题的解时,有时可以从求解一个带有小一点参数的相同问题开始,如参数是n-1,n/2等,然后再把解推广到参数为n的情况。这个过程可以用数学归纳法证明。如数学归纳法有个前提条件一样,只有在知道如何求解参数小于n的同样问题时,这个递推归纳的过程才能进行。所以这种算法过程也很容易的可以写成递归。 典型的例子,选择排序,插入排序,基数排序等等。这里给出几个典型的程序。 基数排序 参考http://www.cnblogs.com/dlutxm/archive/2011/10/20/2219321.html 这位博主的代码很... 阅读全文
posted @ 2012-05-15 19:43 Frandy.CH 阅读(180) 评论(0) 推荐(0) 编辑
摘要:几种经典的查找和排序算法。 查找算法有线性查找,二分查找。线性查找就是遍历所有元素,直到找到目标元素,时间复杂度为O(n),相对于输入规模是线性的。二分查找,在数组已经排序的情况下,可以进行二分查找,每次缩小一半的查找范围,时间复杂度为O(logn)。需要注意的是,算法里面的log表示log2. 这两个算法的代码如下:#include <vector>#include <iostream>using namespace std;/* * 线性查找,即遍历所有元素查找 */ template<class Type>int LinearSearch(vector 阅读全文
posted @ 2012-05-13 21:28 Frandy.CH 阅读(220) 评论(0) 推荐(0) 编辑
摘要:算法课要考试了。没想到一晃就到学期末了。一开始是打算边上课边整理算法的学习笔记的,结果拖到现在了。如果现在复习的时候不整理,估计以后都不会整理了。那就现在整理吧。 课本,算法设计技巧与分析。 先来看第一章,主要内容是复杂性的概念和分析。 为了分析算法的复杂性,提出了计算时间复杂性和空间复杂性的方法。对于时间复杂性,计数元运算操作的次数。元运算如算数运算,包括加减乘除,还有比较和逻辑运算,赋值运算,包括遍历表或树的指针赋值。对于空间复杂性,计数用到的存储单元,不包括分配用来存储输入的空间。 复杂性是相对于问题的输入规模而言的。当输入是一个列表的时候,输入规模是列表元素的个数,而当输入... 阅读全文
posted @ 2012-05-12 20:56 Frandy.CH 阅读(218) 评论(0) 推荐(0) 编辑
摘要:动态规划(Dynamic Programming)可以用来非常有效的解决许多搜索优化问题。这类问题都有相同的地方,原问题可以分解为子问题,子问题中有重复的部分(overlapping subproblem),或者原问题的最优解与子问题的最优解具有相同的结构(optimal substructure),将规模较小的子问题的最优解扩展为规模较大的问题的最优解。它之所以有效,是因为它采用自底向上的方式递推求值,并把中间结果存储起来以便以后用来计算所需要求的解。 动态规划虽然比较容易理解,在应用过程中可以分为两步,先找出子问题的最优结构,然后找出子问题的最优解向规模较大子问题的最优解扩展。但在具... 阅读全文
posted @ 2012-04-27 22:47 Frandy.CH 阅读(731) 评论(0) 推荐(0) 编辑
摘要:在《算法设计技巧与分析》5.5节介绍了多项式求值的嵌套乘法,也称作Horner规则,即Pn(x)=anxn+an-1xn-1+...+a1x+a0=((...(((anx+an-1)x+an-2)x+an-3)...)x+a1)x+a0。这个是很容易就实现的。这里要求次数是连续的并且大于等于0。如果定义多项式的数据结构poly.h如下, 1 #ifndef POLY_H_ 2 #define POLY_H_ 3 4 #include <vector> 5 #include <iostream> 6 #include <iomanip> 7 using nam 阅读全文
posted @ 2012-03-24 13:53 Frandy.CH 阅读(638) 评论(0) 推荐(0) 编辑
摘要:在《算法设计技巧与分析》这本书的第四章,介绍了堆。于是按照上面的伪代码实现了一下。数据结构定义maxHeap.hpp如下, 1 #ifndef MAX_HEAP_HPP_ 2 #define MAX_HEAP_HPP_ 3 4 #include <vector> 5 using std::vector; 6 7 class MaxHeap 8 { 9 public:10 MaxHeap(vector<int>& A);11 void Insert(int x);12 int DeleteMax();13 void So... 阅读全文
posted @ 2012-03-24 11:37 Frandy.CH 阅读(346) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示