算法
文章平均质量分 51
长弓的坚持
这个作者很懒,什么都没留下…
展开
-
C++实现质因数分解
质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为素数(质数);否则称为合数。根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。最小的质数是2。原创 2014-11-04 20:24:39 · 56043 阅读 · 4 评论 -
算法导论中求解时间复杂度的三种方法
这一章讲的是递归式(recurrence),递归式是一组等式或不等式,它所描述的函数是用在更小的输入下该函数的值来定义的。本章讲了三种方法来解递归式,分别是代换法,递归树方法,主方法。1.代换法(Substitution method)(P38~P40)定义:即在归纳假设时,用所猜测的值去代替函数的解。用途:确定一个递归式的上界或下界。缺点:只能用于解的形式转载 2014-10-14 10:34:25 · 8303 阅读 · 0 评论 -
C++求数组中的逆序对
#includeusing namespace std;//归并排序统计逆序对int merge(int num[],int start,int middle,int end,int*temp){int k=0,i=start,j=middle+1,count=0;for(;i{if(num[i]>num[j]){temp[k++]=num[i++];//按原创 2014-10-10 23:58:31 · 1659 阅读 · 0 评论 -
求数组的最大子数组和最大子数组的和
#includeusing namespace std;bool IsInvalidInput=false;int MaxSumOfSubarrays(int data[],int length,int &start,int &end){int max=data[0];//这么做是为了处理全是负数的情况,如果令为0,那么当输入都是负数的情况下就会有bugint startt原创 2014-10-11 12:45:36 · 723 阅读 · 0 评论 -
C++实现各种排序算法
//各种排序算法#include"stack.h"//插入排序(直接插入排序和希尔排序)//直接插入排序//正确的swap函数应该像下面那样写,否则无法实现交换//对于数组使用这个函数,swap(a[low], a[high])void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp;原创 2014-09-05 16:21:09 · 737 阅读 · 0 评论 -
C++实现输入两个字符串,从第一字符串中删除第二个字符串中所有的字符
一定要注意一点就是:char* p是一个指针,根本没分配内存,他指向的"abc123ABC" 是只读的,不能改变,你在下面给他赋值肯定是错的而char p[]是一个数组,已经分配内存,是将"abc123ABC" 复制到该内存里面,这个内存是可读写的例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。原创 2014-10-10 13:40:01 · 4420 阅读 · 0 评论 -
C++实现判断两个单词是否为变位词
C++实现判断两个单词是否为变位词原创 2014-10-10 15:37:58 · 4372 阅读 · 0 评论 -
C++实现删除字符串中所有重复出现的字符
C++实现删除字符串中所有重复出现的字符原创 2014-10-10 14:44:33 · 6011 阅读 · 2 评论 -
腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
1.腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?思想:用数组来存这40亿个数,而且只能用bit来表示。why?40亿约等于4G,就算你用一个字节来,也需要4GB,32位的机子爆掉了。如果用bit来存,意思一个字节就能表示8个数,这个样子只需要512M内存。这个属于接受范围。如果有内存要求,则可以分块。转载 2014-10-24 23:34:39 · 3052 阅读 · 0 评论 -
C++实现统计从1到n中1出现的次数(另外一种方法)
Problem Consider a function which, for a given whole number n, returns the number of ones required when writing out all numbers between 0 and n. For example, f(13)=6. Notice that f(1)=1. Wha转载 2014-10-08 16:13:16 · 2277 阅读 · 0 评论 -
时间复杂度的计算方法
1.1 频度统计法。频度统计法指以程序中语句执行次数的多少作为算法时间度量分析的一种方法。通常情况下,算法的时间效率主要取决于程序中包含的语句条数和采用的控制结构这两者的综合效果。因此,最原始且最牢靠的方法是求出所有主要语句的频度f(n),然后求所有频度之和。例如:如下形式的语句段:for (i=1;i{ y++;for (j=0;jx++;转载 2014-10-14 08:36:23 · 3548 阅读 · 0 评论 -
递归式求时间复杂度的代入法与迭代法的举例讲解
在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解。实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而足,比较常用的有以下四种方法: (1)代入法(Substitution Method) 代入法的基本步骤是先推测递归方程的显式解,然后用数学归纳法来验证该解是否合理。转载 2014-10-15 09:46:06 · 7907 阅读 · 1 评论 -
递归式的时间复杂度的计算
递归算法的时间复杂度分析在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解。实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而足,比较常用的有以下四种方法:方法一:代换法代换法主要需要以下两个步骤1、 猜答案,不需要完全猜出来,不需要知道常熟系数的准确值,而只需要猜出它的形式,比如猜一个递归式转载 2014-10-15 09:37:19 · 2937 阅读 · 0 评论 -
求n个骰子的点数
百度2010年某个部门(不记得是哪个了)的实习生笔试题第一题就是这种题,只是一点小小的改动而已。 原题依然来源于网络中某位大侠的BLOG,感谢提供素材:) 写这篇blog是因为原文中提到的方法和原文评论中的方法相关比较大,评论中的方法用到了DP,效率好很多。后来仔细想想,这种实现方法用“表格法”来解释更恰当,至底向上填写表格,最终得到结果。另外,这种至底向上的填表法转载 2014-10-20 08:17:00 · 631 阅读 · 0 评论 -
C++实现二分查找(递归方法和非递归方法)
#includeusing namespace std;bool IsInvalidInput=false;int BinarySearch(int *data,int length,int start,int end,int k)//二分查找,data必须是一个排序的数组。在这里默认data是按照升序排序的数组{if(data==NULL||lengthend){Is原创 2014-10-14 10:26:51 · 1004 阅读 · 0 评论 -
数组中只出现一次的(一个数、两个数、三个数)
题目:一个数组中有三个数字a、b、c只出现一次,其他数字都出现了两次。请找出三个只出现一次的数字。分析:在博客http://zhedahht.blog.163.com/blog/static/2541117420071128950682/中我们讨论了如何在一个数组中找出两个只出现一次的数字。在这道题中,如果我们能够找出一个只出现一次的数字,剩下两个只出现一次的数字就很容易找出来了。如果我们转载 2014-10-16 20:41:12 · 663 阅读 · 0 评论 -
C++实现在正方体8个顶点上放数字使得三组相对的面上的4个顶点的和都相等
输入一个含有8个数字的数组,判断有没有可能使得这个8个数字分别原创 2014-10-05 15:27:34 · 1787 阅读 · 0 评论 -
C++实现求字符串的所有的组合
C++实现求字符串的所有的组合,假定原创 2014-10-05 12:05:06 · 4247 阅读 · 1 评论 -
递归的一些理解
递归,简单点就是快速找到终止条件,然后由终止条件倒过来推运行过程理论上上就是压栈和出栈的过程转载 2014-10-14 21:47:25 · 1540 阅读 · 0 评论 -
递归与尾递归
1、递归 关于递归的概念,我们都不陌生。简单的来说递归就是一个函数直接或间接地调用自身,是为直接或间接递归。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。用递归需要注意以下两点:(1) 递归就是在过程或函数里调用自身。(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。递归一般用于解决三类问题转载 2014-10-15 10:42:25 · 605 阅读 · 0 评论 -
C++实现求解最大公约数和最小公倍数
//求最大公约数#include#include>using namespace std;////更相减损法int gcd(int a,int b){int count=0;while(a%2==0&&b%2==0)//任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简{a/=2;b/=2;count++;}while(a!=原创 2014-10-31 09:36:38 · 1187 阅读 · 0 评论 -
递归式求时间复杂度的递归树的方法举例说明
用递归树的时候注意一下递归树的写法规则:递归算法时间复杂度的计算方程式一个递归方程: 在引入递归树之前可以考虑一个例子: T(n) = 2T(n/2) + n2 迭代2次可以得: T(n) = n2 + 2(2T(n/4) + (n/2) 2) 还可以继续迭代,将其完全展开可得: T(n) = n2 + 2转载 2014-10-15 09:48:17 · 2689 阅读 · 0 评论 -
C++求从1到n的正整数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。问题描述:给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有"1"的个数。例如:N = 2,写下1,2。这样只出现了1个"1"。N = 12,写下1,2,……,12,这样有5个"1"。转载 2014-10-08 15:40:41 · 3836 阅读 · 0 评论 -
各种排序方法比较
各种排序方法比较转载 2014-08-31 11:01:18 · 494 阅读 · 0 评论 -
C++实现用堆求最小的k个数
参考:http://t.jobdu.com/thread-8094-1-1.htmlhttp://blog.chinaunix.net/uid-26548237-id-3513260.html#includeusing namespace std;void maxheapify(int *num,int i,int length){int left=2*i+1;in原创 2014-10-07 14:25:10 · 477 阅读 · 0 评论 -
判断一个单向链表中是否存在环
#include"list.h"using namespace std;bool ListisLoop(listnode* head){listnode* pahead=head;listnode* pbehind=head;if(head->next==NULL)return false;while(pahead!=NULL&&pbehind!=NULL&&pbe原创 2014-09-12 15:42:14 · 343 阅读 · 0 评论 -
C++实现遍历链表一次求出中间的节点
//构建链表#include"list.h" listnode* MiddleNOdeFromEnd(listnode* head){listnode* pahead=head;listnode* pbehind=head;if(head->next==NULL)return NULL;if(head->next->next==NULL)return head-原创 2014-09-12 15:13:38 · 668 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面【不保持相对位置】
题目: 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n),不要求保留数组元素的相对位置。转载 2014-09-12 10:20:51 · 475 阅读 · 0 评论 -
大数除以大数
首先说一下我们所要的结果,当除数除不开被子除数时,不用除到小数,当除数小于被除数时,除数作为余数既可,不用再向下除了。 除法算法是最容易想到的啦!我们学数字电路,或模拟电路时里面有用门实现的除法器,做法是用除数减被除数,再用一个加法器去计算存储结果,算法简单明了,结果我实现之后,计算速度大大出乎我的遇料,比算乘方时还慢,经仔细想想电路中计算的长度不过8位,16位,32位,而且都是硬件实现转载 2014-09-21 22:45:59 · 1081 阅读 · 0 评论 -
C++实现大数的加法
//没有考虑相加的数中有负数的情况,只考虑了两个数都是正数#includeusing namespace std;void addition(char* num1,char* num2,char* result,int num1length,int num2length,int resultindex){int flag=0;//标志进位int index=0;whil原创 2014-09-19 23:09:49 · 1226 阅读 · 0 评论 -
桶排序
桶排序利用函数的映射关系,减少了几乎所有的比较工作。实际上,桶排序的f(k)值的计算,其作用就相当于快排中划分,已经把大量数据分割成了基本有序的数据块(桶)。然后只需要对桶中的少量数据做先进的比较排序即可。对N个关键字进行桶排序的时间复杂度分为两个部分:(1) 循环计算每个关键字的桶映射函数,这个时间复杂度是O(N)。(2) 利用先进的比较排序算法对每个桶内的所有数据进行排转载 2014-09-05 16:30:06 · 383 阅读 · 0 评论 -
计数排序
计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。[1-2] 目录1算法思想编辑计数排序对输入的数据有附加的限制条件:1、输入的线性表的元素属于有限偏序集S;2、转载 2014-09-05 16:22:17 · 372 阅读 · 0 评论 -
基数排序中的LSD方法和MSD方法
最高位优先(Most Significant Digit first)法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。最低位优先(Least Significant Digit first)法,简称LSD法:先从kd开始排序,再对转载 2014-09-05 08:22:50 · 5975 阅读 · 0 评论 -
算法心得
学习一个算法,先知其解决什么,后知其解决策略 。如图算法中,①广搜:一层一层往外遍历,寻找最短路径,策略:队列,②最小生成树:最小代价连接所有点,策略:贪心(Prim:贪心+权重队列),③Dijkstra:寻找单源最短路径,策略:贪心+非负权重队列,④Floyd:多结点对的最短路径,策略:动态规划。转载 2014-04-21 15:51:00 · 536 阅读 · 0 评论 -
C++构建队列
//构建队列#includeusing namespace std;struct queuenode{int data;queuenode* next;};class queue{private:queuenode* head;public:queue(){head=new queuenode;head->next=NULL;}~qu原创 2014-08-30 23:32:24 · 930 阅读 · 0 评论 -
算法空间复杂度
算法空间复杂度我们在写代码时,完全可以用空间来换取时间,比如说,要判断某某年是不是闰年,你可能会花一点心思写了一个算法,而且由于是一个算法,也就意味着,每次给一个年份,都是要通过计算得到是否是闰年的结果。还有另一个办法就是,事先建立一个有2 050个元素的数组(年数略比现实多一点),然后把所有的年份按下标的数字对应,如果是闰年,此数组项的值就是1,如果不是值为0。这样,所谓的判断某一年是否转载 2014-08-31 11:37:31 · 654 阅读 · 0 评论 -
C++实现大数的四则运算
C++实现大数的四则运算http://blog.163.com/niwei_258/blog/static/106284882010101634753100/转载 2014-09-14 15:33:23 · 593 阅读 · 0 评论 -
C++实现求数组中前K大的数
C++实现求数组中前K大的数,原创 2014-10-06 15:25:10 · 2139 阅读 · 0 评论 -
C++实现数组中求第K大数
参考:http://blog.csdn.net/hackbuteer1/article/details/6651804原创 2014-10-06 14:53:37 · 1195 阅读 · 0 评论 -
C++实现输入两个整数n和m,从数列1,2,3...n中随意取几个数,使其和等于m,要求列出所有的组合
题目:C++实现输入两个整数n和m,从数列1,2,3...n中随意取几个数,使其和等于m,要求列出所有的组合用到了组合的思想原创 2014-10-05 21:35:06 · 2100 阅读 · 0 评论