
算法之道
文章平均质量分 68
月貘苏
女工程师一枚 目前专注于JVM性能监控工具开发
展开
-
单链表反转-C++
struct Link{ int data; Link *next;}; void reverse(Link* &head){ if((head==NULL)||(head->next==NULL)) return ; Link* pNext=NULL; Link* pPrev=head;//保存链表头指针 Link*原创 2012-08-20 17:50:15 · 1141 阅读 · 0 评论 -
整数划分问题解法2-动态规划
整数划分 --- 一个老生长谈的问题: 1) 练练组合数学能力. 2) 练练递归思想 3) 练练DP 总之是一道经典的不能再经典的题目: 这道好题求: 1. 将n划分成若干正整数之和的划分数。 2. 将n划分成k个正整数之和的划分数。 3. 将n划分成最大数不超过k的划分数。 4. 将n划分成若干奇正整数之和的划分数。 5. 将n划分成若原创 2012-12-06 15:21:26 · 12312 阅读 · 2 评论 -
整数划分问题
首先是递归解法整数划分问题是将一个正整数n拆成一组数连加并等于n的形式,且这组数中的最大加数不大于n。 如6的整数划分为 6 5 + 1 4 + 2, 4 + 1 + 1 3 + 3, 3 + 2 + 1, 3 + 1 + 1 + 1 2 + 2 + 2, 2 + 2 + 1 + 1, 2 + 1 + 1 + 1 +转载 2012-12-06 15:06:12 · 1287 阅读 · 0 评论 -
Map/Reduce 算法面试问题列表
1. Map/Reduce方式实现矩阵相乘http://www.norstad.org/matrix-multiply/index.html 2. Map/Reduce方式实现PageRank算法http://blog.ring.idv.tw/comment.ser?i=369http://code.google.com/p/map-reduce-assig转载 2013-01-23 14:27:06 · 1248 阅读 · 0 评论 -
字符串系列算法题
转载请注明作者:phylips@bmy 出处:http://duanple.blog.163.com/blog/static/70971767200982584340501/1.求最长回文子串。[解法]:将整个字 符串反过来写在原字符串后面,中间用一个特殊的字符隔开。这样就把问题变为了求这个新的字符串的某两个后缀的最长公共前缀。而某两个后缀的lcs的计算利用后缀数组,可以O(1),转载 2013-01-17 11:05:17 · 680 阅读 · 0 评论 -
字符串:KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组
涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用。当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟悉的大概是kmp,即使如此还是有相当一部分人也不理解kmp,更别说其他的了。当然一般的字符串问题中,我们只要用简单的暴力算法就可以解决了,然后如果暴力效率太低,就用个hash。当然hash也是一个面试转载 2013-01-17 17:13:04 · 917 阅读 · 0 评论 -
KMP匹配算法图解
问题:对于一个源字符串 source = "abababaababacb" 来说,查找其中包含子串 pattern = "ababacb" 出现的位置下标。 首先,我们通过最基本的方法来进行查找。i 表示当前用来匹配的 source 中字符的下标,j 表示当前用来匹配的模板的下标。i01234转载 2013-01-18 16:25:43 · 1050 阅读 · 0 评论 -
算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)
我个人一直很喜欢算法一类的东西,在我看来算法是人类智慧的精华,其中蕴含着无与伦比的美感。而每次将学过的算法应用到实际中,并解决了实际问题后,那种快感更是我在其它地方体会不到的。 一直想写关于算法的博文,也曾写过零散的两篇,但也许是相比于工程性文章来说太小众,并没有引起大家的兴趣。最近面临毕业找工作,为了能给自己增加筹码,决定再次复习算法方面的知识,我决定趁这个机会,写一系列关于算转载 2013-02-04 20:54:17 · 800 阅读 · 0 评论 -
算法杂货铺——分类算法之决策树(Decision tree)
在前面两篇文章中,分别介绍和讨论了朴素贝叶斯分类与贝叶斯网络两种分类算法。这两种算法都以贝叶斯定理为基础,可以对分类及决策问题进行概率推断。在这一篇文章中,将讨论另一种被广泛使用的分类算法——决策树(decision tree)。相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置,因此在实际应用中,对于探测式的知识发现,决策树更加适用。3.2、决策树引导转载 2013-02-04 21:03:57 · 1060 阅读 · 0 评论 -
飞机加油智力题
已知: 每个飞机只有一个油箱,飞机之间可以相互加油,注意是相互,没有加油机,一箱油可供一架飞机绕地球飞半圈。 问题: 为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机? A:所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场B:所有飞机从同一机场,同一方向起飞,而且必须安全返回机场,不允许中途降落,转载 2013-02-26 10:21:09 · 2758 阅读 · 0 评论 -
车站与座位智力题
1、有一路公共汽车,包括起点站和终点站共有10个停车站。有一路公共汽车,包括起点站和终点站共有10个停车站。如果有一辆车,除终点站外,每一站上车的乘客中,恰好在以后的每一站都各有一人下车。为了使每位乘客都有座位,这辆汽车最少要有多少个座位?最佳答案每站上车及以后每站所剩人数站次........1..2..3..4..5..6..7..8..9..101:....转载 2013-02-26 10:28:15 · 2121 阅读 · 0 评论 -
归并排序
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。[cpp] view plaincopy转载 2013-02-27 14:25:28 · 704 阅读 · 0 评论 -
希尔排序
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很转载 2013-02-27 14:47:33 · 793 阅读 · 0 评论 -
谷歌智力题:扔鸡蛋
只给你二个鸡蛋,你能上100层楼,你想知道鸡蛋的硬度。鸡蛋可能很硬或很脆弱,如果鸡蛋从第m层掉下而没破裂,而从第m+1层掉下就破裂了,那么这个鸡蛋的硬度就是m。你需要找出这个m和在最坏情况下最少试验次数。(经典鸡蛋问题)A: 计算机学生可能会首先用第一个鸡蛋做二分搜索(O(logN))再用第二个递增做线性搜索(O(N)),最后必将用线性搜索结束因为用第二个鸡蛋时你无法确定最高一层。因此,问转载 2013-03-01 10:24:15 · 4530 阅读 · 1 评论 -
猴子吃香蕉 智力题
大象吃香蕉(猴子搬香蕉)的问题问题:说有一只大象,每走一米要吃一只香蕉,否则就走动了。然后大象要从A走到B,之间的距离是1000米。出发点有2000只香蕉,大象最多能带着1000只香蕉赶路。大象最多能运多少只香蕉到终点?怎么运?为什么这是最多了? 回答:回答一:开始大象走一米,带1000支香蕉,然后返回,再带1000支香蕉过去,过程中转载 2013-03-01 11:21:56 · 7377 阅读 · 1 评论 -
倒水问题(智力)
倒水问题的经典形式是这样的: "假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。问题是如何只用这2个水壶从池塘里取得3升的水。" 当然题外是有一些合理的限制的,比如从池塘里灌水的时候,不管壶里是不是已经有水了,壶一定要灌满,不能和另一个壶里的水位比照一下"毛估估"(我们可以假设壶是不透明的,而且形状也不同);同样的,如果要把水从壶里倒进池塘里转载 2013-03-01 16:22:28 · 1805 阅读 · 0 评论 -
K-d Tree算法
k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构。主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。应用背景 SIFT算法中做特征点匹配的时候就会利用到k-d树。而特征点匹配实际上就是一个通过距离函数在高维矢量之间进行相似性检索的问题。针对如何快速而准确地找到查询点的近邻,现在提出了很多高维空间索引结构和近似查询的算法,k-d树就是其中一种。转载 2012-12-04 13:38:26 · 1944 阅读 · 0 评论 -
顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:1 2 3 45 6 7 89 10 11 1213转载 2012-12-04 16:20:45 · 800 阅读 · 0 评论 -
把二元查找树转变成排序的双向链表--算法001
1.把二元查找树转变成排序的双向链表题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。10/ \6 14/ \ / \4 8 12 16转换成双向链表4=6=8=10=12=14=16。首先我们定义的二元查找树节点的数据结构如下:struct BSTreeNode{int m_nVa原创 2012-08-16 16:01:55 · 829 阅读 · 0 评论 -
在二元树中找出和为某一值的所有路径
在二元树中找出和为某一值的所有路径题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如 输入整数22和如下二元树 10 / \ 5 12 / \ 4 7则打印出两条路径:10, 12和10, 5, 7。二元树节点的数据结构定义为:转载 2012-09-11 21:59:54 · 713 阅读 · 0 评论 -
四人过桥、三盏灯 三个开关 的答案
1. 有两个房间,其中一间房里有三盏灯,另一间房里有控制这三盏灯的开关。这两间房是相对独立、相对封闭的,没有空 上的直接联系;三盏灯与三个开关也没有顺序上的必然联系。现在只允许你分别进入这两个房间一次,然后判断三盏灯分别是由哪个开关控制的 2. 四人组合的2x合唱团赶往演唱会场,途中必需经过一座桥,天色很暗,而他们只有一只手电筒。一次时最多 有两人一起过桥,而过桥的时候必须持有手转载 2012-09-14 15:08:35 · 2468 阅读 · 1 评论 -
输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \ / \ 5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵转载 2012-09-14 16:51:47 · 3875 阅读 · 2 评论 -
随机数的相关面试题
当前面试中各大名企经常出现各种各样的概率类面试题。究其原因,我觉得是概率型面试题可以综合考查面试者的思维能力、应变能力、数学能力。在这里对各种类型的概率型题目进行了收集和总结,希望在自我总结的同时对大家有所帮助。1、给你一个数组,设计一个既高效又公平的方法随机打乱这个数组(此题和洗牌算法的思想一致)方法比较简单,基本思想是每次随机取一个数,然后把它交换到最后的位置。然后对前(n-1转载 2012-09-21 15:16:20 · 3347 阅读 · 0 评论 -
1000个无序数查找两个重复数
按位异或运算符: ^两个相同的数按位异或结果为0任何数和零按位异或结果为这个数本身 根据按位异或的以上特性, 我们可以为下面这首题目给出一个简便的算法:有一个长度为10000的数列, 存放着1-10000的自然数, 连续, 不重复, 但数列并不是有序的现在随机选取1-10000之间的某个自然数, 加入到这个数列中, 要求用简便的算法找到这个后来加入的数 分析一下,转载 2012-09-21 14:59:33 · 5985 阅读 · 0 评论 -
《编程之美》读书笔记12: 3.8 求二叉树中节点的最大距离
问题:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。 实际上就是求树的直径。若采用“动态规划方法”思想,会将该问题分解成“具有最大距离两点间的路径是否经过根节点”两个子问题,然后再对这两个子问题求解判断。实际上,不必这么麻烦。距离最远的两点必然在以某个节点A为根的子树上,它们间转载 2012-09-21 15:45:26 · 1422 阅读 · 3 评论 -
动态规划方法求解最长公共子串
第一部分、什么是动态规划算法 ok,咱们先来了解下什么是动态规划算法。 动态规划一般也只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。动态规划算法分以下4个步骤:描述最优解的结构递归定义最优解的值按自底向上的方式计算最优解的值 //转载 2012-11-08 14:08:38 · 10395 阅读 · 1 评论 -
回溯法之子集树与排列树
当所给问题是从n个元素的集合S中找出满足某种性质的子集时,解空间为子集树。 当所给问题是从n个元素的集合S中找出满足某种性质的排列时,解空间为排列树。 回溯法搜索子集树算法描述为: void backtrack(int t) { if(t>n) output(x); else fo转载 2012-11-08 16:59:45 · 3297 阅读 · 0 评论 -
耶鲁公开课《博弈学》读书笔记
一直对博弈论很感兴趣,从前断断续续看的《博弈游戏》那本书,虽然很有趣写的很不错,但是毕竟充其量只是枕边读物或者厕所读物。刚刚看完耶鲁的《博弈论》课程第一集,希望能在此记录下一些心得,将课程讲的内容用自己的理解写出来,仅是作为一种锻炼方式,并同时作为日后的参考。希望能坚持下来。用百度贴吧的话说,希望不是太监。好吧,这就开始~ 先列出几个解释: 囚徒困境(Pris转载 2012-11-27 11:44:57 · 2155 阅读 · 0 评论 -
动态规划系统之走迷宫
[题目描述]有一个n*n的迷宫,每个方格里都有着相应的数字。你从左上角出发,每次可以向上下左右四个方向最多移动k格,并且要求你每次到达的方格里的数字必须大于上一次所在方格的数字。现在要求你走过的方格的所有数之和最大,问这个最大和是多少。[输入]输入数据第一行为两个正整数N、K(1接下来的n行,每行有n个不超过integer范围的整数,表示地图中的数。[输出]输出数据只有一行转载 2012-11-15 16:38:45 · 5769 阅读 · 3 评论 -
Manacher算法:求解最长回文字符串,时间复杂度为O(N)
如何在O(n)时间内处理字符串以每个位置为中心的最长回文。这里转载一个Manacher算法的论文翻译。经常有一些题目围绕回文子串进行讨论,比如POJ3974最长回文,求最长回文子串的长度。朴素算法是依次以每一个字符为中心向两侧进行扩展,显然这个复杂度是O(N^2)的,关于字符串的题目常用的算法有KMP、后缀数组、AC 自动机,这道题目利用扩展KMP可以解答,其时间复杂度也很快O(N*logN)。但翻译 2012-11-29 15:33:34 · 2406 阅读 · 0 评论 -
动态规划专题之滑雪
问题描述:Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 8转载 2012-11-15 16:32:36 · 1221 阅读 · 0 评论 -
动态规划小解
动态规划其实质上是通过开辟记录表,记录已求解过的结果,当再次需要求解的时候,可以直接到那个记录表中去查找,从而避免重复计算子问题来达到降低时间复杂度的效果。实际上是一个空间换时间的算法。动态规划,通常可以把指数级的复杂度降低到多项式级别。一般算法书都会讲能不能用动态规划来求解问题,通常是判断有没有最有解结构,通常是通过“剪切技术”来判断:即证明问题的一个最优解中,使用的子问题的解本转载 2012-11-15 16:54:54 · 755 阅读 · 0 评论 -
PKU_1002 浮点数N次方的精确计算
求浮点数的乘方, 比如R^n次方 PKU ACM 1001Sample Input95.123 120.4321 205.1234 156.7592 998.999 101.0100 12Sample Output548815620517731830194541.899025343415715973535967221869852721.00000005148转载 2012-11-21 14:57:37 · 2013 阅读 · 0 评论 -
汽车加油问题(智力题)
题目如下: 一辆载油500升的汽车从A开往1000公里外的B,已知汽车每公里耗油量为1升,A处有无穷多的油,其他任何地点都没有油,但该车可以在任何地点存放油以备中转,问从A到B最少需要多少油。 这个题想了好多天也没想出来,在网上找答案也都是基本相同的,只给出了一个结论,而没有一个详细推导过程。今天没事在家仔细 的推导了一下,终于有些眉目了。记录如下:由最少耗油转载 2013-03-02 11:03:12 · 3028 阅读 · 0 评论