算法
文章平均质量分 72
ruleless
本博客多记录我平常在工作中经常用到的代码,以备个人查询
展开
-
通用归并排序
用支持递归的语言实现归并排序是很简单的。假设m_sort可以将一个数组排序,那么m_sort的递归逻辑为:(m_sort的定义为void m_sort(void* arr, int left, int right)) 基础:当right 归纳:求得left和right的中间值mid = (left + right) / 2,将m_sort作用于数组区间[left, mid]和[原创 2012-07-24 17:56:04 · 537 阅读 · 1 评论 -
双连通分量
在无向连通图中,如果删除该图的任何一个结点都不能改变该图的连通性,则称该图是双连通的。双连通无向图一定是连通的,而连通的无向图则不一定是双连通的。对于一个连通的无向图也有双连通分量的概念,定义自然不言而喻。 同样,我们也可以利用tarjan算法求双连通分量。#define N 10000struct Edge{ int to,next;}e[100000];int e原创 2012-08-17 13:36:35 · 873 阅读 · 0 评论 -
强连通分量
对于有向图的一个顶点集,如果从这个顶点集的任何一点出发都可以到达该顶点集的其余各个顶点,那么该顶点集称为该有向图的一个强连通分量。有向连通图的全部顶点组成一个强连通分量。 我们可以利用tarjan算法求强连通分量。#define N 1000struct Edge{ int to,next;}e[100000];int ec,pp[N],n;int dfn[N],l原创 2012-08-17 13:28:15 · 1159 阅读 · 0 评论 -
最大权匹配算法(km)
二分图的最大权匹配就是求所有匹配中权值最大的匹配。char str[105][105];int node[105][105],w[105][105],n,lx[105],ly[105],link[105];bool visx[105],visy[105];bool Find(int a){ visx[a]=true; int j; for(j=1;j<=n;j+原创 2012-08-17 11:41:30 · 1463 阅读 · 0 评论 -
网络流
如果只从网络流的定义来看,它能求解的问题似乎很少,但如果考虑到转换的思想,则很多看起来与网络流丝毫不沾边的问题也能用网络流来解,这也是为什么网络流在ACM比赛中被列为较难题的原因所在。 我这里不打算讨论怎么对一个问题建立网络流模型,说句实在话,我也无从讨论这个。如果将适于用网络流解决的问题看成是一个集合,那么这个集合是趋于无穷的,如果按照某种规则对它们进行分类组成另外一个问题分类集,那么原创 2012-08-17 10:40:40 · 2925 阅读 · 3 评论 -
最小生成树算法
最小生成树算法我只知道两种:Prim和Kruscal。 Prim算法跟Dijkstra算法一样,属于典型的贪心算法(即从局部最优解得到全局最优解)。 下面是Prim算法用于以邻接矩阵保存的图的情况。#define N 1000int edge[N][N],closedge[N],n;bool vis[N];void prim(int s){ int i,j原创 2012-08-17 10:00:21 · 1031 阅读 · 0 评论 -
最短路径算法
先从最简单的入手!图用邻接矩阵保存,算法为Dijkstra单源最短路径算法。#define N 1000#define Inf 9999999int edge[N][N],dist[N],n,vis[N];void dij(int s){ int i,j,k; for(i = 1; i <= n; i++) dist[i] = edge[原创 2012-08-17 09:40:51 · 632 阅读 · 0 评论 -
二分图匹配
二分图匹配是可以转换为网络流求解的,但直接用匈牙利算法求解比转换为网络流求解更高效。 关于二分图有很多公式,比如它与最小顶点覆盖的关系、与最小路径覆盖的关系等等。这里就不进一步讨论了。#define N 1000int n;//二分图左边节点数int m;//二分图右边节点数bool edge[N][N],vis[N];int link[N];bool Find(int原创 2012-08-17 11:28:34 · 762 阅读 · 0 评论 -
字典树
有一个存放英文单词的文本文件,现在需要知道某些给定的单词是否在该文件中存在,若存在,它又出现了多少次? 这样的问题解法有多种,普通青年直接暴力查找,稍文艺点的用map。顺序查找的话,每给定一个单词就得遍历整个字符串数组,时间开销实在太大;如果将所有的单词都存放在一个map中,每次查找的时间复杂度则降为O(log(n))。不得不说,对于一般的应用场景,map足够满足所有需求。 但原创 2012-07-24 23:34:26 · 3460 阅读 · 1 评论 -
通用二分查找
这是极其简单的一个算法,正是因为其简单,我经常被其搞死。不管是在比赛时还是在面试时,我都在这上面栽过跟头。因为其简单,所以总也不愿花过多时间来写它,总想一气呵成,但总也呵不成,于是脑袋越来越混乱,情绪越来越激动,于是悲剧随之而来。 二分查找要求被查找数组是排好序的数组,其时间复杂度为O(log(n)),也就是说1亿的数据量大概运行26次就能求出结果。#include #incl原创 2012-07-24 19:36:30 · 847 阅读 · 2 评论 -
通用快排
在快排中,这样的数组元素被称为枢轴——其前面的元素全都小于它(或大于),其后面的元素全都大于它(或小于)。如此,我们很容易想到,对于一个数组,如果其全部元素都可以被称为枢轴,那么,该数组就是一个已经排序好的数组。 参考代码:#include #include #include static int partition(void* arr, int(*cmp)(void*, v原创 2012-07-24 16:49:31 · 799 阅读 · 1 评论 -
分享一道关于素数的笔试题
题目:请写代码打印10000之内的素数,讲求效率! 说实话,这年代如此这般简单的笔试题还真是不多见了,不过今天被我有幸遇到了!虽然我丝毫也高兴不起来,因为我知道笔试再好,面试那关也难过!不知道是不是点背的关系,每次面试总是感觉良好,事后却总无回音。我从自己身上找呀找呀找原因,找到很多。比如,有项目经验,却无大型项目开发经验,而且项目经验并非多得不得了。 还有就是行业原因,比如,原创 2012-09-14 16:30:12 · 1216 阅读 · 2 评论