![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 71
zhongkeli
这个作者很懒,什么都没留下…
展开
-
floyd算法
这个算法主要要弄懂三个循环的顺序关系。弗洛伊德(Floyd)算法过程:1、用D[v][w]记录每一对顶点的最短距离。2、依次扫描每一个点,并以其为基点再遍历所有每一对顶点D[][]的值,看看是否可用过该基点让这对顶点间的距离更小。算法理解:最短距离有三种情况:1、两点的直达距离最短。(如下图)2、两点间只通过一个中间点而距离最短。(图)3、两点间用通原创 2013-04-22 08:55:19 · 44258 阅读 · 3 评论 -
顶点深度优先次序
在调用dfs的过程中,几种添加顶点到集合的顺序。一共有四种顺序:Pre-Order,在递归调用dfs之前将当前顶点添加到queue中Reverse Pre-Order,在递归调用dfs之前将当前顶点添加到stack中Post-Order,在递归调用dfs之后将当前顶点添加到queue中Reverse Post-Order,在递归调用dfs之后将当前顶点添加到stack中原创 2013-04-16 16:19:48 · 1635 阅读 · 0 评论 -
0/1背包问题
1.引子 我们人类是一种贪婪的动物,如果给您一个容量一定的背包和一些大小不一的物品,裝到背包里面的物品就归您,遇到这种好事大家一定不会错过,用力塞不一定是最好的办法,用脑子才行,下面就教您如何解决这样的问题,以获得更多的奖品。2.应用场景 在一个物品向量中找到一个子集满足条件如下 : 1)这个子集加起来的体积大小不能大于指定阀值 2) 这个物原创 2013-04-25 09:55:56 · 919 阅读 · 0 评论 -
最长公共子序列
一个字符串S,去掉零个或者多个元素所剩下的子串称为S的子序列。最长公共子序列就是寻找两个给定序列的子序列,该子序列在两个序列中以相同的顺序出现,但是不必要是连续的。例如序列X=ABCBDAB,Y=BDCABA。序列BCA是X和Y的一个公共子序列,但是不是X和Y的最长公共子序列,子序列BCBA是X和Y的一个LCS,序列BDAB也是。寻找LCS的一种方法是枚举X所有的子序列,然后注意检原创 2013-04-25 08:14:19 · 21415 阅读 · 2 评论 -
寻找有向图的环
在DFS中,递归调用的栈是记录当前正在遍历的有向路径如果找到一条边v->w并且w在栈中,此时就找到一个环,因为在栈中表示的是一条从w到v的有向路径,加上v->w,构成一个环。#include #include #include #include using namespace std;struct node /* 图顶点结构定义 *原创 2013-04-15 20:54:25 · 5725 阅读 · 1 评论 -
bellman-ford 算法
Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。这时候,就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝尔曼(Richard Bellman, 动态规划的提出者)和小莱斯特•福特(Lester Ford)发明。原创 2013-04-23 18:14:30 · 1215 阅读 · 0 评论 -
spfa算法
求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm。简单的说就是队列优化的bellman-ford在路径中存在负权边是 dijkstra 就没法使用了 ,这是就可以SPFA 了但是当有负权的环是 就没有最短路,spfa 可以判断是否有负权环,如果没有就可以求出最短路。。期望的时间复杂度O(ke), 其中k原创 2013-04-23 19:54:03 · 870 阅读 · 0 评论 -
无向图判断环
方法:从一个顶点出发深度优先遍历可遍历所有结点,并且没有环或只有n-1条边。若判断有环:可以在遍历时记住父结点,v的子结点w已被访问,且不是结点v的父结点,则存在环。若判断只有n-1条边,循环一下很容易得到。用拓扑排序不可,因为无向图各顶点都有入度.假设不存在自环与平行边#include #include struct node原创 2013-04-15 09:08:17 · 3203 阅读 · 0 评论 -
kruskal 算法b
使用堆排序,并查集实现kruskal算法。堆排序算法见:http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html并查集合:http://www.cnblogs.com/cherish_yimi/archive/2009/10/11/1580839.html#include "iostream"#include原创 2013-04-23 10:35:49 · 899 阅读 · 0 评论 -
无向图的连通分量
无向图的连通分量一、对无向图进行遍历时(一)对于连通图,仅需要从图中任一顶点出发,进行深度优先搜索或广度优先搜索,便可访问到图中所有顶点。(二)对于非连通图,则需从多个顶点出发进行搜索,而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其各个连通分量中的顶点集。 二、连通分量举例 (a) 无向图G3 (原创 2013-04-14 14:19:11 · 23598 阅读 · 0 评论 -
prim算法
#include "iostream"#include "vector"#include "fstream"using namespace std;std::vector > weight;int vertexnum;int edgenum;void initialvector(){ weight.resize(vertexnum); for(int i = 0; i< ver原创 2013-04-17 13:11:52 · 749 阅读 · 0 评论 -
dijkstral 算法
在图论中,Prim算法是计算最小生成树的算法,而Dijkstra算法是计算最短路径的算法。二者看起来比较类似,因为假设全部顶点的集合是V,已经被挑选出来的点的集合是U,那么二者都是从集合V-U中不断的挑选权值最低的点加入U,那么二者是否等价呢?也就是说是否Dijkstra也可以计算出最小生成树而Prim也可以计算出从第一个顶点v0到其他点的最短路径呢?答案是否定的,否则就不必有两个算法了。原创 2013-04-17 20:23:47 · 1021 阅读 · 0 评论 -
无向图 割点
1.定义:割点:某个点是割点当且仅当删除该点和与该点相关联的边后图变得不连通。桥(割边):某条边是割边当且仅当删除该边后图变的不连通。双连通分支:图G的所有子图G'中,如果G'是连通的,则称G'是双连通子图。如果G'不是任何一个连通子图的真子图,那么图G'是双连通分支。特别的,点双连通分支又叫做块。2.求割点,桥对原图进行深度优先搜索,会生成一颗深度优先搜索原创 2013-04-26 15:10:09 · 1145 阅读 · 0 评论 -
链表原地归并
#include "iostream"using namespace std;struct node{ node *next; int data;};void print(node *head){ node *p = head; while(p != NULL){ coutdata<<"\t"; p = p->next; } cout<<endl;原创 2013-11-26 15:56:11 · 961 阅读 · 0 评论 -
最长递增子序列
最长递增子序列又叫做最长上升子序列;子序列,正如LCS一样,元素不一定要求连续。本节讨论实现三种常见方法,主要是练手。题:求一个一维数组arr[i]中的最长递增子序列的长度,如在序列1,-1,2,-3,4,-5,6,-7中,最长递增子序列长度为4,可以是1,2,4,6,也可以是-1,2,4,6。方法一:DP像LCS一样,从后向前分析,很容易想到,第i个元素之前的最长递增子序原创 2013-10-24 09:10:25 · 743 阅读 · 0 评论 -
求子数组的最大和
题目:输入一个整型数组,数组里面有正数也有负数,数组中的连续一个或者多个整数组成一个子数组,每一个子数组都有一个和,求所有子数组和的最大值。要求时间复杂度为O(n)。 例如:输入数组为{1,-2,3,10,-4,7,2,-5},和的最大子数组为{3,10,-4,7,2},因此输出为子数组的和18。在http://www.cnblogs.com/python27/archive/2原创 2013-10-24 10:39:47 · 711 阅读 · 0 评论 -
使用快排思想 求第n大的值
#include "iostream"#include "vector"#include #include using namespace std;template int partition(vector &a,int low,int high){ T temp = a[low]; while(low < high){ while((low temp)) --high;原创 2013-10-18 15:32:03 · 999 阅读 · 0 评论 -
堆排序 选取最小的k个值
#include "iostream"#include "vector"#include "algorithm"using namespace std;void HeapAdjust(std::vector &a,int i,int size){ int lchild = 2*i + 1; int rchild = 2*i + 2; int max = i; if(i < size原创 2013-10-18 13:15:57 · 906 阅读 · 0 评论 -
堆排序
#include "iostream"#include "vector"#include "algorithm"using namespace std;void HeapAdjust(std::vector &a,int i,int size){ int left = 2*i + 1; int right = 2*i + 2; int max = i; if(i < size/2)原创 2013-10-08 10:03:46 · 629 阅读 · 0 评论 -
左移字符
#include #include using namespace std;void reverse(vector&a,int begin,int end){ int temp; while(begin<end){ temp = a[begin]; a[begin] = a[end]; a[end] = temp; begin++; end--; } }voi原创 2013-10-06 20:02:31 · 633 阅读 · 0 评论 -
A星八数码
#include#includeusing namespace std;struct node{ char num[9]; int gvalue; int hvalue; int fvalue; char action; node *parent; node *next;};node *openlist,*closelist,*bestnode;char start[9]原创 2011-11-19 19:14:10 · 1497 阅读 · 0 评论 -
KMP 算法
#include "iostream"#include "vector"#include "string"using namespace std;std::vector next;void get_next(string p){ int i = 0; int j = -1; next[0] = -1; while(i < p.size() - 1){ if(j == -1 |原创 2013-04-19 20:36:38 · 786 阅读 · 0 评论 -
广度优先搜索
#include #include #include #include using namespace std;struct node /* 图顶点结构定义 */{ int vertex; /* 顶点数据信息 */ struct node *nextnode;原创 2013-04-14 13:04:59 · 1090 阅读 · 0 评论 -
判断无向图是否有环
判断N结点的无向图G是否有环假定:结点个数为M,边条数为E遍历一遍,判断图分为几部分(假定为P部分,即图有 P 个连通分量)对于每一个连通分量,如果无环则只能是树,即:边数=结点数-1只要有一个满足 边数 > 结点数-1原图就有环将P个连通分量的不等式相加,就得到: 所有边数 > 所有结点数 + 连通分量个数即: E +原创 2013-04-14 21:41:36 · 4823 阅读 · 0 评论 -
《编程之美》读书笔记(一):中国象棋将帅问题
《编程之美》读书笔记(一):中国象棋将帅问题 http://blog.csdn.net/kabini/article/details/2256421 作者:薛笛 EMail:jxuedi#gmail.com 千呼万唤始出来,在跳票了快一个月之后,虽然明知道书里还有不少错误没改过来(附了一整页的勘误),但是感觉已经不能等下一版了。赶快去书店买回来,吃完饭躺床上舒舒服服地转载 2011-12-12 10:49:29 · 1058 阅读 · 0 评论 -
连续的自然数相加
正整数中有些数字是可以由连续的自然数相加而得,比如1+2=34+5=92+3+4=9这里再列出它的三个问题:1、 写一个程序,对于任意64位正整数,输出它所有可能的连续自然数之和的算式?2、 怎么样的数字是不能由连续的自然数相加而得,并且证明?3、 64位正整数范围内子序列数目最多的数是哪一个?能否用数学知识推导出?(未做出)我的分析:1、 列举并归纳分析首转载 2011-11-22 18:14:20 · 11511 阅读 · 0 评论 -
蓄水池抽样
如何等概率的从N个元素中选取出K个元素?这个问题就是一个蓄水池抽样(Reservoir Sampling),算法可以如下描述: Init : a reservoir with the size: k for i= k+1 to N M=random(1转载 2011-11-22 15:02:22 · 2171 阅读 · 0 评论 -
SPFA算法
SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。算法大致流程是用一个队列来进行维护。 初始时将源加入队列。 每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。 直到队列为空时算法结束。这个算法,简单的说就是队列优化的bellman-ford,利用了每个点不转载 2011-11-22 19:57:29 · 696 阅读 · 0 评论 -
找出数组中两个只出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析:这是一道很新颖的关于位运算的面试题。首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的转载 2011-11-21 23:14:57 · 510 阅读 · 0 评论 -
连续自然数之和
连续自然数之和可以利用等差数列求和公式求得: , N=n*a+n*(n-1)/2;其中N为需要拆分的整数,n为拆分后连续自然数个数,a为连续自然数中第一位数,比如:36=11+12+13 那么N=36,n=3,a=11;所以 n2+(2a-1)*n -2N=0; 解得方程根为: n=½ [(1-2a)+√((2a-1)²-8N)] ;现在即可遍历1-n,使1-n各个转载 2011-11-22 18:15:00 · 8663 阅读 · 2 评论 -
蓄水池抽样
How could you select one of n objects at random, where you see the objects sequentially but you do not know the value of n beforehand? For concreteness, how would you read a text file, and select an转载 2011-11-22 12:48:01 · 402 阅读 · 0 评论 -
常见面试题思想方法整理 - HappyAngel
最近一直在找工,博客都没怎么更新了,觉得也该总结和思考些东西了,于是便有了这篇文章。谈到面试题,其实它有很多种,有偏技术的(腾讯,淘宝问得多);有偏算法,逻辑和数学的(微软,谷歌,百度,阿里云等问得多)。我喜欢后者,最近也做了很多这方面的题目,围观了很多关注算法和面试题的博客,比如(july童鞋)。对于很多精妙的题目,常常在想这些出题的童鞋是怎么想到的,因为这些题目确实能够很深入的考察出一个面试者转载 2011-11-22 18:25:21 · 937 阅读 · 0 评论 -
几种压缩算法原理介绍
几种压缩算法原理介绍 http://www.cppblog.com/windcsn/archive/2006/01/06/2476.aspxRLERLE 又叫Run Length Encoding ,是一个针对无损压缩的非常简单的算法。它用重复字节和重复的次数来简单描述来代替重复的字节。尽管简单并且对于通常的压缩非常低效,但它有的时候却非常有用(例如,JPEG 就使用它)。 1转载 2012-02-14 21:43:57 · 599 阅读 · 0 评论 -
选择排序
#include using namespace std;void swap(int a[],int i,int min){ int temp = a[i]; a[i] = a[min]; a[min] = temp;}int main(int argc, char const *argv[]){ int a[] = {2,1,3,4,2,6,55,7};原创 2013-04-09 09:27:41 · 733 阅读 · 0 评论 -
插入排序
#include using namespace std;int main(int argc, char const *argv[]){ int a[] = {2,1,3,4,2,6,55,7,1}; int temp; int j; for(int i = 0;i < sizeof(a)/sizeof(int);i++){ temp = a[i]; for(j = i;j原创 2013-04-09 10:41:33 · 723 阅读 · 0 评论 -
深度搜索
在http://www.cnblogs.com/yanlingyin/archive/2011/12/26/Depth-firstsearch.html 介绍了递归的深度搜索,写的比较好,最后我补充他的非递归方法。图是一种常见的数据结构,深度优先和广度优先搜索都是常用的算法,这篇博文先介绍深度优先搜索。和往常一样的,我会用朴实的语言来介绍它,所以只要认真看一定能理解。开始会先介原创 2013-04-12 21:58:56 · 9190 阅读 · 1 评论 -
horner法则求字符串散列值
#include "iostream"#include "string.h"using namespace std;int main(int argc, char const *argv[]){ int hash = 0; char *str = "abcdef"; for(int i = 0;i < strlen(str);i++){ hash = 31*hash + (int原创 2013-04-12 15:30:12 · 2556 阅读 · 0 评论 -
二叉查找数
#include using namespace std;template class treenode{ public: T key; int freq; treenode* lchild; treenode* rchild; treenode():lchild(NULL),rchild(NULL),freq(1){}};template class BST{原创 2013-04-12 08:56:46 · 1384 阅读 · 0 评论 -
快排算法
#include using namespace std;template void quicksort(T a[],int low,int high){ int mid; if(low < high){ mid = partition(a,low,high); quicksort(a,low,mid-1); quicksort(a,mid+1,high); }}tem原创 2013-04-11 18:27:03 · 4856 阅读 · 0 评论 -
三向切分快排
#include using namespace std;template void sawp(T a[],int first,int second){ T temp; temp = a[first]; a[first] = a[second]; a[second] = temp;}template int sort(T a[],int low,int high){ if(l原创 2013-04-11 19:50:45 · 2263 阅读 · 2 评论