算法
文章平均质量分 77
koudaidai
这个作者很懒,什么都没留下…
展开
-
动态规划总结五 poj 1458 Common Subsequence(最长公共子序列)
Common SubsequenceTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 29399 Accepted: 11387DescriptionA subsequence of a given sequence is the g转载 2012-10-13 11:16:22 · 831 阅读 · 0 评论 -
波兰表达式
逆波兰表达式逆波兰表达式又叫做后缀表达式。在通常的表达式中,运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。波兰逻辑学家 J.Lukasiewicz于1929年提出了另一种表示表达式的方法。按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。这个知识点在数据结构原创 2012-05-31 18:47:21 · 2075 阅读 · 0 评论 -
深度优先搜索和广度优先搜索
一、深度优先搜索和广度优先搜索的深入讨论(一)深度优先搜索的特点是无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生规则以及输出要求。(2)深度优先搜索法有递归以及非递归两种设计方法。一般的,当搜索深度较小、问题递归方式比较明显时,用递归方法设计好,它可以原创 2012-05-27 16:35:02 · 7262 阅读 · 0 评论 -
Catalan数应用
什么是Catalan数说到Catalan数,就不得不提及Catalan序列,Catalan序列是一个整数序列,其通项公式是我们从中取出的就 叫做第n个Catalan数,前几个Catalan数是:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 3535767转载 2012-04-28 10:33:28 · 951 阅读 · 0 评论 -
深度优先搜索 广度优先搜索类训练题
【题目1】N皇后问题(八皇后问题的扩展)【题目2】排球队员站位问题【题目3】把自然数N分解为若干个自然数之和。【题目4】把自然数N分解为若干个自然数之积。【题目5】马的遍历问题。【题目6】加法分式分解【题目7】地图着色问题【题目8】在n*n的正方形中放置长为2,宽为1的长条块,【题目9】找迷宫的最短路径。(广度优先搜索算法)【转载 2012-05-27 16:40:09 · 3499 阅读 · 0 评论 -
回溯算法
回溯法其实也是一种搜索算法,它可以方便的搜索解空间。 回溯法解题通常可以从以下三步入手: 1、针对问题,定义解空间 2、确定易于搜索的解空间结构 3、以深度优先的方式搜索解空间,并在搜索的过程中进行剪枝 回溯法通常在解空间树上进行搜索,而解空间树通常有子集树和排列树。 针对这两个问题,算法的框架基本如下: 用回溯法搜索子集合树的一般框架:Cpp代码转载 2012-05-27 14:24:28 · 1426 阅读 · 0 评论 -
动态规划总结
算法总体思想 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题。但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。动态规划基本步骤:(1)找出最优解的性质,并原创 2012-05-27 14:08:12 · 749 阅读 · 0 评论 -
算法——直接插入和希尔排序
插入排序包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序)。算法思想:假定这个数组的序是排好的,然后从头往后,如果有数比当前外层元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前k个数之后,可以保证a[1…k]是局部有序的,保证了插入过程的正确性.1.直接插入每次从无序表中取出第一个元素,把原创 2012-01-05 10:38:00 · 1511 阅读 · 0 评论 -
十七道海量数据处理面试题与Bit-map详解
第一部分、十五道海量数据处理面试题1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个转载 2012-05-04 16:43:31 · 755 阅读 · 0 评论 -
选择排序
定义:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。程序:// 冒泡排序.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#includeusing namespace std;void swap(int &a,int &b){ int原创 2012-04-20 16:08:41 · 451 阅读 · 0 评论 -
大数四则运算的C++实现
大数四则运算的C++实现[摘要] 大数运算不仅仅运用在密码学中,还运用在一些物理学研究、生物学,化学等科目中。大数运算,意味着参加的值和计算结果通常是以上百位数,上千位数以及更大长度之间的整数运算。例如大家所熟知圆周率π的值,在一般的数值计算中用到圆周率的不须要多大的精度,但在计算一些星球或是星系上的体积面积时便显的误差很大了,这就要求π值计算的精度达到几百万位甚至更高,才能缩小误转载 2012-05-31 18:42:51 · 1994 阅读 · 0 评论 -
澄清P问题、NP问题、NPC问题的概念
这或许是众多OIer最大的误区之一。你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。你要知道,大多数人此时所说的NP问题其实都是指的NPC问题。他们没有搞清楚NP问题和NPC问题的概念。NP问题并不是那种“只有搜才行”的问题,NPC问题才是。好,行了,基本上这个误解已经被澄清了。下面的内容都是在讲什么是P问题,什么是NP问题,什么是NPC转载 2012-06-01 15:37:43 · 893 阅读 · 0 评论 -
BP算法和KMP算法
一.BF算法(朴素的模式匹配算法) BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。 举例说明: S: ababcababa P: ababa BF算法匹配的步骤原创 2012-05-15 14:50:04 · 1445 阅读 · 0 评论 -
将1、2、...、20这20个数排成一排,使得相邻的两个数之和为一个素数,且首尾两数字之和也为一个素数。
将1、2、...、20这20个数排成一排,使得相邻的两个数之和为一个素数,且首尾两数字之和也为一个素数。这里提供了三种方法:(注意:为了让程序更快,根据排列的特点,每种方法都固定了最后一个元素,这样输出只是满足条件中的一部分,但是你可以修改每种方法中的输出,所有元素通过移动一个位置来输出, 如123,第一次输出123,第2次231,第3次312,这样就可以得到所有的解。)转载 2012-10-17 18:32:31 · 4283 阅读 · 0 评论 -
求最大子序列和
比较经典的算法问题,能够很好的体现动态规划的实现,以一点“画龙点睛” 大大精简了算法复杂度,且实现简单。本文中实现了4种:一般 maxSubSequenceSum0 O(n^3)简单优化过的算法 maxSubSequenceSum1 O(n^2)分治法优化的算法 maxSubSequenceSum2 O(n*log(n))动态规划的算法 maxSubSequence转载 2012-10-15 10:04:49 · 925 阅读 · 0 评论 -
排序算法总结
1. 简述 本文主要说明一些常用的内部排序算法的分类、复杂性和稳定性。主要基于现在的理解和学习,详细准确的复杂度可以参见维基百科等比较权威的网站,对于一些算法的不同实现,复杂度也不同,这里给出的复杂度都是相对较好的算法的复杂度。2. 分类 3. 复杂性和稳定性 冒泡排序:在已经有序的情况,取得O(N)的复杂度。 快速排序转载 2012-10-12 11:32:46 · 798 阅读 · 0 评论 -
ACM的算法分类
OJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法转载 2012-10-12 09:37:06 · 9777 阅读 · 1 评论 -
Dijkstra算法 ——四人过桥
有一天晚上,有四个人需要通过架在山谷间的危桥,任意时刻最多只能有两个人在桥上,过桥需要一盏闪光灯,这些人只有一盏闪光灯。如果单独过桥他们分别需要10、5、2、1分钟,如果两人同时过桥则所需时间是较慢者所需的时间。18分钟后,沿山谷滚滚而下的山洪将把这座桥冲毁。这四个人能及时过桥吗?不用图论知识,证明你的结论;并说明如何用图论知识获得答案。证明:只有一只手电筒,并且过桥时必须要用到手电筒转载 2012-08-24 16:19:55 · 10975 阅读 · 1 评论 -
中序非递归遍历二叉树
中序遍历二叉树,即是先遍历左子树,再访问根节点,最后遍历右子树,这个顺序对于每棵子树都是一样的,是访问子树的共性,故可依次顺序设置循环,逐一访问每个结点。对于每一个树的子树,均要完成此操作。故在开始遍历之时,应先找到最左边的结点,遍历应从此开始。访问完此结点,应逐一访问此结点的根结点和右子树。 有点难度的第一是找最左节点。方法是从树的根结点顺lchild而下直到NULL为止。二是访问完根节原创 2012-06-28 16:00:21 · 1245 阅读 · 0 评论 -
递归算法学习———汉诺塔
由来:汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求打印移动的步骤。假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f原创 2012-06-21 10:18:32 · 2882 阅读 · 0 评论 -
面试题之2个有序数组求合并后的中位数
2个有序数组求合并后的中位数 第一步:假设两个有序数组(已经各自排序完成了)长度相等,试写函数找出两个数组合并后的中位数。第二步:假设两个有序数组长度不等,一样的求出中位数 解析: 这个题目看起来非常简单。第一题的话: 假设数组长度为n, 那么我就把数组1和数组2直接合并,然后再直接找到中间元素。对于这样的方案,第一题和第一题就没有什么区转载 2012-07-05 16:52:29 · 1214 阅读 · 0 评论 -
逆序数的几种求法
逆序对:数列a[1],a[2],a[3]…中的任意两个数a[i],a[j] (i,如果a[i]>a[j],那么我们就说这两个数构成了一个逆序对逆序数:一个数列中逆序对的总数如数列 3 5 4 8 2 6 9(5,4)是一个逆序对,同样还有(3,2),(5,2),(4,2)等等那么如何求得一个数列的逆序数呢?方法1:一个一个的数最简单也是最容易想到的方法就是,对于数列中的每一原创 2012-05-24 20:58:10 · 1392 阅读 · 0 评论 -
冒泡排序
冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数原创 2012-04-20 15:48:32 · 611 阅读 · 0 评论 -
堆排序
堆排序 堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为原创 2012-05-04 11:01:21 · 509 阅读 · 0 评论 -
算法导论——归并算法
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。 归并排序的算法思想:把待排序序列分成相同大小的两个部分,依次对这两部分进行归并排序,完毕之后再按照顺序进行合并。// 归并原创 2012-01-13 16:27:40 · 611 阅读 · 0 评论 -
动态规划算法
一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能原创 2012-02-14 15:38:33 · 529 阅读 · 0 评论 -
分治算法
一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其原创 2012-02-14 10:20:16 · 538 阅读 · 0 评论 -
贪心算法
一、基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。原创 2012-02-14 10:07:04 · 565 阅读 · 0 评论 -
算法导论——第二章——堆排序
1.原地排序就是指不申请多余的空间来进行的排序,就是在原来的排序数据中比较和交换的排序。例如快速排序,堆排序等都是原地排序,合并排序,计数排序等不是原地排序。排序稳定就是指:如果两个数相同,对他们进行的排序结果为他们的相对顺序不变。2堆的定义: n个关键字序列Kl,K2,…,Kn称为堆,当且仅当该序列满足如下性质(简称为堆性质): (1)k原创 2011-11-21 20:51:34 · 835 阅读 · 0 评论 -
堆和栈的区别
一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(s原创 2011-12-05 18:36:09 · 713 阅读 · 0 评论 -
算法导论——第七章——基本数据结构
1.数据结构卫星数据:指的是一条纪录中除了关键字key以外的其他数据。因为一个纪录可能包含多个数据项,但是一般排序之类的算法只关心key,其他的项都是跟着key走,就像是卫星一样?!这些数据就称作卫星数据。动态集合上的操作:SEARCH(S,k),INSERT(S,x)DELECT(S,x),MINIMUM(S),MAXIMUM(S),SUCCESSOR(S,x),PREDECES原创 2011-12-05 18:37:12 · 4393 阅读 · 1 评论 -
算法导论——第六章——中位数和顺序统计学
1.最大最小数同时找到最大最小数最优算法:首先让所有的元素参与两两比较,这样总共比较了n/2次,最大数肯定在胜者组中,最小数肯定在败者组中;然后从容量为n/2的胜者组中找到最大的数,最少要比较n/2 - 1次;同理,从容量为n/2的败者组中找到最小的数,最少要比较n/2 - 1次。所以总共需要比较(3n/2) - 2 次。以上假设n为偶数。奇数同理。2.N个数中第k小的数按照类似快原创 2011-11-21 20:55:28 · 1020 阅读 · 0 评论 -
算法导论——第五章——线性时间排序
1.决策树模型比较排序的过程可以被抽象地视为决策树。一棵决策树是一棵满二叉树,表示某排序算法作用于给定输入所做的所有比较。排序算法的执行对应于遍历一条从树的根到叶节点的路径。每个内结点对应一个比较ai&aj,左子树决定着ai以后的比较,右子树决定着ai>aj以后的比较。当到达一个叶节点时,排序算法就已确定。排序算法能够正确工作的的必要条件是,n个元素的n!种排列都要作为决策树的一个叶节点出原创 2011-11-21 20:54:27 · 829 阅读 · 0 评论 -
平摊分析
总结:平摊分析是一种用来分析执行一系列类似操作的算法的工具,它对整个操作序列的真实代价限界。本章介绍了平摊分析的三种方法,分别是聚集分析、记账方法、势能方法。每种方法都通过分析栈操作和二进制计数器增1来举例分析。最后,本章用平摊分析的方法分析了表动态扩张和收缩的代价限界。 在平摊分析中,执行一系列数据结构操作所需要的时间是通过执行的所有操作求平均而得出的。平摊分析可以用来证明在一系列操作中转载 2012-02-20 10:06:41 · 837 阅读 · 0 评论 -
炮灰模型---------- 对女生选择追求者的数学模型的建立
假设一个女生愿意在一段时间中和一位男生开始一段感情,并且在这段时间中有N 个男生追求这位女生。说明:这里的N 不是事先确定的,每个女生根据自身条件,并结合以往的经历和经验,猜测确定这个数字N 。比如其它各方面都相同的两个女生,一般来说,PP 的女生就要比不PP 的女生N 值相对要大一些。在适合这个女生的意义上,假设追求者中任何两个男生都是可以比较的,而且没有相等的情况。这样我们对这N 个男生从转载 2012-03-31 10:53:31 · 1055 阅读 · 1 评论 -
24点游戏
24点游戏 数字游戏题解 by starfish [说明:此文改编自我写的一篇解题报告,原题是某年国家集训队组队赛题目] 问题描述 80年代全世界流行一种数字游戏,在中国我们把这种游戏称为“24点”。现在我们 把这个有趣的游戏推广一下:您作为游戏者将得到6个不同的自然数作为操作数, 以及另外一个自然数作为理想目标数,而您的任务是对这6个操作数进行转载 2012-03-15 09:57:52 · 871 阅读 · 0 评论 -
算法导论——第四章——快速排序
1.快速排序的基本思想 设当前待排序的无序区为R[p,r],利用分治法可将快速排序的基本思想描述为:①分解: 在R[p,r]中任选一个记录作为基准q,以此基准将当前无序区划分为左、右两个较小的子区间R[p,q-1)和R[q+1,r],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为q),右边的子区间中所有记录的关键字均大于等于q,而基准记录q则位于正确的位原创 2011-11-21 20:53:30 · 955 阅读 · 0 评论 -
红黑树代码
总结:这章介绍了红黑树的性质、旋转,并详细介绍了红黑树的插入和删除。 1. 红黑树的性质1) 每个节点或是红的,或是黑的2) 根节点是黑的3) 每个叶节点(NIL)是黑的4) 如果一个节点是红的,则它的两个儿子都是黑的5) 对每个节点,从该节点到其子孙节点的所有路径上包含相同数目的黑节点。 黑高度:从某个节点x出发到大一个叶节点的任意一条路径上,转载 2012-02-20 10:15:15 · 1318 阅读 · 0 评论 -
整数的质数分解
问题需求:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 需求分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: A、如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 B、如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。 C、如果n不能被k整除,则用k+1作为k原创 2012-05-02 15:49:09 · 1253 阅读 · 0 评论 -
位图排序——编程珠玑
位图排序是一种效率极高(复杂度可达O(n))并且很节省空间的一种排序方法,但是这种排序方法对输入的数据是有比较严格的要求(数据不能重复,大致知道数据的范围)。位图排序即利用位图或者位向量来表示集合。举个例子,假如有一个集合{3,5,7,8,2,1},我们可以用一个8位的二进制向量set[1-8]来表示该集合,如果数据存在,则将set相对应的二进制位置1,否则置0.根据给出的集合得到的set为{1,原创 2012-04-16 10:44:14 · 692 阅读 · 0 评论