算法
keep_moving_cqu
每天晚上疲劳的睡在床上时才感觉真真切切地过了一天人生最重要的不仅是努力还有方向压力不是有人比你努力而是比你牛叉几倍的人依然比你努力即使看不到未来即使看不到希望也依然相信自己错不了自己选的人生错不了第二天叫醒我的不是闹钟其实还是梦想
展开
-
01背包问题-----回溯法的解决方案
01背包问题是个经典的动态规划问题,但是也可以用回溯法来解决。只是这是找一个子树而不是一个全部树元素的排列。#includeusing namespace std;#define MAX 1024int C=7;//最大重量int N=4;//包个数int value[MAX];//记录每个包的价值int weight[MAX];//记录每个包的重量int current原创 2013-11-08 01:09:04 · 3765 阅读 · 0 评论 -
百度笔试题----最小不重复数
给定一个任意数,找出比这个数大的最小不重复数(不重复数是指:这个数的相邻两位不同如:1231为不重复数,而1233为重复数)。其实这个题目,看起来挺简单的,我只要从这个数开始一直向上找,总会找到吧。。确实,但是如果我给你一个特别大的数呢,比如:111111111,这就傻了,那要遍历多少个数啊!所以这样做很不现实。那我们就来分析下吧。先找几个用例看看:123------------>124原创 2013-10-03 01:14:38 · 2786 阅读 · 4 评论 -
最大回文子字符串
找出一个给定字符串的最长子回文字符串比如:abbaca的最长子回文字符串是abba#include#includeusing namespace std;void main(){ string input; while(cin>>input) { int maxLength=1; int i; int indexStart=0; int indexEnd=0原创 2013-10-02 01:15:51 · 1779 阅读 · 2 评论 -
约瑟夫环的两种实现
方法一:用一个数组存放每个元素,再用一个bool数组存放每个元素是否还在那个队列中。每次出列一个元素,将其对应的那个bool值置为false。循环输出第m个元素直到只剩下一个元素在队列中。不过这个时间复杂度比较高。 #includeusing namespace std;//时间复杂度高的方法#define MAX_LENGTH 50int data[MAX_LENGTH]原创 2013-09-17 02:56:50 · 1464 阅读 · 0 评论 -
堆的建立,插入和自动排序
在网上看的代码基本上都是这样的:#includeusing namespace std;void MakeHeap (int a[], int n);intmain (){ int a[100]; int n, i; cout << "Enter the number:" << endl; cin >> n; for (i = 1; i <= n; i++原创 2013-09-02 14:12:22 · 1262 阅读 · 0 评论 -
贪心算法--哈夫曼编码问题
1、问题描述 哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在20%~90%之间。哈夫曼编码算法用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式。一个包含100,000个字符的文件,各字符出现频率不同,如下表所示。 有多种方式表示文件中的信息,若用0,1码表示字符的方法,即每个字符用唯一的一个0,1串表示。若采用定长编码表转载 2013-09-30 14:30:32 · 3227 阅读 · 1 评论 -
发篇文章纪念我死去的第一个机试---重庆地区华为机试
虽然很不想回忆昨天的机试,满怀信心的去,满载失望和遗憾的回。栽在不应该出现的问题上。。细节决定成败啊!!!!今天我终于鼓起勇气做做昨天的题。受第一题的影响,我直接放弃后面的题目,只看了看题目。题目二:输入:整数 空格 整数 整数的范围小于128位(我就理解成:比如4444有4位) 输出:整数#include#include原创 2013-09-15 20:29:50 · 1667 阅读 · 0 评论 -
树的递归遍历和非递归遍历(前序和后序)
/********************************************树的递归遍历和非递归遍历********************************************/#include#includeusing namespace std;struct Node{ Node(int v=0,Node* l=NULL,Node* r=NUL原创 2013-09-11 20:35:21 · 1076 阅读 · 0 评论 -
找出字符串的组合
比如:“abc”字符串的组合为:a,b,c,ab,ac,bc,abc。这里我用两种方法实现:位操作:#include#includeusing namespace std;//位操作算法void main(){ char* data="abcd"; int length=strlen(data); int last=(1<<length)-1; cout<<last原创 2013-09-05 00:29:36 · 1434 阅读 · 0 评论 -
拓扑排序---(图的领接表实现)
#includeusing namespace std;#define MAX_NODE 30#define MAX_INFO 10bool isOutput[MAX_NODE]; //记录该节点有没有输出struct ListNode{ ListNode(){next=NULL;} int position; ListNode* next; };stru原创 2013-09-05 00:18:42 · 2170 阅读 · 0 评论 -
银行家算法---C++实现
众所周知的死锁避免的一个算法------银行家算法,它是根据当前系统的资源分配状态来判断本次资源请求是否合法,如果合法,就分配资源,否则就不分配资源,因为这可能会发生死锁状态。下面我是我根据自己的理解的一个算法实现。欢迎大家指正。#includeusing namespace std;int Resource[3]={10,5,7};//三种资源数.int Available[原创 2013-10-05 01:21:53 · 2856 阅读 · 0 评论 -
分治--大数相乘
题目:大数相乘,例如:a=423405293459和b=323452345234533相乘a*b。这里我们采用分治的思想:1:将该问题分成b的每个数和a相乘。2:将每个数和a相乘得到结果存入一个数组中,每个数对应一个数组。3:合并每个数组,相加。。#include#includeusing namespace std;void main(){ string a=原创 2013-10-28 00:40:14 · 1845 阅读 · 0 评论 -
经典回溯问题-----旅行员售货问题
问题:某售货员要到若干城市去推销商品,已知各城市之间的路程(旅费),他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(总旅费)最小。以上图为例:售货员要从1开始经过2,3,4又返回1。给我的感觉就是一个排列问题。在进行计算排列的同时要判断是否该排列有必要进行下去,因为可能在中途就可以判断这样肯定得不到我们想要的结果,此时采用回溯。代码实现:/*原创 2013-11-08 01:08:05 · 2247 阅读 · 0 评论 -
经典回溯问题----n皇后
n皇后问题不用多说,基本都知道。回溯算法也不用多说,还是比较简单的,给我的感觉就是不停的找一颗子树或一个排列,并加上判断以回溯。/** 经典回溯问题-----n皇后*/#includeusing namespace std;#define MAX 1024int N;int column[MAX];//每行对应的列值int sum=0;bool Place(int原创 2013-11-08 01:08:47 · 1445 阅读 · 0 评论 -
凸多边形最优三角剖分
动态规划的经典应用----凸多边形最优三角剖分 具体的细节讲解,我就不多说啦。网上很多资料,而且讲的非常详细。下面我贴下我做的,虽然大概思路懂了,但是去实现的时候,还是遇到了很多问题。主要是没有正确的理清思路。写下来记录一下。。#includeusing namespace std;#define MAX 1024int min[MAX][MAX];//m[i][j]节点i开始原创 2013-11-06 01:36:56 · 2214 阅读 · 1 评论 -
动态规划之多边形游戏
给定N个顶点的多边形,每个顶点标有一个整数,每条边上标有+(加)或是×(乘)号,并且N条边按照顺时针依次编号为1~N。下图给出了一个N=4个顶点的多边形。 游戏规则 :(1) 首先,移走一条边。 (2) 然后进行下面的操作: 选中一条边E,该边有两个相邻的顶点,不妨称为V1和V2。对V1和V2顶点所标的整数按照E上所标运算符号(+或是×)进行运算,得到一个整数;用该整数标注一个原创 2013-11-06 01:36:28 · 2319 阅读 · 0 评论 -
Floyd算法分析和实现
其实我觉得这个算法还是很简单的,但是看网上的资料感觉很高深,说的我稀里糊涂的。难道是我想错啦?希望大神帮我指正(真心没自信)。。谢谢。/*Floyd算法:可以解决任何两点间的最短距离问题。而dijkstra算法是解决源节点和目的节点两个之间的最短距离问题。Floyd算法思想: 如果两点的最短距离不是两点的带权路径的权值,而是通过中间的某个节点或多个节点才有了这个最短路径。所以我们对于任原创 2013-11-03 01:16:56 · 1869 阅读 · 0 评论 -
dijkstra算法分析和实现
dijkstra算法是解决源节点和目的节点两个之间的最短距离问题。其实对这个算法并不熟悉,前几天通过在网上查资料后决定自己实现这个算法,也不知道我理解的对不对。。如果不对,希望帮我指出,谢谢。/*dijkstra算法思想:定义两个集合S,T。S初始化为源节点,T初始化为其他所有节点,每次在T中找出到源节点中的最短距离。这样就满足一个 特性:源节点到S中的任何一个元素原创 2013-11-03 01:12:30 · 1571 阅读 · 0 评论 -
最小费用最大流
有了上一篇文章的基础,理解最小费用最大流就很容易了,但是我还是想了挺久的。当我看到最小费用最大流问题这篇文章,才开始觉悟。于是做了如下实现。/* 每次找出最短路径(该路径的单位费用和最小)记录该路径(next数组) 直到找不出这样一条路径(实际上是没有到达终点的路,因为图中的路是会不停的变动)。我们这里的是Distance[0]>=MAX*/#includeusing nam原创 2013-11-01 01:15:33 · 4507 阅读 · 0 评论 -
最大流算法
基本的知识,解决什么问题这些东西就不说啦。算法导论和很多大神博客都讲解的很详细。它其实就是不停的找增广路直到找不到为止。此时通过的所有流量就是最大流量。我推荐一篇文章:(基本过程讲解的很详细,我很收益。)Ford-Fulkerson 最大流算法下面是我的实现。参考了 最大流Ford-Fulkerson的算法实现#include#includeusing namesp原创 2013-11-01 01:13:13 · 2915 阅读 · 2 评论 -
匈牙利算法---解决最大匹配问题
这是一种用增广路求二分图最大匹配的算法。讲解的很详细的博客:https://www.byvoid.com/blog/hungary/至于基础知识,我就不多讲了。其实它就是一直在找出一条路径能把二分图的左半部分的其中一个未匹配节点和右半部分的其中一个未匹配节点加入到已经匹配的节点中去。这就是关键。那个博客讲的很详细了。看了之后都知道是具体情况。下面我根据自己的理解实现了一下这个算法(DF原创 2013-10-31 02:19:51 · 2177 阅读 · 0 评论 -
数对之差的最大值
题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。#includeusing namespace std;void main(){ int data[]={2, 4, 1, 16, 7, 5, 11, 9}; int length=sizeof(原创 2013-08-29 03:13:28 · 1363 阅读 · 0 评论 -
直接选择排序
#includeusing namespace std;void swap(int* a,int* b){ int temp=*a; *a=*b; *b=temp;}void main(){ int a[]={3,5,7,3,2,4,6,7,9,4,3,24,6,8}; int length=sizeof(a)/sizeof(int); int i; int j;原创 2013-08-23 15:31:14 · 881 阅读 · 0 评论 -
冒泡排序
#includeusing namespace std;void swap(int* a,int* b){ int temp=*a; *a=*b; *b=temp;}void main(){ int a[]={3,5,7,9,1,4,7,0,10,38}; int length=sizeof(a)/sizeof(int); int i; int j; for(i=0;i原创 2013-08-23 13:53:31 · 925 阅读 · 0 评论 -
归并排序
#includeusing namespace std;void sort(int a[],int first,int mid,int last,int temp[]){ int i=first; int j=mid; int count=0; while(1) { if(a[i]<a[j]) { temp[count++]=a[i++]原创 2013-08-23 13:55:59 · 1006 阅读 · 0 评论 -
直接插入排序
#includeusing namespace std;void swap(int* a,int* b){ int temp=*a; *a=*b; *b=temp;}void main(){ int a[]={3,6,2,7,5,4,0,10,53,26}; int length=sizeof(a)/sizeof(int); int i;原创 2013-08-23 13:54:44 · 1161 阅读 · 0 评论 -
快速排序
#includeusing namespace std;void swap(int* a,int* b){ int temp=*a; *a=*b; *b=temp;}void quickSort(int a[],int first,int last){ if(first<last) { int i=first+1,j=last; int temp=a[fir原创 2013-08-24 00:41:27 · 1142 阅读 · 0 评论 -
希尔排序
#includeusing namespace std;void swap(int* a,int* b){ int temp=*a; *a=*b; *b=temp;}void main(){ int a[]={2,5,3,7,4,8,2,6,2,4,10}; int length=sizeof(a)/sizeof(int); int gap=length/2; in原创 2013-08-23 15:22:09 · 748 阅读 · 0 评论 -
md5加密原理
md5加密原理 首先要明白一个概念,md5不是用于加密,而是用于数据的完整性校验的一种技术。 这是一个单向散列函数,单向的意思就是说不可逆转。你可以将源内容通过md5函数散列出一个md5校验码,这个md5校验码是唯一的,你可以作为证明源的身份标识,但是你无法通过md5校验码去还原源。Src ---> md5 --->md5Code 但是 md5Code --->某算法转载 2013-06-29 23:21:03 · 1624 阅读 · 0 评论 -
求两个字符串最长公共子串
【转】求两个字符串最长公共子串的问题博客分类:企业应用面临的问题算法和数据结构 算法LCS(Longest Common Subsequence) 就是求两个字符串最长公共子串的问题。link:http://blog.csdn.net/zztfj/article/details/6157429比如: String str1 = new Str转载 2013-06-29 15:14:44 · 1132 阅读 · 0 评论 -
链表复习----C++
马上就要找工作了,要复习复习数据结构,看到网上的试题,所以就动手写了写。。这里花了十几分钟写了个链表删除指定node..需求:删除指定学生链表中学生年龄为n的学生。。 #include#includeusing namespace std;typedef struct student{ int id; string name; int age; struct stu原创 2013-08-17 19:12:27 · 1217 阅读 · 0 评论 -
遍历一次反转单链表
遍历单链表一次,反转链表。#includeusing namespace std;typedef struct NODE{ NODE(int v) { value=v; next=NULL; } int value; NODE* next;}Node;void printList(NODE* head){ coutvalue<<" "; if(head原创 2013-08-29 13:01:54 · 1525 阅读 · 0 评论 -
数据结构之图详解
图的建立:大家都知道一般创建图可以用两种存储结构:邻接矩阵和邻接表。这里我们采取邻接矩阵的方法。。这两种具体的结构在这里不介绍了。struct MyGraphic{ int vertex,edge; //顶点和边 int Matrix[MAX_VERTEX][MAX_VERTEX]; //临接矩阵 };这就是我做的创建图基本的结构,包括:点数(vertex),边数(edge)原创 2013-09-03 19:43:02 · 3023 阅读 · 1 评论 -
全排列
#includeusing namespace std;int data[4]={1,2,3,4};int length=4;void swap(int* data,int first,int second){ int temp=data[first]; data[first]=data[second]; data[second]=temp;}void Permutate(原创 2013-09-02 20:43:39 · 879 阅读 · 0 评论 -
统计字符串中出现最多的单词和次多的单词
题目:统计字符串中出现最多的单词和次多的单词。测试用例:"This This This a dog,not a cat!" 输出:This 3次 a 2次思路:先把这个字符串分词,放入一个数组中。然后记录每个词出现的次数。先找出最多的那个词,然后将其次数置0,在找最多的那个词(原来次多的词)。#includeusing namespace std;#define MAX_原创 2013-09-08 23:13:12 · 3333 阅读 · 0 评论 -
带环单链表的问题
因为上一篇文章对这个问题讲解的很详细,这里只给个代码展示:(找出带环单链表的环的第一个节点)#includeusing namespace std;int length;struct Node{ int value; Node* next;};Node* meetCicleNode=NULL; //快节点和慢节点的相遇节点Node* firstCileNode=NUL原创 2013-09-02 23:44:16 · 1421 阅读 · 0 评论 -
判断单链表是否有环 并找出第一个相交的节点
2、给出一个单向链表的头指针pHead,判断链表中是否有环。示意图如下:链表中有环,其实也就是自相交。我们用两个指针pslow和pfast从头开始遍历链表,pslow每次前进一个节点,pfast每次前进两个结点,若存在环,则pslow和pfast肯定会在环中相遇,若不存在,则pslow和pfast能正常到达最后一个节点(实际上是到达NULL)。 3、给出两个单向链表的头指针pH转载 2013-09-02 23:07:03 · 3333 阅读 · 0 评论 -
微软面试题:求整数随机数构成的数组中找到长度大于=3的最长的等差数列
求微软面试题:求整数随机数构成的数组中找到长度大于=3的最长的等差数列输出等差数列由小到大: 如果没有符合条件的就输出[0,0]格式:输入[1,3,0,5,-1,6]输出[-1,1,3,5]要求时间复杂度,空间复杂度尽量小这里我还没有想到更好的办法,目前只实现了一个sb版本的时间复杂度为O(n^3)的算法。。暴力破解。。#include#include原创 2013-08-31 03:24:35 · 1505 阅读 · 0 评论 -
输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字
题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。#includeusing namespace std;void test(int* data,int&原创 2013-08-29 14:15:30 · 2177 阅读 · 0 评论 -
将字符串变成大写----C++实现
虽然这个题目很简单,但是也是会范很多错误的,平时你肯定知道,但是在编程的时候就是容易犯傻,而且八匹马都拽不回来。。。看来还是要多写写代码。。不废话了。直接贴代码。。#include#includeusing namespace std;char* toUpperChar(char* src){ int length=strlen(src); char* m_dest=n原创 2013-08-17 20:59:38 · 2687 阅读 · 0 评论