
算法
文章平均质量分 91
stormbjm
这个作者很懒,什么都没留下…
展开
-
POJ题目分类
OJ上的一些水题(可用来练手和增加自信)(poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)初期:一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法.转载 2012-12-20 17:49:47 · 603 阅读 · 0 评论 -
复杂链表的复制
Q:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。A:一开始想这道题毫无思路,如果蛮来,首先创建好正常的链表,然后考虑sibling这个分量,则需要O(n^2)的时间复杂度,然后一个技巧便可以转载 2013-05-15 16:10:19 · 892 阅读 · 0 评论 -
Catalan 卡特兰数数的分析和应用
问题描述:卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。输入一个整数n,计算h(n)。其递归式如下:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2,h(0) = h(1) = 1) 该递推关系的解为:h(n)=C(2n,n)/(n+1) (n=1,2,3,...)卡特兰数:规定h(0)=1,而h(1)=1,h(转载 2013-05-03 15:25:54 · 1160 阅读 · 0 评论 -
求质数算法的N种境界 (N > 10)
★题目 好,言归正传。下面俺就由浅入深,从各种角度来剖析这道题目的奥妙。 为了避免被人指责为"玩文字游戏"(有些同学自己审题不细,却抱怨出题的人玩文字游戏),在介绍各种境界之前,再明确一下题意。 前一个帖子已经介绍过,求质数可以有如下2种玩法。◇需求1请实现一个函数,对于给定的整型参数 N,该函数能够把自然数中,小于 N 的质数,从小到大打印出来。比如,当 N转载 2013-05-14 16:22:59 · 933 阅读 · 0 评论 -
在字符串中删除特定的字符
【题 目】输入两个字符串,从第一个字符串中删除第二个字符串中出现的所有字符。例如:输入"they are students." 与 “aeiou”,则应该输出“thy r stdnts.”。 【思 路1】首先我们还是以解决问题为第一要义,寻找最为直观的解决方案,很容易想到的方法就是,对于在第一个字符串中的每一个字符,拿它去查找是否在第二个字符串中出现过,如果是,则删除,如果不是则保留。转载 2013-05-14 15:50:10 · 1436 阅读 · 0 评论 -
异或运算 ^ 变量交换及找出现一次的数
一、交换2个变量如果想要交换2个变量,一般的做法是引入第三个变量,例如,[cpp] view plaincopytemp = a; a = b; b= temp; 这样2个变量中的值就实现了交换。那能不能不引入其他变量就可以实现变量值的交换呢?答案是肯定的。用异或操作可以实转载 2013-05-14 15:08:06 · 1255 阅读 · 0 评论 -
判断单链表是否有环 两链表是否相交
1、如何判断一个链表是不是这类链表? 2、如果链表为存在环,如果找到环的入口点?解答:一、判断链表是否存在环,办法为:设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。(当然,fast先行头到尾部为NULL,则为无环链表)程序如下:b转载 2013-04-25 00:06:13 · 664 阅读 · 0 评论 -
最长公共子序列--动态规划
动态规划法经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。【问题】 求两字符序列的最长公共字转载 2013-05-13 16:51:21 · 753 阅读 · 0 评论 -
rand7()构造rand10()
题目:已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。方法一:分 析:要保证rand10()在整数1-10的均匀分布,可以构造一个1-10*n的均匀分布的随机整数区间(n为任何正整数)。假设x是这个1-10*n 区间上的一个随机整数,那么x%10+1就是均匀分布在1-10区间上的整数。由于(rand7()-1)转载 2013-05-13 17:44:34 · 3090 阅读 · 0 评论 -
微软等面试100题系列--(61-80)
61.找出数组中两个只出现一次的数字(数组)题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析:这是一道很新颖的关于位运算的面试题。使用异或运算,参考http://blog.youkuaiyun.com/stormbjm/article/details/8925749转载 2013-05-15 11:07:04 · 922 阅读 · 0 评论 -
一致性hash算法 - consistent hashing
consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在 cache 系统中应用越来越广泛;1 基本场景比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的转载 2013-10-10 11:40:46 · 795 阅读 · 0 评论 -
格子取数问题,完美洗牌算法
第三十四章、格子取数问题 题目详情:有n*n个格子,每个格子里有正数或者0,从最左上角往最右下角走,只能向下和向右,一共走两次(即从左上角走到右下角走两趟),把所有经过的格子的数加起来,求最大值SUM,且两次如果经过同一个格子,则最后总和SUM中该格子的计数只加一次。 题目分析:此题是去年2013年搜狗的校招笔试题。初看到此题,因为要让两次走下来的路径总和最转载 2013-10-15 17:01:13 · 6286 阅读 · 1 评论 -
搜索智能提示suggestion,附近点搜索
第三十六章、搜索关键词智能提示suggestion题目详情:百度搜索框中,输入“北京”,搜索框下面会以北京为前缀,展示“北京爱情故事”、“北京公交”、“北京医院”等等搜索词,输入“结构之”,会提示“结构之法”,“结构之法 算法之道”等搜索词。请问,如何设计此系统,使得空间和时间复杂度尽量低。题目分析:本题来源于去年2012年百度的一套实习转载 2013-10-15 17:02:57 · 6989 阅读 · 2 评论 -
最小操作数,木块砌墙问题
第三十二章、最小操作数 题目详情如下: 给定一个单词集合Dict,其中每个单词的长度都相同。现从此单词集合Dict中抽取两个单词A、B,我们希望通过若干次操作把单词A变成单词B,每次操作可以改变单词的一个字母,同时,新产生的单词必须是在给定的单词集合Dict中。求所有行得通步数最少的修改方法。 举个例子如下:Given: A = "hit转载 2013-10-15 16:59:43 · 2380 阅读 · 0 评论 -
求一个数组中两个元素的最大差值
一个整数数组a[n],在a[n]中找两个数字,使得下标大的数字减去下表小的数字所得的差值最大,即:在a[n]中找 a[i] 和 a[j] ,使得 a[i] - a[j] 的值最大,并且 i > j 。 题目来自这里。寻求O(n)的解法,思路:记录已经遍历的元素中的最小值min和当前所求的最大差值r,然后继续遍历下一个元素。首先和当前最小值min求差,如果比r大,则更新r转载 2013-09-28 20:52:30 · 10323 阅读 · 0 评论 -
从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1、KD树;2、神经网络;3、编程艺术第28章。你看到,blog内的文章与你于别处所见的任何都不同。于是,等啊等,等一台电脑,只好等待..”。得益于田,借了我一台电脑(借他电脑的时候,我连表示感谢,他说“能找到工作全靠你的博客,这点儿小忙还说,不地道”,有的时候,稍许感受到受人信任也是一种压力,愿我不辜负大家对我的信任转载 2013-10-12 16:50:09 · 1473 阅读 · 0 评论 -
从B树、B+树、B*树谈到R 树
说明:本文从B树开始谈起,然后论述B+树、B*树,最后谈到R 树。其中B树、B+树及B*树部分由weedge完成,R 树部分由Frankie完成,全文最终由July统稿修订完成。出处:http://blog.youkuaiyun.com/v_JULY_v 。 第一节、B树、B+树、B*树1.前言:动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Bala转载 2013-10-12 16:52:09 · 937 阅读 · 0 评论 -
平面最近点对
求点集中的最近点对有以下两种方法: 设p1=(x1, y1), p2=(x2, y2), …, pn=(xn, yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近的点对。 1、蛮力法(适用于点的数目比较小的情况下)1)算法描述:已知集合S中有n个点,一共可以组成n(n-1)/2对点对,蛮力法就是对这n(n-1)/2对点对逐对进行距离计算,通过循环转载 2013-10-12 16:33:53 · 1061 阅读 · 0 评论 -
O(1)时间复杂度求栈的最小元素
题目: 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。 思路: 栈数据结构的特点是先进后出,push和pop操作都是对栈顶元素进行的操作,所以都是常数时间复杂度,即O(1),但是由于栈中数据是无序的,所以仅仅通过栈是无法得到最小元素的,又由于每次出栈和进栈都可能会使栈的最小元素发生变化,所以考虑用转载 2013-09-26 18:17:21 · 1227 阅读 · 0 评论 -
最长递减子序列--动态规划
例如:有一个序列,例如 9 8 2 1 7 5 3 4 3 2 1. 求出最长的递减子序列。如本例的结果就是:9 8 7 5 4 3 2 1。分析: 可采用动态规划的思想进行解答,时间复杂度为O(n^2). 设原数组为a[1....n]。另设一数组d[1....n],其中d[i]表示从第i个元素开始(一定包含第i个元素),到整个数组末尾转载 2013-05-13 10:27:28 · 4377 阅读 · 1 评论 -
微软等面试100题系列--(41-60)
41、求固晶机的晶元查找程序晶元盘由数目不详的大小一样的晶元组成,晶元并不一定全布满晶元盘,照相机每次这能匹配一个晶元,如匹配过,则拾取该晶元,若匹配不过,照相机则按测好的晶元间距移到下一个位置。求遍历晶元盘的算法 求思路。41.请修改append函数,利用这个函数实现:两个非降序链表的并集,1->2->3 和 2->3->5 并为 1->2->3->5另外只能转载 2013-05-13 15:31:19 · 1023 阅读 · 0 评论 -
全排列(1) ----字典序
引言对一个给定数据进行全排列,在各种场合经常会用到。组合数学中,生成全排列的方法有很多,卢开澄老师的《组合数学》中就介绍了三种:序数法,字典序法,临位互换法等。其中以字典序法由于算法简单,并且使用的时候可以依照当前状态获取下一个状态,直到所有排列全部完成,方便在程序中随要随用,应用比较广泛,STL中的Next_permutation也是使用此法。算法定义首先看什么叫字典序,顾名思转载 2013-04-26 11:20:36 · 1450 阅读 · 0 评论 -
布隆过滤器
假如有1亿个不重复的正整数(大致范围已知),但是只有1G的内存可用,如何判断该范围内的某个数是否出现在这1亿个数中?最常用的处理办法是利用位图,1*108/1024*1024*8=11.9,也只需要申请12M的内存。但是如果是1亿个邮件地址,如何确定某个邮件地址是否在这1亿个地址中?这个时候可能大家想到的最常用的办法就是利用Hash表了,但是大家可以细想一下,如果利用Hash表来处理,必须开辟空间转载 2013-04-24 21:56:39 · 934 阅读 · 0 评论 -
KMP算法详解
如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串。你可以委婉地问你的MM:“假如转载 2013-03-06 22:11:58 · 4392 阅读 · 0 评论 -
二叉树遍历--递归及非递归解法
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。一.前序遍历前序遍历按转载 2013-04-23 20:05:04 · 960 阅读 · 0 评论 -
外排序
说到排序,大家第一反应基本上是内排序,是的,算法嘛,玩的就是内存,然而内存是有限制的,总有装不下的那一天,此时就可以来玩玩外排序,当然在我看来,外排序考验的是一个程序员的架构能力,而不仅仅局限于排序这个层次。一:N路归并排序1.概序我们知道算法中有一种叫做分治思想,一个大问题我们可以采取分而治之,各个突破,当子问题解决了,大问题也就KO了,还有一点我们知道内排序的归并排序是采用二路转载 2013-04-09 11:31:28 · 758 阅读 · 0 评论 -
二分图的最大匹配
二分图指的是这样一种图,其所有顶点可以分成两个集合X和Y,其中X或Y中任意两个在同一集合中的点都不相连,所有的边关联在两个顶点中,恰好一个属于集合X,另一个属于集合Y。给定一个二分图G,M为G边集的一个子集,如果M满足当中的任意两条边都不依附于同一个顶点,则称M是一个匹配。图中包含边数最多的匹配称为图的最大匹配。 二分图的最大匹配有两种求法,第一种是最大流;第二种就是我现在要讲的匈转载 2013-03-04 09:54:51 · 1954 阅读 · 0 评论 -
二分图的最大匹配介绍及匈牙利算法
什么是二分图,什么是二分图的最大匹配,这些定义我就不讲了,网上随便都找得到。二分图的最大匹配有两种求法,第一种是最大流(我在此假设读者已有网络流的知识);第二种就是我现在要讲的匈牙利算法。这个算法说白了就是最大流的算法,但是它跟据二分图匹配这个问题的特点,把最大流算法做了简化,提高了效率。匈牙利算法其实很简单,但是网上搜不到什么说得清楚的文章。所以我决定要写一下。最大流算法的核心问题就是找增广转载 2013-03-04 16:58:06 · 583 阅读 · 0 评论 -
LIS 最长单调上升子序列
最近在做单调队列,发现了最长上升子序列O(nlogn)的求法也有利用单调队列的思想。 最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i 设dp[i]表示以i为结尾的最长递增子序列的长度,则状态转移方程为:dp[i] = max{dp[j]+1}, 1 这样简单的复杂度为O(n^2),其实还有更好的方法。转载 2013-04-02 11:34:48 · 813 阅读 · 0 评论 -
全排列(2)----邻位对换法
可以直觉地知道,只要把数组任意相邻的两个元素交换位置,就可以得到一个新的排列。例如把数组 [1,2,3,4,5] 的 5 和 4 交换位置就得到 [1,2,3,5,4],再把 5 和 3 交换位置就得到[1,2,5,3,4]……这样不停地交换就能得到所有的(不重复的)排列吗?这里有两个问题: 1)怎么知道交换相邻的两个元素就能得到所有的排列(还是说有时候也需要交换不相邻的元素)? 2)转载 2013-04-26 17:12:18 · 5259 阅读 · 0 评论 -
后缀数组及应用
【摘要】 后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也并不逊色,而且它比后缀树所占用的内存空间小很多。可以说,在信息学竞赛中后缀数组比后缀树要更为实用。本文分两部分。第一部分介绍两种构造后缀数组的方法,重点介绍如何用简洁高效的代码实现,并对两种算法进行了比较。第二部分介绍后缀数组在各种类型题目中的具体应转载 2013-04-28 17:31:56 · 1117 阅读 · 0 评论 -
poj 1011 回溯+剪枝 木棒问题
【题意】:乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。1.把所有木棍的长度从大到小排列,组合木棒时优先使用长的木棍,这样可以加快组合速度,并且对后面的剪枝有帮助。2.木棒的长度转载 2013-05-10 11:51:30 · 1845 阅读 · 0 评论 -
2013阿里巴巴实习笔试题 最后两题 明星问题+仓库运货
1. 有N个人,其中一个明星和n-1个群众,群众都认识明星,明星不认识任何群众,群众和群众之间的认识关系不知道,现在如果你是机器人R2T2,你每次问一个人是否认识另外一个人的代价为0(1),试设计一种算法找出明星,并给出时间复杂度。分析:这是一道老题,关键点在只有一个明星。首先分析一次询问的效果。is A 认识 B? (yes) A不是明星,B可能是明星 ;(no) A可能是明星,转载 2013-05-10 17:03:45 · 2531 阅读 · 0 评论 -
求二进制数中1的个数
问题描述任意给定一个32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4这也是一道比较经典的题目了,相信不少人面试的时候可能遇到过这道题吧,下面介绍了几种方法来实现这道题,相信很多人可能见过下面的算法,但我相信很少有人见到本文中所有的算法。如果您上头上有更好的算法,或者本文没有提到的算法,请不要吝惜您的代码,分享的转载 2013-05-24 10:25:12 · 986 阅读 · 0 评论 -
微软等面试100题系列--(21-40)
第21题2010年中兴面试题编程求解:输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.第22题:有4张红色的牌和4张蓝色的牌,主持人先拿任意两张,再分别在A、B、C三人额头上贴任意两张牌,A、B、C三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上转载 2013-05-07 10:32:06 · 871 阅读 · 0 评论 -
有向图强连通分量 --Tarjan算法
[有向图强连通分量]在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是转载 2013-02-28 19:21:48 · 747 阅读 · 0 评论 -
二叉树中节点的最大距离
问题定义如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。书上的解法书中对这个问题的分析是很清楚的,我尝试用自己的方式简短覆述。计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。情况B: 路转载 2013-05-08 10:55:18 · 1294 阅读 · 0 评论 -
微软等面试100题系列--(1-20)
1.把二元查找树转变成排序的双向链表题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14/ / / /4 8 12 16 转换成双向链表4=6=8=10=12=14=16。首先我们定义的二元查找树 节点的数据结构如下:struct BST转载 2013-05-06 18:52:50 · 889 阅读 · 0 评论 -
最长回文子串算法-- Manacher算法--O(n)
这里,我介绍一下O(n)回文串处理的一种方法。Manacher算法.原文地址:http://zhuhongcheng.wordpress.com/2009/08/02/a-simple-linear-time-algorithm-for-finding-longest-palindrome-sub-string/ 其实原文说得是比较清楚的,只是英文的,我这里写一份中文的吧。转载 2013-03-29 16:47:30 · 697 阅读 · 0 评论 -
90%程序员写不出无BUG的二分查找程序?
90%程序员写不出无BUG的二分查找程序?相关文章链接如下:微软过桥问题与测试人员素养等价类分法 新解测试用例设计中的NP难题测试驱动需求分析--需求文档评审实例C/C++代码检视实例《编程珠玑》(第二版)一书第四章中提及过100多名专业程序员使用两个小时的充足时间编写一个简单的二分查找程序,结果发现90%的人编出的代码都有BUG,Knuth也在他的《Sorting and转载 2013-10-30 19:53:36 · 1550 阅读 · 0 评论