随笔分类 -  算法设计与分析

 
最长递增/递减子序列
摘要:《编程之美》里有个题目是要求数组中最长递增子序列,在CSDN上看到的题目是数组中的最长递减子序列。题目如下: 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2} 求一个数组的最长递增子序列 比如{1,-1,2,-3,4,-5,6,-7}的最长递减子序列为{1,2,4,3,6} 最长递增序列和最长递减子序列的解法是一样的,最不济,也可以先revert,求完再revert一次。 首先我们得搞清一个范围问题,虽然我们要的是一个最大值,但是是不是他是可以递推的呢,就是我只保存一个最大值,然后不断增加这个值,直觉上看应该是不太现实的,比如:1234 阅读全文
posted @ 2012-09-15 14:42 做个不善的人 阅读(7147) 评论(0) 推荐(3) 编辑
字符串问题分析方法
摘要:对于这样一类题目:输入是一个序列或者一个集合,求出满足条件的另一个序列或者集合。 这样的问题往往可以这样分析: 结果中包含某个元素x结果中包含某个元素x,并且按照以x开头或者结尾(适用于有序序列),或者保持某个相对顺序,像这一类问题,应该是只需要考察这几个可能出现的位置,而且考察一遍之后,不需要重复考察。但是,这一类问题的关键是需要知道什么时候考察某个元素的可能问题 下面是一个例子: 一个字符串,如果它的每个字符都不一样,那么它是unique的;如果str1可以通过将str2中的某些字符删掉而得到,那么str1是从时str2中producible的;如果str1的长度比str2的长度大,那么s 阅读全文
posted @ 2012-09-06 08:31 做个不善的人 阅读(663) 评论(0) 推荐(0) 编辑
回溯法、分支界限与动态规划
摘要:回溯法已经接近一种穷举搜索的算法了,可以说效率不是很高,而且往往用来求解求所有解的问题,比如说求出八皇后问题的所有解。 分支界限也比较类似回溯法。 在实现动态规划算法时,一般第一步就是实现递归版本的。但是一定要切记的是能递归的不一定是动态规划算法。 动态规划算法的实现需要有最优子结构的特征,下面是一个例子: 一个字符串是由 阅读全文
posted @ 2012-09-03 08:23 做个不善的人 阅读(1736) 评论(0) 推荐(0) 编辑
字符串编程练习1 -- 通配符匹配
摘要:字符串匹配问题:http://blog.csdn.net/qunqin/article/details/7462495 练习2是练习使用Tier树,求最长重复子串 练习3是 阅读全文
posted @ 2012-08-29 08:22 做个不善的人 阅读(326) 评论(0) 推荐(0) 编辑
汉诺塔 -- 从某个状态移动到另外一个状态
摘要:汉诺塔的变形题目: 现在有多个柱子,柱子上有若干盘子,盘子的摆放要求编号小的盘子一定在编号大的盘子的上面。初始时,若干个盘子分散在这些柱子上,要求实现一个算法,将盘子移动到其他柱子上。 这个题目其实并不是很难,但是一定要分析清楚和能够熟练使用递归算法。#include<iostream>#include<list>#include<stack>#include<algorithm>usingnamespacestd;classHanoiWithStatus{public:HanoiWithStatus(intn){m_pegs=n;Initial 阅读全文
posted @ 2012-08-26 16:54 做个不善的人 阅读(784) 评论(0) 推荐(0) 编辑
4柱汉诺塔(zz)
摘要:多柱汉诺塔可以用Frame–Stewart算法来解决。 The Frame–Stewart algorithm, giving a presumably optimal solution for four (or even more) pegs, is described below: Let be the number of disks. Let be the number of peg... 阅读全文
posted @ 2012-08-26 14:44 做个不善的人 阅读(11894) 评论(0) 推荐(2) 编辑
经典计算机算法设计方法(9) -- 迭代
摘要:http://www.madio.net/forum.php?mod=viewthread&tid=63494&page=2 阅读全文
posted @ 2012-08-25 16:42 做个不善的人 阅读(331) 评论(0) 推荐(0) 编辑
经典计算机算法设计方法(8) -- 递归
摘要:递归的使用场景 http://wenku.baidu.com/view/888a6de7524de518964b7d50.html 阅读全文
posted @ 2012-08-25 16:41 做个不善的人 阅读(292) 评论(0) 推荐(0) 编辑
经典计算机算法设计方法(7) -- 递推算法
摘要:这是一个递推的题目: 两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i];要求:1.不准用除法运算2.除了循环计数值,a[N],b[N]外,不准再用其他任何变量(包括局部变量,全局变量等)3.满足时间复杂度O(n),空间复杂度O(1)。 不能用除法,那b[i]的表示就可以分为两部分:a[0]*a[1]... 阅读全文
posted @ 2012-08-25 16:36 做个不善的人 阅读(380) 评论(0) 推荐(0) 编辑
经典计算机算法设计方法(6) -- 分治法
摘要:分治就是分而治之的意思了,分治法适用的情况 分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。 3) 利用该问题分解出的子问题的解可以合并为该问题的解; 4) 该问题所分解出的各... 阅读全文
posted @ 2012-08-25 16:31 做个不善的人 阅读(403) 评论(0) 推荐(0) 编辑
经典计算机算法设计方法(5) -- 贪心算法
摘要:能用贪心算法求解的问题一定可以使用动态规划求解 阅读全文
posted @ 2012-08-25 16:26 做个不善的人 阅读(446) 评论(0) 推荐(1) 编辑
经典计算机算法设计方法(4) -- 动态规划之二(实践篇)
摘要:1. 求数组中最长递增子序列的长度(注意:这里要求的是长度,并不是最长递增子序列)我有篇文章专门解答这个问题,见:2. 求两个字符串的最长公共子串这个算法在《算法导论》中有介绍,在充分理解了算法的分析过程后,实现一份代码 阅读全文
posted @ 2012-08-25 16:23 做个不善的人 阅读(311) 评论(0) 推荐(0) 编辑
经典计算机算法设计方法(3) -- 分支限界法
摘要:分支界限法类似于回溯法 阅读全文
posted @ 2012-08-25 16:22 做个不善的人 阅读(301) 评论(0) 推荐(0) 编辑
经典计算机算法设计方法(2) -- 回溯法
摘要:回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。什么情况下适合使用回溯法呢? 那先来看看适用回溯法的问题的一般描述: 可用回溯法求解的问题P,通常要能表达为:对于已知的由n元组(x1,x2,…,xn)组成的一个状态空间E={(x1,x2,…,xn)∣xi∈Si ,i=1,2,…,n},给定关于n元组中的一个分量的一个约束集D,要求E中满足D的全部约束条件的所有n元组。其中Si是分量xi的定义域,且 |Si| 有限,i=1 阅读全文
posted @ 2012-08-20 20:47 做个不善的人 阅读(699) 评论(0) 推荐(0) 编辑
经典计算机算法设计方法(1) -- 递归与迭代转化
摘要:汉诺塔是一个经典的递归算法案例,下面来描述问题: 汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求打印移动的步骤。 怎么解决这个问题呢,如果你已经很熟悉了,那就... 阅读全文
posted @ 2012-08-18 16:50 做个不善的人 阅读(4258) 评论(0) 推荐(0) 编辑
STL中rotate算法的理解
摘要:STL中rotate针对不同的迭代器有3种不同的实现,在http://blog.csdn.net/v_JULY_v/article/details/6322882中也有描述,这里以学习为目的,将这STL中rotate的RandomAccessIterator的算法整理一下 以下内容参考自:http://www.cnblogs.com/atyuwen/archive/2009/11/08/rotate.html 这里的rotate操作,也就是指循环移位。比如将串“ABCDEFG”以D为中心旋转,就相当将该串向左循环移位,直到第一个元素为D为止,最后得到新串“DEFGABC”。要想方便的完成ro. 阅读全文
posted @ 2012-07-31 08:26 做个不善的人 阅读(2480) 评论(0) 推荐(1) 编辑
数组分割类问题
摘要:问题1: 《编程之美》有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,并使两个子数组的和最接近。 问题2:有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。 问题2的解法:http://blog.csdn.net/v_JULY_v/article/details/61... 阅读全文
posted @ 2012-07-27 08:00 做个不善的人 阅读(379) 评论(0) 推荐(0) 编辑
将二叉树转化为链表
摘要:1. 将二叉树以螺旋顺序转化为双向链表 2. 将二叉树按照中序转化为链表; http://www.cnblogs.com/xwdreamer/archive/2012/04/28/2475300.html 3. 将二叉树按照深度优先的顺序转化为链表 http://stackoverflow.com/questions/3411793/convert-a-binary-tree-to-linked... 阅读全文
posted @ 2012-07-24 20:12 做个不善的人 阅读(2033) 评论(0) 推荐(0) 编辑
RMQ与LCA总结
摘要:RMQ的问题描述: RMQ的ST解法 LCA的问题描述 LCA与RMQ的转化 http://wenku.baidu.com/view/78ceaf54ad02de80d4d8408d.html http://eriol.iteye.com/blog/1170465 http://blog.csdn.net/qiuyang0607/article/details/7652310 http:/... 阅读全文
posted @ 2012-07-23 08:29 做个不善的人 阅读(471) 评论(0) 推荐(0) 编辑
海量数据处理方法的分析
摘要:本文可以认为是http://blog.csdn.net/v_JULY_v/article/details/6279498的读后感,我是按照我理解的语言重新表述了一下而已。 海量数据处理的常用方法包括一下几种: 1.分而治之/hash映射 + hash统计 + 堆/快速/归并排序;2.双层桶划分3.Bloom filter/Bitmap;4.Trie树/数据库/倒排索引;5.外排序;6.分布式处理之... 阅读全文
posted @ 2012-07-07 17:36 做个不善的人 阅读(1088) 评论(0) 推荐(0) 编辑