
算法之美
ACE1985
这个作者很懒,什么都没留下…
展开
-
Tree Recovery---POJ--2255
Tree RecoveryTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 3771 Accepted: 2526DescriptionLittle Valentine liked playing with binary tree原创 2010-05-17 08:42:00 · 1355 阅读 · 0 评论 -
Brackets Sequence--poj--1141
Brackets SequenceTime Limit: 1000MSMemory Limit: 65536KTotal Submissions: 11854Accepted: 3164Special JudgeDescriptionLet us define a regular原创 2010-05-30 10:17:00 · 1504 阅读 · 0 评论 -
《算法之美》の链表问题の两链表相交问题
编程判断两个链表是否相交问题:给出两个单向链表的头指针,比如head1和head2,判断这两个链表是否相交。这里给出简化问题,假设两个链表均不带环。解答:首先了解一下这个问题的工程实践,例如在一个大的系统中,如果出现两个链表相交的情况,一旦程序释放了其中的一个链表的所有节点,那样就会造成第二个链表信息的丢失。因此,我们需要在释放一个链表之前知道是否有其他链表与当前链表相交。直观的想法:判断第一个链表的每一个节点是否在第二个链表中,这需要O(Length(head1)*Length(head2))的时间复杂度原创 2010-08-07 21:29:00 · 1795 阅读 · 1 评论 -
《算法之美》の链表问题の从尾到头输出链表
<br /><br />题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:<br />struct ListNode<br />{<br /> int m_nKey;<br /> ListNode* m_pNext;<br />};<br />分析:这是一道很有意思的面试题。该题以及它的变体经常出现在各大公司的面试、笔试题中。<br />看到这道题后,第一反应是从头到尾输出比较简单。于是很自然地想到把链表中链接结点的指针反转过来,改变链原创 2010-08-05 20:41:00 · 1735 阅读 · 0 评论 -
《算法之美》の链表问题の从链表中删除节点
问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};解答:假设给定的指针为pCurrent,ListNode* pNext = pCurrent->m_pNext;由题意知,pCurrent指向链表的某一个中间节点,因此pCurrent->m_pNext != NULL。原创 2010-08-06 14:48:00 · 4052 阅读 · 0 评论 -
《算法之美》の链表问题の单向链表的反转
<br />题目:输入一个链表的头节点,反转这个链表,并返回反转后链表的头节点,链表定义如下:<br />struct ListNode<br />{<br /> int m_nKey;<br /> ListNode* m_pNext;<br />};<br />解答:<br />算法一:我们需要额外的两个变量来存储当前节点pCurrent的上一个节点pPrev和下一个节点pNext。假设经过若干次操作,我们将当前节点pCurrent之前的指针都反转完成,这些节点原创 2010-08-10 21:55:00 · 2015 阅读 · 0 评论 -
《算法之美》のn个数连接得到最小的多位整数
<br />题目:设有n个正整数,将它们连接成一排,组成一个最小的多位整数?<br />例如:n=2时,2个整数32,321连接成的最小整数是:32132;<br /> n=4时,4个整数55,31,312,33连接成的最小整数为:312313355。<br /> <br />解答:由于题目涉及到整数的连接,如果直接进行整数的连接,可能会超出整数的表示范围,因此我们将之转换为字符串之间的连接更简单些,同时自定义字符串的比较规则:如果字符串A+B > B+A,那么A>B。同时可以证明A+B>=原创 2010-08-24 16:44:00 · 1817 阅读 · 0 评论 -
《算法之美》の递归与分治策略の全排列问题
全排列问题:设R={r1, r2, …, r3}是要进行排列的n个元素,Ri = R –{ri}。集合X中元素的全排列记为Perm(X)。(ri)Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri,得到的排列。因此,R的全排列可以归纳定义如下:1)当n=1时,Perm(R) = (r),其中r是集合R中唯一的元素;2)当n>1时,Perm(R)由:(r1)Perm(R1),(r2)Perm(R2),…,(rn)Perm(Rn)构成。我们据此设计递归算法如下:#include/*** 功能描述原创 2010-08-25 22:59:00 · 2009 阅读 · 1 评论 -
《算法之美》の字符串相关问题の壹
题目:编写一个单词逆序输出的算法,例如输入“SEE YOU IN ANOTHER LIFE”,要求输出“LIFE ANOTHER IN YOU SEE”。解答:#includevoid ReverseWord(constchar* src, char* dest){ assert(src != NULL && dest != NULL); constchar* head = src; //记住头指针 while(*src++); int count = 0;原创 2010-09-30 15:33:00 · 2030 阅读 · 0 评论 -
音乐随机播放算法
常见的音乐随机播放算法主要有两种:一是Shuffle算法;二是Random算法。一 Shuffle算法Shuffle算法和排序算法正好相反,是从有序到乱序的一个过程,俗称洗牌算法。它将播放列表中的歌曲顺序打乱,变成一个和原来歌曲顺序没有任何关系的乱序的播放列表,之后进行歌曲的播放,并支持当用户点击“上一首”时,能够回到刚刚播放的那一首歌曲。二 Random算法Random算法是原创 2012-05-19 13:31:20 · 10083 阅读 · 2 评论 -
《算法之美》---插入排序
不断地从无序部分抽取一个元素,并将其插入到有序部分合适位置上的排序方法称为插入排序。插入排序的特点是将待排序的元素一个个插入到已经排好序的数列中,这涉及到插入位置的确定。显然,要确定一个元素的位置,就需要将待排序的元素与已排序部分的元素进行比较,最简单的方法就是一个一个元素地进行:/*函数名: InsertionSort功能: 插入排序模板参数说明:原创 2010-07-14 15:46:00 · 1292 阅读 · 0 评论 -
《算法之美》---快速排序(随机快速排序)
快速排序是对冒泡排序的一种改进,它使用分治的思想,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录循环进行排序,以达到整个序列有序的状态。 快速排序是C.A.R Hoare在1962年提出的,显然,它是一种分治算法,并且是原地排序算法。快速排序可分为四个步骤:1)选择杠杆点:在待排序的序列中按照某种方式选取一个元素作为划原创 2010-07-22 17:16:00 · 1884 阅读 · 0 评论 -
《算法之美》---归并排序
将一个大序列的排序问题分解为对两个或多个子序列的排序问题,然后对子序列递归使用同样的方式进行排序;在子序列排好序后,将结果合并起来即可。利用这种思想的排序方法就是著名的归并排序。之所以称为归并排序,是因为整个算法的成本由归并部分决定。 归并算法描述如下:1)如果n=1,排序完成;2)将序列分解为两个子序列A[1… ceiling(n/2)]和A[ceiling(n/2)+1原创 2010-07-15 20:48:00 · 1351 阅读 · 0 评论 -
桶排序及其应用
桶排序(Bucket Sort)有时也称为盒子排序(Bin Sort),来源于邮局使用的盒子信件分发方法。桶排序的有效性需假定输入数据是由一个完全随机过程产生,即要求桶排序的输入数据呈均匀分布,例如,输入数据随机均匀分布在区间[0, 1)。桶排序思想如下:1)把区间[0, 1)分解为n个大小相等的桶;2)将n个输入数据按照其取值不同分配到n个桶里面;3)对每个桶里面的数原创 2010-05-24 16:26:00 · 5435 阅读 · 0 评论 -
《算法之美》の链表问题の获得链表中倒数第m个元素
问题:给定一个单向链表,设计一个时间优化并且空间优化的算法,找出该链表的倒数第m个元素。实现您的算法,注意处理相关的出错情况。m定义为当m=0时,返回链表最后一个元素。 解答:这是一个难题,因为单向链表只能正向遍历,这个问题需要根据元素与链表尾的相对位置来找出该元素,但是当发现链表尾时,没有简单的办法回溯到倒数第m个元素。 我们需要的是倒数第m个元素原创 2010-05-23 17:00:00 · 2558 阅读 · 2 评论 -
Parliament--POJ--1032
ParliamentTime Limit: 1000MSMemory Limit: 10000KTotal Submissions: 10936Accepted: 4570DescriptionNew convocation of The Fool Lands Parliament consi原创 2010-05-29 13:20:00 · 2244 阅读 · 0 评论 -
线段树
树结构的基本思想是分割。普通二叉搜索树是按对象来进行划分,效果往往和数据结构内对象有关;而线段树是根据关键码的可能范围来分的,这种技术叫做关键空间分解! 线段树的处理对象是线段(一般意义上的区间可以抽象成线段),它把线段组织成利于检索和统计的形式,本质上是线段的二叉搜索树!当然,线段树特殊点在与其中的线段可以分解和合并,另外,线段树操作的是整个区间,它的渐进时间效率不依赖于数据结构中的对象原创 2010-05-26 08:20:00 · 2591 阅读 · 2 评论 -
《算法之美》---堆排序
<br />堆可分为大根堆和小根堆;对小根堆来说,若在输出堆顶的最小值后,使得剩余的n-1个元素的序列重又建成一个小根堆,则得到n个元素中的次小值。如此反复执行,便能得到一个有序序列,这个过程称为堆排序。堆排序只需要一个用来记录大小的辅助空间,每个待排序的记录仅占用一个存储空间。<br /> <br />从一个无序序列建立堆的过程就是一个反复“筛选”的过程,若将此序列看成是一个完全二叉树,则最后一个非终端节点是第(n-1)/2+1个元素,由此“筛选”只需从第(n-1)/2+1个元素开始。<br /> <br原创 2010-07-22 16:01:00 · 1763 阅读 · 0 评论 -
Ancient Cipher--POJ2159
Ancient CipherTime Limit: 1000MSMemory Limit: 65536KTotal Submissions: 13258Accepted: 4719DescriptionAncient Roman empire had a strong government sy原创 2010-05-18 08:31:00 · 1703 阅读 · 0 评论 -
滑雪--POJ--1088
滑雪Time Limit: 1000MSMemory Limit: 65536KTotal Submissions: 36967Accepted: 13013DescriptionMichael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,原创 2010-05-19 22:05:00 · 1755 阅读 · 0 评论 -
Complicated Expressions--POJ--1400
Complicated ExpressionsTime Limit: 1000MSMemory Limit: 10000KTotal Submissions: 887Accepted: 314DescriptionThe most important activity of ACM is the原创 2010-05-19 22:19:00 · 1636 阅读 · 0 评论 -
The Triangle--poj--1163
The TriangleTime Limit: 1000MSMemory Limit: 10000KTotal Submissions: 19122Accepted: 11144Description73 88 1 02 7 4 44 5 2 6 5(Fi原创 2010-05-20 10:41:00 · 1292 阅读 · 0 评论 -
Color Me Less--poj--1046
Color Me LessTime Limit: 1000MSMemory Limit: 10000KTotal Submissions: 18730Accepted: 8886DescriptionA color reduction is a mapping from a set of dis原创 2010-05-20 19:31:00 · 1572 阅读 · 0 评论 -
Common Subsequence--poj--1458
Common SubsequenceTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 17815 Accepted: 6847DescriptionA subsequence of a given sequence is the原创 2010-05-20 15:01:00 · 2002 阅读 · 0 评论 -
《算法之美》の链表问题のremoveHead中的缺陷
问题:发现并修复下面C/C++函数中的缺陷,该函数是想从一个单向链表中删除头元素。void removeHead(Node *head){ delete head; head = head->next;} 解答:缺陷发现策略:对于拿到的任何函数,考虑下面4个常见的问题:1)检查数据是否正确地进入了该函数;2)检查函数的每一行是原创 2010-05-23 16:53:00 · 1758 阅读 · 0 评论 -
《算法之美》---进程互斥软件算法(Lamport面包店算法和Eisenberg算法)
实现进程互斥的软件的结构框架是:Framework Repeat entry section critical section exit section remainder section Until false进程互斥的软件实现算法有:Lamport面包店算法和Eisenberg算法。这两种算法均假定系统中进程的个数有限,如n个。1原创 2010-07-14 21:39:00 · 7939 阅读 · 2 评论 -
《算法之美》---二叉搜索树
<br />二叉排序树又叫二叉搜索树、二元查找树,它或者是一棵空树;或者是具有下列性质的二叉树:<br />1)每个节点有一个关键值,并且没有任意两个元素有相同的关键值;因此,所有关键值都是唯一的;<br />2)若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;<br />3)若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;<br />4 )它的左右子树也分别是二叉排序树。<br />二叉排序树是一种动态树表,其特点是:树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关原创 2010-07-17 11:19:00 · 1861 阅读 · 0 评论 -
《算法之美》の链表问题の记住头元素+删除元素
记住头元素:单向链表的头元素必须至始至终要记住,否则链表将会在内存中丢失。这意味着在链表第一个元素之前插入新元素或删除链表第一个元素时,指向链表头的指针或引用必须更新。在C/C++中,很容易因误用指针而犯错误,如下面代码,它在链表的前面插入一个元素:bool insertInFront(IntElement *head, int data){ IntElemen原创 2010-05-23 16:48:00 · 1571 阅读 · 2 评论 -
《算法之美》---二叉堆及其实现
<br />二叉堆是一棵满足下列性质的完全二叉树:<br />1)如果某节点有孩子,则根节点的值都小于孩子节点的值。我们称之为小根堆;<br />2)如果某节点有孩子,则根节点的值都大于孩子节点的值。我们称之为大根堆。<br />这样,如果我们用一维数组a存储来存储该堆,那么具有n个节点的堆可看成是一棵按层次排列,同一层按自左向右排列的完全二叉树。显然,小根堆的根节点是最小值,大根堆的根节点是最大值,计算过程分下面两步进行:<br />(1)—建堆,把数组a中各个元素转变成堆;<br />(2)—对数组a进原创 2010-07-17 17:07:00 · 2504 阅读 · 3 评论 -
《算法之美》の链表问题の判断链表循环与否
问题:一个链表要么以NULL结尾(非循环的),要么以循环结尾(循环的),请编写一个函数,接受链表的头指针作为参数,确定该链表是循环的还是非循环的。如果链表是循环的,函数返回true,如果是非循环的,函数返回false。注意,不能以任何方式修改链表。 解答:这两种链表的区别在与它们的末尾。在非循环链表中,末尾节点是以NULL结束的,因此只要遍历链表,直到找到一个以NULL结尾的节点就原创 2010-05-23 11:40:00 · 1818 阅读 · 0 评论 -
《动态规划》之--字符串比较问题(扩展距离)
问题:对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和。2个非空格字符的距离是它们的ASCII码之差的绝对值;空格与空格的距离为0,空格与其他字符的距离为一个定值k。在一般情况下,字符串A和B的长度不一定相同。字符串A的扩展是在A中插入若干空格字符所产生的字符串。在字符串A和B的所有长度相同的扩展中,有一对距离最短的扩展,该距离称为字符串A和B的扩展距离。对于给定的字符串A和B原创 2010-05-23 22:56:00 · 11407 阅读 · 3 评论 -
线段树的代码模板
线段树的应用:1)求面积:一.坐标离散化;二.垂直边按x坐标排序;三.从左往右用线段树处理垂直边,累计每个离散x区间长度和线段树长度的乘积。2)求周长:一.坐标离散化;二.垂直边按x坐标排序,第二关键字为入边优于出边;三.从左往右用线段树处理垂直边,在每个离散点上先加入所有入边,累计线段树长度变化值,再删除所有出边,累计线段树长度变化值;四.水平边按y坐标排序,原创 2010-05-27 14:43:00 · 3522 阅读 · 0 评论 -
《算法之美》---次序选择问题
当一个序列排好序之后,我们一般会对其有两种操作:一是对其进行查找操作;一是得知任何特定元素在一个序列中的次序。当如果我们仅仅想知道某一个或某几个元素在序列里的次序,或者处于某个特定位置上的元素,则并不一定需要对整个序列进行排序。在一个序列里面挑选处于特定位置的元素的问题就是所谓次序选择问题。一般定义如下:在n个元素里面选择出第i小(或大)的元素,即找出排名为i的元素。快速次序选择算法是比直原创 2010-07-22 21:25:00 · 2732 阅读 · 0 评论