![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
algorithms
文章平均质量分 72
iteye_3185
这个作者很懒,什么都没留下…
展开
-
pku上的数据结构题(转)
数据结构(1)串 (poj1035,poj3080,poj1936)(2)排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299)(3)简单并查集的应用. (4)哈希表和二分查找等高效查找法(数的Hash,串的Hash)(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)(5)哈夫曼树(poj3253)(6)堆 (7)tri...原创 2010-12-09 19:01:27 · 71 阅读 · 0 评论 -
poj 3264 ST算法
RMQ问题,既可以用线段树解决,也可以用ST算法,关于ST算法,这篇文章图文并茂,还有动画演示,讲解非常精彩,一学就会。我就不罗嗦了,直接贴代码。 #include <stdio.h>#define DEBUG#ifdef DEBUG#define debug(...) printf( __VA_ARGS__) #else#define debu...2011-03-17 16:32:45 · 70 阅读 · 0 评论 -
poj 3368 RMQ 线段树 离散化
一 题意:给定递增序列,找出连续出现的最长子序列,然后求出它的长度,即最高频率。注意必须是连续出现。 二 算法:可以事先求出序列中每个数字的最高频率,比如序列(-1,-1,1,1,1,1,3,10,10,10)中各个数字的最高频率为:(-1: 2), (1: 4), (3: 1), (10, 3),对于区间[s,t],仅首部和尾部有可能是从同一个数字中截断的,去掉首尾后的中间部分数字的...2011-03-17 17:00:36 · 111 阅读 · 0 评论 -
poj 2823 线段树
赤裸裸的线段树,数据量很大,加了IO优化函数。 #include <stdio.h>//#define DEBUG#ifdef DEBUG#define debug(...) printf( __VA_ARGS__) #else#define debug(...)#endif#define MIN(a, b) (a) < (b) ?...2011-03-17 18:49:48 · 76 阅读 · 0 评论 -
poj 2774 后缀数组
#include <stdio.h>#include <string.h>#define DEBUG#ifdef DEBUG#define debug(...) printf( __VA_ARGS__) #else#define debug(...)#endif#define maxn 200004#define MI...2011-03-21 17:28:25 · 50 阅读 · 0 评论 -
最长递增子序列
设L = <a1,a2,...an>是n个不同的实数的序列,L的递增子序列是这样一个子序列:Lin = <ak1, ak2, ..., akm>, 其中k1 < k2 < ... < km且ak1 < ak2 < ... < akm。求最大的m,即求最长递增子序列的长度。使用动态规划解决:令f[i] 表示长度为i的递增子序...2011-04-21 14:45:05 · 95 阅读 · 0 评论 -
位运算集锦
文中2'k代表2的k次方 1 除以2的k次幂可以用位运算:n/2'k == n>>k 2 对2的k次幂取余数可以用位运算:n%2'k == n & ((1<<k)-1)比如 100%32100的二进制为 1100100((1<<5)-1)等于31为 0011111两个数相与即得 100,故1...2011-04-21 17:15:37 · 76 阅读 · 0 评论 -
快速排序 顺序统计量 数组分割
#include <stdio.h>#include <string.h>#define N 2578 void swap(int *p, int *q){ int tmp; tmp = *p; *p = *q; *q = tmp;}/* 把a[t]作为参考,将数组分成三部分: 小于等于a[t], * a[t]以...2011-04-21 19:28:45 · 71 阅读 · 0 评论 -
归并排序
#include <stdio.h>#include <string.h>int a[9] = {0,49,38,65,97,76,13,27};int b[9];void merge(int s, int m, int t) { int i, j, k; k = s; for (i = s, j = m+1; i <...2011-04-21 21:51:12 · 64 阅读 · 0 评论 -
poj 1458 最长公共子串(Longest Common Subsequence)
LCS问题:给定序列X = <x1,x2,...,xn>和另一个序列Y = <y1,y2,...,ym> 找两个递增的下标序列<i1, i2, ...ik> 和 <j1, j2, ..., jk>使xi1 == yj1xi2 == yj2......xik == yjk令Z = <xi1, xi2...2011-04-22 10:45:27 · 71 阅读 · 0 评论 -
最大公共子字符串(Longest Common Substring)
Longest Common Substring和Longest Common Subsequence是有区别的X = <a, b, c, f, b, c>Y = <a, b, f, c, a, b>X和Y的Longest Common Sequence为<a, b, c, b>,长度为4X和Y的Longest Common Substring为...2011-04-22 13:33:13 · 268 阅读 · 0 评论 -
实现两个整数的除法,不能用除号和乘号
对于两个整数a和b, 求a/b,可以从1开始枚举结果result,找到满足 result *b <= a的最大result即为所求,这是一种可行的算法,但效率比较低,事实上,枚举result的时候,可以成倍的增加result,找到满足 result * b <= a的最大result,然后把a减去 result * b, 接下来对余数a再次迭代,直到余数a比b小。比如计算2...2011-04-22 15:17:32 · 655 阅读 · 0 评论 -
败者树 多路平衡归并外部排序
一 外部排序的基本思路假设有一个72KB的文件,其中存储了18K个整数,磁盘中物理块的大小为4KB,将文件分成18组,每组刚好4KB。首先通过18次内部排序,把18组数据排好序,得到初始的18个归并段R1~R18,每个归并段有1024个整数。然后对这18个归并段使用4路平衡归并排序:第1次归并:产生5个归并段R11 R12 R13 R14 R15其中...2011-04-25 21:52:29 · 529 阅读 · 0 评论 -
kmp算法的理解与实现
KMP算法曾被我戏称为看毛片算法,当时笑喷......大三那个时候硬着头皮把算法导论的kmp算法啃完,弄懂了kmp算法的原理,甚至还写出了代码,这几天再次温习的时候,发现忘得比较彻底。我总结,学算法不能只对着书本学理论,而应该用自己的理解去看清算法的本质,最好用文字把你的理解记录下来,这样才能做到活学活用,而且不容易忘。写这篇博客就是想把自己这几天的思路记下来。 一 kmp...2011-04-30 21:29:19 · 167 阅读 · 0 评论 -
寻找最大的K个数 (C语言实现)
题目:100亿个整数,求最大的1万个数,并说出算法的时间复杂度 算法:如果把100亿个数全部读入内存,需要100 0000 0000 * 4B 大约40G的内存,这显然是不现实的。我们可以在内存中维护一个大小为10000的最小堆,每次从文件读一个数,与最小堆的堆顶元素比较,若比堆顶元素大,则替换掉堆顶元素,然后调整堆。最后剩下的堆内元素即为最大的1万个数,算法复杂度为O(NlogN...2011-05-04 16:31:16 · 215 阅读 · 0 评论 -
从海量数据中找中位数(c语言实现)
题目:5亿个int,从中找出第k大的数 算法:之后补上。。。 实现: #include <assert.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd....2011-05-05 12:49:39 · 1409 阅读 · 0 评论 -
现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数...
现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数。 算法:充分利用出现次数超过一半这个特点,使用两个变量candidate和vote,分别代表候选人和票数,遍历数组按如下方式投票和更换候选人: 若当前数与候选人一样,则把候选人的票数加1若当前数与候选人不一样, 则把它的票数减1,如果减掉后票数小于0,则把候选人踢掉,用当前数作为新的候...2011-05-05 19:43:37 · 441 阅读 · 0 评论 -
编程之美3.1 字符串移位包含的问题
题目给定两个字符串 s1 和 s2, 要求判定 s2 是否能够被通过 s1 作循环移位 ( rotate )得到的字符串包含. 例如, 给定 s1 = AABCD 和 s2 = CDAA, 返回 true; 给定s1 = ABCD 和 s2 = ACBD, 返回 false. 解法1直接模拟, 对 s1 进行循环移位, 在判断字符串 s2 是否在移位后的字符串中....原创 2012-03-12 23:26:14 · 160 阅读 · 0 评论 -
poj 3264 RMQ 线段树
zkw式线段树解决RMQ问题,只需查询,不用更新,很简单,ps: 为什么C++比gcc快那么多啊?gcc提交3047ms,用C++的话,只需1329ms。 #include <stdio.h>#define DEBUG#ifdef DEBUG#define debug(...) printf( __VA_ARGS__) #else#define ...2011-03-16 21:22:07 · 63 阅读 · 0 评论 -
poj 2777 线段树
至多有30种颜色,要求某个区间段有多少种不同的颜色,很容易想到用1个位表示一种颜色,最后二进制的或运算一下子就求出了颜色的种数。 跟poj 3468一样,要支持区间的修改和区间的查询,但我始终没有想到如何用zkw式的线段树的解决办法,貌似这个题目只能自顶向下查询,所以只好用朴素的线段树,为了把更新操作的复杂度变成O(log n),要引入一个标记,表示这条线段的所有子线段都被刷成...2011-03-16 18:58:27 · 70 阅读 · 0 评论 -
算法导论习题 5.1 -2
描述random(a, b)过程的一种实现,它只调用random(0,1)。作为a和b的函数,你的程序期望运行时间是多少? 算法描述这个题目相当于在能随机生成0,1的前提下,要求生成[0, 1, ...,n-1]范围内的一个整数1 求出最小的 m,使2^m >= n-12 通过random(0,1),产生一个m比特的整数,这样能随机产生[0, 2^m-1]内的整数,若产生的整...2011-09-29 09:23:22 · 134 阅读 · 0 评论 -
(转)一致性哈希算法及其在分布式系统中的应用
原文地址: http://www.cnblogs.com/leoo2sk/archive/2011/08/11/consistent-hashing-intro.html Consistent hashing算法非常简洁,如果你有一系列服务器,需要把很多 keys (objects)映射到这些服务器上。这时Constent hashing就派上用场了。典型的例子包括 memcached...2011-09-29 19:02:59 · 131 阅读 · 0 评论 -
SkipList 跳表
为什么选择跳表目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。 想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树出来吗? 很难吧,这需要时间,要考虑很多细节,要参考一堆算法与数据结构之类的树,还要参考网上的代码,相当麻烦。 用跳表吧,跳表是一种随机化的数据结构,目前开源软件 Redis 和 L...2011-10-09 01:08:17 · 1211 阅读 · 0 评论 -
poj 2195 km算法求最佳匹配
#include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>//#define DEBUG#ifdef DEBUG#define debug(...) printf( __VA_ARGS__) #else#defin...原创 2011-03-07 16:58:23 · 115 阅读 · 0 评论 -
poj 3469 isap算法求最大流
#include <stdio.h>#include <string.h>#define DEBUG#ifdef DEBUG#define debug(...) printf( __VA_ARGS__) #else#define debug(...)#endif#define N 20010#define M 18000...原创 2011-03-07 17:06:22 · 102 阅读 · 0 评论 -
poj 1273 dinic算法求最大流
#include <stdio.h>#include <string.h>//#define DEBUG#ifdef DEBUG#define debug(...) printf( __VA_ARGS__) #else#define debug(...)#endif#define N 201#define MAXQSIZ...原创 2011-03-07 17:15:00 · 94 阅读 · 0 评论 -
poj 1459 push-relabel算法求最大流
#include <stdio.h>#include <string.h>#define DEBUG#ifdef DEBUG#define debug(...) printf( __VA_ARGS__) #else#define debug(...)#endif#define N 102#define MAX_INT 2...原创 2011-03-07 17:22:27 · 286 阅读 · 0 评论 -
poj 1521 huffman算法求最小编码
#include <stdio.h>#include <string.h>//#define DEBUG#ifdef DEBUG#define debug(...) printf( __VA_ARGS__) #else#define debug(...)#endif#define MAX 256typedef str...原创 2011-03-07 17:24:46 · 127 阅读 · 0 评论 -
递归求N皇后问题
#include <stdio.h>#include <string.h>char pos[300]; /* pos[i] = j表示第i行上的皇后放在第j列 */int n;int count;/* 寻找第i行的皇后可以放的位置,不能放则令pos[row]等于-1 */void find (int row){ int ...原创 2011-03-07 17:30:16 · 96 阅读 · 0 评论 -
poj 1011 dfs+剪枝
#include <stdio.h>#include <stdlib.h>#include <string.h>#define DEBUG#ifdef DEBUG#define debug(...) printf( __VA_ARGS__) #else#define debug(...)#endifint ...原创 2011-03-07 17:34:06 · 79 阅读 · 0 评论 -
poj 2513 trie + 并查集 + 欧拉通路
#include <stdio.h>#include <string.h>//#define DEBUG#ifdef DEBUG#define debug(...) printf( __VA_ARGS__) #else#define debug(...)#endif#define M 530001#define N 50...原创 2011-03-08 20:26:43 · 90 阅读 · 0 评论 -
一些常用的算法
char *str_cpy(char *dest, char *src){ char *tmp = dest; while ((*dest++ = *src++) != '\0'); return tmp;} /* 二分查找,在位置s和t之间查找元素e, * 若找到返回e在数组A中的位置,找不到返回-1 */int bsearch(int ...原创 2011-03-09 10:43:41 · 68 阅读 · 0 评论 -
poj 2002 二分查找,hash
算法过程:1 将顶点按x坐标递增排序,若x相同,按y坐标递增排序,然后枚举所有边,对每一条由点p1和p2(根据排序p1 < p2)组成的边按照如下方式可唯一确定一个正方形: 1) 将边绕p1逆时针旋转90度得到点p3 2) 将边绕p2顺时针旋转90度得到点p4则p1 p2 p3 p4组成一个正方形,设p1 = (x1,y1), p2 = (x2, y2),根据向量...2011-03-09 20:57:01 · 121 阅读 · 0 评论 -
poj 2418 trie树统计单词出现的个数
一 题意:输入很多棵树(单词),统计每种树所占的百分比 二 算法:用trie树轻松解决,trie树的典型应用就是统计单词出现的个数。 三 代码如下,ps:清华大学《数据结构-C语言版》的trie树实现很傻逼,我不知道它如何解决前缀字符串的问题,比如统计aaa和aaabb的出现次数 #include <stdio.h>#include <string...2011-03-10 16:57:02 · 222 阅读 · 0 评论 -
poj 3468 线段树朴素递归解法
一 题意给定一个数组A,定义Add(s, t, d)的操作为对A[s]...A[t]加d,定义Query(s, t)的操作为查询A[s] + ... + A[t]的值 二 算法在一系列Query操作中,如果每次查询都把A[s]...A[t]加一次,那么要执行加法(t-s+1)次,算法复杂度为O(t-s+1),用线段树,令线段<x, y>保存A[x]...A[y...2011-03-11 16:17:25 · 77 阅读 · 0 评论 -
poj 3468 非递归的zkw式线段树解法
关于zkw式线段树,请参考zkw大牛的ppt--百度文库《统计的力量》,其特点是利用完全二叉树数组存储的特点,自底向上遍历节点,非递归地完成查询和更新,加上位操作的使用,可以提高程序的效率。ps:__int64比long long的效率高很多。#include <stdio.h>//#define DEBUG#ifdef DEBUG#define debug(....2011-03-14 21:01:38 · 113 阅读 · 0 评论 -
poj 3468 树状数组解法
一 算法 树状数组天生用来动态维护数组前缀和,其特点是每次更新一个元素的值,查询只能查数组的前缀和,但这个题目求的是某一区间的数组和,而且要支持批量更新某一区间内元素的值,怎么办呢?实际上,还是可以把问题转化为求数组的前缀和。 首先,看更新操作update(s, t, d)把区间A[s]...A[t]都增加d,我们引入一个数组delta[i],表示A[...2011-03-14 21:32:19 · 267 阅读 · 1 评论 -
Paxos算法
分布式系统的核心问题是数据一致性,解决一致性有很多算法,而 Paxos 算法无疑是最著名的,Google 工程师曾说,所有一致性算法都可以归结为 Paxos 算法的一个特列。可见,很有必要学习 Paxos 算法。 Paxos 算法是由 Lamport 提出来的,他得论文 Paxos made simple 是最好的学习资料。我在阅读的过程中遇到很多困难,文中的一些逻辑推论隐藏得...2012-04-18 10:59:10 · 102 阅读 · 0 评论