
Algorithm算法
文章平均质量分 63
靖心
降低成功的时间复杂度,提高生活的空间复杂度
专注,努力不会白费的!
展开
-
算法 计算1-1/x+1/x*x-1/x*x*x……
计算1-1/x+1/x*x-1/x*x*x……算法完整C代码:#includevoid main(){ double x, sum = 1, sum1=1; int i, n; printf("Please enter x n:"); scanf("%lf%d", &x, &n); for(i=1;i { sum1=-sum1/x; sum+=原创 2013-10-01 13:02:36 · 2838 阅读 · 0 评论 -
数据结构C++算法实现2 - 归并排序1
研究了三本书的归并排序的写法,一:严蔚敏 数据结构;写得太过于复杂,是这本书中写的最垃圾的算法,我一共研究过四遍吧,算法用错中复杂的参数和递归,令人看得非常头大。建议大家不要学习这本书的这个算法。因为是考研书,所以不得不看。二:王红梅 算法设计与分析; 跟严蔚敏的书中算法差不多,不过该书漏了点东西,直接导致运算结果是错误的。所以不多说,这本书最多浏览一下其中的思想,不宜细看。因为是原创 2013-10-05 19:29:31 · 1575 阅读 · 0 评论 -
数据结构C++算法实现3 - 归并排序2
这次是按照 Introduction to Algorithm 的归并排序来写的C++实现算法,其中复用了前面用过的合并两个数组的算法。STL函数:for_each(vecI1.begin(), vecI1.end(), Print());这次用了for_each这个STL中的标准函数,代替了前面自己写的for_all函数,用法也很简单,前面两个参数是数组的范围,第三个参数可以是函数也可以原创 2013-10-06 10:36:06 · 1241 阅读 · 0 评论 -
d-ary heaps 多叉树堆排序C++实现
之前实现了堆排序,那是构造二叉树来实现堆排序的,但是其实二叉树还可以用大于等于二叉树来实现的,就是例如3叉树每个节点有三个孩子,4叉树,每个节点有四个孩子,等等。这个是算法导论的一道Problem,其实该注意的地方和堆排序是一样的,所以有了二叉树堆排序的基础之后就很好实现多叉树了。下面是C++程序:#include#includeusing namespace std;int原创 2013-10-24 13:01:45 · 3245 阅读 · 0 评论 -
算法导论Problem6-3 Youngtableau问题 堆排序应用
这道题大概就是要实现一个数组,这个数组中行所有元素都有序,列所有元素都有序。其实这也是应用堆排序的思想,就是把这个数组的看做是二叉树组成的。一个元素的下面一行的对应一个元素是它的左孩子,右边一个元素是它的右孩子。这样就可以应用堆排序来解决这个问题了。同时也是像堆排序一样,实际使用一维数组存储数据,人为规定(按照堆排序的规则,这个是关键思维)地构造二维数组来存储二叉树。详细程序如下:原创 2013-10-25 14:17:51 · 1366 阅读 · 0 评论 -
最大字段和问题 难点分析和C++实现9
给定n个数组成的序列,求其中最大子段和,并规定其中如果所有数均为负值的时候,那么最大字段和为零。解决这样的问题需要用的算法是:分治法基本思路:1. 划分两个长度基本相同的子段,得出以下三种情况2. 如果最大和出现在左边,就左边最大子段和为解3. 如果最大和出现在右边,就右边最大子段和为解4. 如果是最大和在左子段的最右边的数组成,和右子段的最左边的数组成,那么就合并这两个子原创 2013-10-21 13:10:59 · 1686 阅读 · 0 评论 -
棋盘覆盖问题 C++实现11
本算法,简单概述就是利用L型的骨牌,填充2^k*2^k的方形棋盘。其中棋盘用2维数组表示,这里用vector<vector<int> > board表示。我发现关于本算法,百度百科的说明和《算法设计与分析》这本书是一样的,错的地方还是一样的错。到底出处是哪里?是谁抄谁的还是都是抄别人的,那就不得而知了。本博客不会这样照搬复述的,本博客的文章都是自己的理解总结出来,和自己思考所得的结论,最多包含某些书本的精要概括,绝对原创,要引用本博客内容的朋友请注明出处。这里就指出重点和难点加以分析。并改正其原创 2013-10-22 12:27:12 · 3014 阅读 · 0 评论 -
生产者消费者模式C++程序模拟实现
这里是利用C++简单模拟一个生产者消费者的工作模式。没有考虑到同步问题。操作了一个队列,用BUFFER_SIZE控制了队列的大小,也根据需要可以不用控制大小。感觉数据结构无处不在。使用单一设计模式实现缓冲区。原创 2013-11-16 09:55:20 · 6517 阅读 · 0 评论 -
算法数据结构C++实现8 堆排序 难点分析
算法导论第六章开始就开始介绍堆排序了。这是个非常难理解的排序算法,主要需要经过三个步骤:1 大顶堆化; 2 利用大顶堆化函数简历大顶堆; 3 最后徐在利用前面两个函数进行排序这个算法有几个理解难点需要克服的:1. 计算堆中的孩子节点要仔细,因为堆排序用的是一位数组表示二维二叉树的概念的,这都是人为地把数值中的元素和二叉树的一个节点一个节点地第一对应起来的,所以要程序员自己计算好这些对应原创 2013-10-20 15:27:58 · 1642 阅读 · 0 评论 -
算法数据结构C++实现7 - 同时查找最大值和最小值优化算法
算法导论第九章开始的算法 同时查找最大值和最小值的算法。本算法并不是直接拿数组中的元素来和最大值和最小值比较的,而是先比较数组中两个数组,然后那其中小的和最小值对比,其中大的和最大值对比,那么算法就可以由原来需要对比2n次,降到只需要对比3n/2次了。对于一个无序查找最小值的算法一般都如下:templateT minimum(vector& vt){ T min = vt[0];原创 2013-10-19 10:43:51 · 4428 阅读 · 3 评论 -
算法数据结构C++实现6 - 行排序 列排序 Column sort
Introduction to Algorithm 算法导论第八章的Column sort是非常有趣的,相当复杂。要用C++是实现起来是很困难的,因为需要用到几大块的小算法,才能实现。第一是行间排序,第二是行列变换,第三是前后移动元素,这些算法都组合起来,整个过程就变得很复杂了。这次我是用二维数组来实现的,也可以用vector实现同样的效果,感觉能用vector还是用vector吧。而原创 2013-10-18 16:43:42 · 2103 阅读 · 0 评论 -
算法数据结构C++ - Bucket Sort 吊桶排序
吊桶排序的排序速度很快,平均是O(n),能达到这么快的速度其中一个原因是它假设了输入值为范围是[0, 1)的小数。Introduction to Algorithm这本书里面章8.4的算法,首先把原数组按照一定规律对照到每个吊桶(Bucket)里面,然后对每个Bucket排序,最后把这些Bucket串起来,就成为一个有序序列了。下面是C++完整代码:#include#include原创 2013-10-16 15:29:13 · 2424 阅读 · 0 评论 -
数据结构C++算法实现1 - 合并两序列
本人开辟一个专栏,把严蔚敏 数据结构 这本书上的算法和数据结构用C++实现,网上和她书本光盘也带了C的实现方法,但是其实对于初学者来说真不是那么好自己运行看结构,和自己去修改“玩”的。本人觉得写程序的能力应该是“玩”出来的,不然会觉得学计算机编程很枯燥的。所以这里都是给出了完整的C++数据结构或算法程序。而在C++里面和C其实没有根本的区别,但是我们可以很好的利用C++的一些容器,就可原创 2013-10-02 14:33:35 · 2515 阅读 · 0 评论 -
LeetCode 问题难度,面试出现频率及问题相关数据结构和算法
转载google文档。统计了各个问题的难度,频率,数据结构和算法LeetCode Question Difficulty Distribution IDQuestionDiffFreqData Structur转载 2013-11-03 21:24:42 · 5043 阅读 · 0 评论 -
LeetCode Longest Substring Without Repeating Characters 最长不重复子串查找
这道题目也是下标难以处理,关键点:1 利用maxlength变量记录当前已经查找到的最长不重复子串2 巧妙的移动两个下标,如下图示:原创 2013-11-20 10:16:43 · 2544 阅读 · 0 评论 -
如何不使用任何额外空间实现两数相互交换
但是如何实现这个函数,不使用t呢?有两种方法,第一种方法,利用减法实现:这很好理解,难理解的是第二种方法,利用异或运算^位操作实现:理解起来还是有点难度。那是利用了异或运算的特征,就是:任何数与1异或都相当于取反操作,例如1^1=0; 0^1=1任何数与0异或都相当于保留操作:1^0 = 1; 0^0 = 0;理解方法:由特殊推导一般,就是假设两个数都是一位二进制数,那么就算他们是多位二进制数的情况也是一样的。假如b为1,就是对a做取反操作a = a^b;就是对a取反了原创 2013-11-19 20:19:22 · 2948 阅读 · 0 评论 -
LeetCode Add Two Numbers两个链表数值相加
Add Two NumbersYou are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. 相当于无限加了,就是用了链表来存储数据。本题就是考对链表的操作和模拟加法。第一种方法:这个跟合并两个有序链表成一个有序链表的程序结构是一样的。原创 2013-11-20 14:01:47 · 2156 阅读 · 0 评论 -
如何计算阶乘运算结果尾部有多少个零
Write an algorithm which computes the number of trailing zeros in n factorial.阶乘n! = n*(n-1)*...*1要计算出这样的运算结果有多少个零,如果直接运算就很可能是溢出,那么只能用其他方法了。因为尾零得来是由于2*5等于10,那么就会为结果增加一个零,所以只要计算这两个数出现了多少对就可以了。但是由于2出现的次数会远远大于5,所以,只要计算5的倍数出现多少次。程序本身很好理解,就是如何想出来的确是个麻烦原创 2013-11-20 19:12:35 · 3355 阅读 · 0 评论 -
最少钱币数
很久之前在网上参考了下,写了个程序,现在重新看下,觉得写得真的不好,献丑了。正确的解法应该是使用动态规划法,请参看我另外一篇博客: http://blog.youkuaiyun.com/kenden23/article/details/16864987这里使用贪心法,贪心法得出的只能是近似最优解,也可能有解也没有找到,所以使用贪心法要非常小心,注意贪心法成立的条件,比如赫尔曼树就是可以的。我也没有到网上做这道题的Online judge,所以也许这里不一定能通过online judge,但是这里的贪心法使用应该原创 2013-09-22 21:07:59 · 7256 阅读 · 4 评论 -
求两字符串最长公共子序列
方法:1 建立(row+1)*(col+1)的二维表,2. 初始化其首行首列为零3. 以m串为行,n串为列,那么可以逐行填写。第一行代表n串的第一个字符和m串比较, 第二行代表n串的第一和第二个字符都和m串比较,以此类推。4. 如果是相同字符,那么就把[m-1][n-1]+1和[m-1[n]和[m][n-1]比较,填入大数。5. 如此反复填完表,就可以得到最终结果[m][n]很难一下子说清楚,这里就弥补一下一般书上都没有的C++程序吧:原创 2013-11-08 14:16:30 · 1425 阅读 · 0 评论 -
LeetCode Path Sum II路径和II
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.For example:Given the below binary tree and sum = 22, 5 / \原创 2013-11-07 19:22:50 · 1721 阅读 · 0 评论 -
在O(n)时间复杂度内查找前三名算法
查找前三个最大或者前三个最小的数,相当于查找冠亚季前三名的算法了,应该如何做呢?当然可以用堆做,时间效率很高,下面是个简易的方法。查找前三个最大数算法:1) 初始化三个数为INT_MIN2) 循环 a) 如果当前元素大于第一名,更新第一名,且第三名=第二名; 第二名=第一名; b) 如果当前元素大于第二名,而且不等于第一名,那么更新第二名,而第三名=第二名;原创 2013-11-22 10:01:21 · 1938 阅读 · 0 评论 -
如何不使用比较和判断查找最大值
给定a和b两个整数如何不使用比较和判断操作来实现输出其最大值?这里可以学习几个有趣的函数:1 获取一个数的正或负符号2 反转一个符号这里是通过符号的判断来巧妙地实现的。基本思路:符号位正,用1表示,符号是负用0表示。有四种情况:1 a b同号, a正,b负,那么最大值肯定是a,只要a乘以自己的符号1,b乘以自己的符号0,得出的就是最大值2 a b同号, 也一样道原创 2013-11-22 17:12:30 · 1538 阅读 · 0 评论 -
雷神之锤 - 神一般存在的Sqrt函数
转载:http://www.cnblogs.com/pkuoliver/archive/2010/10/06/1844725.html我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢?虽然有可能你平时没有想过这个问题,不过正所谓是“临阵磨枪,不转载 2013-11-08 20:58:59 · 8853 阅读 · 5 评论 -
面试题 猜颜色球游戏
游戏规则:有四个插口, 可以放有四个球,颜色分别为红色(R),黄色(Y),绿色(G), 和蓝色(B),放的颜色顺序位置都可以是随机的,如:RYGB,YGRB等都是合法放置。注意:插口有RGBY,猜GGRR只能是一个hit和一个pseudo hit。原书的程序应该是有点错误的,按他的程序这个解答就是1个hit和3个pseudo hit了。先吃透他的规则,注意特殊情况,然后就好做了。书中提到的注意地方:1 代码清晰,比如定义一个结构体返回结果2 定义额外函数原创 2013-11-24 10:40:09 · 6024 阅读 · 0 评论 -
算法导论 - QuickSort 快速排序 C++实现
算法导论的快速排序还和一般书上的快速排序是有点不一样的。当然书习题也给出了一般快速排序的方法,其分区函数学名叫Hoare partition。书本介绍的排序可以用图看的很清晰:然后配合C++程序,就不需要废话就能明白了:他的quick sort程序也很明了,值得注意到的地方就是,mid是已经到了最终排序位置的了,所以,不需要递归考虑这个位置了。原创 2013-11-09 10:32:47 · 25838 阅读 · 3 评论 -
Randomized Algorithm 随机算法 和 随机快速排序例子
随机算法随机算法听起来是很高级的内容了,但是,其实随机算法是很简单的内容,很好理解的。 随机算法对于一个问题也许不是准确的解法,而且对于同一个输入,也许每次运行也会产生不同的结果。随机算法可以在运行的时候,利用一个数据流,在其中做随机选择。 相对比一般的算法(e.g.deterministic algorithm),主要有两个优点:1 运行时间和空间都比一般的我们现在知原创 2013-11-09 12:44:10 · 5474 阅读 · 0 评论 -
强大的随机算法-简洁的O(n)时间复杂度解决查找第k大数问题优化算法
之前用了个分治法, 但是由于过于复杂,估计很多人都不想使用。下面我用随机法来解决这个问题吧,随机法更加优化了,而且更加重要的是更加简单了。我刚看到这个算法也是震惊了,只有分治法的不到三分之二的长度。细读一下你会发现真的是很好很强大!下面看完整程序是如何的:原创 2013-11-09 18:35:57 · 5186 阅读 · 0 评论 -
Floyd All Shortest Path 所有最短路径的查找 C++程序
Floyd All Shortest Path 所有最短路径的查找在严慧敏这本书也有介绍,但是这本书是讲数据结构的,没有介绍这个算法是什么算法,其实这个算法是动态规划法。 思路:1 用一个矩阵来记录从i到j的最短路径2 用三层循环,选好一个点k,然后把所有其他点组成两对i和j;测试从i到j是直接走近,还是从i经过k最后到j比较近一点。如果绕道k之后花费更小一点,那么就更新[i][j]的数据。3 循环完毕就记录了所有两点之间的最短距离了。看下面的实现程序,用了两个循环,第一循环是赋值给记录最原创 2013-11-10 08:50:18 · 2147 阅读 · 0 评论 -
Counting Sort 计数排序算法在学生管理系统排序的应用例子
这个算法主要用在关键数字(key number)小的时候,按照关键数字排序的效率是非常高的。比如我们有6个教室的学生需要按教室号排序,如下是学生的信息数据结构:需要的空间就是关键数字的最大值的空间,比如关键字最大是6,那么就需要6+1个空间。如果是从后面开始填表,那么就只需要6个空间。思路:主要需要三个步骤:1 新建一个关键数字大小+1的vector vi,并以关键字出现的次数为vi的下标,计算其出现的总次数2 把前面教室号出现的总次数加起来就是本教室号开始填表的位置3 根据教室号开始填表,原创 2013-11-10 10:45:27 · 1555 阅读 · 0 评论 -
如何用O(n)时间复杂度查找第k大数的优化算法 C++程序
本能的想法就是先排序,然后选出需要的数,平均时间复杂度是O(nlgn).但是其实这个算法可以在O(n)平均时间复杂度内选择出来的。基本思路:在一个递归算法里面,每一次递归分区,我们丢弃一部分元素,然后再剩下的部分递归。这样问题的大小就呈几何级别减少了。写本算法程序的问题总结:1. 下标问题要搞清楚,这些类型的下标处理一定要把low和up的下标和C\C++的下标对应起来,就是说low和up都一定需要存储数据。2. 没完全搞清楚问题的时候,不要动手编程,不要期望程序会magically wo原创 2013-11-09 16:03:54 · 6111 阅读 · 0 评论 -
八皇后C++完整程序
八皇后问题一直都给人感觉是非常神秘的东西,最近研究算法,编程技术暴增,搞定八个皇后自然是小菜一碟了。O(∩_∩)O~今天用了回溯法实现一下这个程序。本算法16皇后还是很轻松的,但是到了20个皇后之后就开始很吃力了,运行时间过长,如果是32个皇后的话,直接算不出来,呵呵,大家认为自己电脑牛逼的话可以试一试,不过应该都不可以。能用回溯法算出64皇后的电脑也许要等到量子计算机出现才可以了。解决问题的关键就是主函数的循环写法:1 用一维数组代表棋盘,列数代表放置皇后的棋盘行,其值代表填在该行第几列原创 2013-11-09 07:31:52 · 14557 阅读 · 7 评论 -
堆排序的应用 Priority queues 优先级排序
堆排序很多时候的实际应用并不如快速排序(quick sort)那么快,但是也有很多实际的应用,例如优先级排序就是其中之一。优先级排序可以应用到系统的调度算法中,人工智能中也经常要用到,熟悉这个算法很有好处。下面给出利用堆操作构建优先级排序的基本算法:#include#include#include"heapSort.h"//包含了堆排序的操作,可以参照我博客的堆排序using原创 2013-10-23 11:05:01 · 1732 阅读 · 0 评论 -
LeetCode Container With Most Water 查找容水量最大的容器 动态规划法思想分析
其实这个是动态规划法做的,因为我没看到有人分析其中的动态规划法思想,所以在这里分析一下。下面分析是怎么样的动态规划法思想。1 分区,首先分最大区间,左边高度为height[0],右边高度为height[n-1], 分一个区间,那么这个区间的解肯定是height[0]和height[n-1]围成的区间2 区间细分,分两个区间height[0]和height[n-2],还有height[1]和height[n]也构成一个区间,这个区间的最大木桶容水量和前面比较,这个值也可以用表保存下来,但是因为我们原创 2013-11-24 14:33:27 · 2968 阅读 · 0 评论 -
判断平面和AABB包围体是否发生碰撞
AABB通常是由最小值和最大值组成的,这里就用const Vector3 &bbMin和const Vector3 &bbMax表示一个AABB包围体。这里通过判断平面的法向量的方向,确定离平面最近的点为最小点min,离平面最远的为max。通过判断三个情况:1 最小点min在平面正面,那么肯定为不相交了。2 最小点min在平面负面,最大点max在正面,那么就相交了。3 如果最大点在平面负面,那么就不相交。同时也带了Shpere(圆形)包围体和平面相交的函数,那更容易。原创 2013-11-25 07:36:31 · 3215 阅读 · 4 评论 -
背包问题C++程序
背包问题也是个很古老的问题了:给一个一定容量的背包,有一定数量的物品,物品有重量和价值,如何装如这些物品,才使得装进背包里面的价值最高。打劫珠宝店用得上的知识啊,呵呵。匪徒如何装走最大价值的东西呢?设背包的容量是capacity, 用一个数据结构代表一个物品的重量和价值如下:然后用 vector<Jewel> &twoiv 代表现有的珠宝。vector<int> &vfill是记录什么东西是装了的。如下图填表,要诀就是:逐行填入,有上到下,第一行和第一列都是0,因为没有东西装进;第二行是又左到右填原创 2013-11-10 18:20:49 · 2796 阅读 · 0 评论 -
算法导论第12章-搜索二叉树伪代码的C++程序全实现
搜索二叉树的特性:左子树比根小,右子树比根大。如下图:算法导论这本书的伪代码其实非常清晰,这是她比很多其他书更优秀的特点。但是实实在在的测试程序更有利于学习。插入只会在叶子节点发生,如插入值13的图:下面是本章节中所有伪代码的C++程序,包括测试程序:原创 2013-11-11 15:50:26 · 2844 阅读 · 0 评论 -
面试题:找出数列中间未排序好的子数列
书中给出的思路:1 先左边往右搜索,找到第一个递减的下标,然后右边王左搜索,找到第一个递增的下标2 两个下标把数列分为三部分,然后找到中间子数列最小和最大值3 然后找到左边数列第一个小于最小值的下标,找到右边第一个大于最大值的下标。我思考了很久,终于下结论,这个思路是错误的,这么经典的书,怎么会犯那样的错误呢? 到了官网查找errata,并未提及,报告之,等等有什么反应。这个思路如果查找数列如{2,7,9,5,5,3,8,10};那答案是1和5,明显是错误的。我的解题思路是:1原创 2013-11-25 15:45:47 · 1415 阅读 · 0 评论 -
Bf法查找子字符串
BF法就是brute force暴力法,就是在主串里面一个一个字符向后移去查找是否存在需要查找的子字符串。第一种方法查找所有出现的字符串在主字符串里的下标:vector bfSearch(string &text, string &substr){ vector begIndex; int n = text.size(); int m = substr.size(); //注意原创 2013-11-13 12:45:41 · 2312 阅读 · 0 评论 -
LeetCode Integer to Roman数字转成罗马数字
Given an integer, convert it to a roman numeral.Input is guaranteed to be within the range from 1 to 3999. 把数字转换成为罗马数字,一般我们都不太熟悉罗马数字,所以只能Wiki一下了:http://en.wikipedia.org/wiki/Roman_numerals 程原创 2013-11-28 07:56:28 · 2038 阅读 · 0 评论