随笔分类 -  算法

Hadoop分布式环境下的数据抽样(转)
摘要:http://dongxicheng.org/data-mining/hadoop-sampling/1. 问题由来Google曾经有一道非常经典的面试题:给你一个长度为N的链表。N很大,但你不知道N有多大。你的任务是从这N个元素中随机取出k个元素。你只能遍历这个链表一次。你的算法必须保证取出的元素恰好有k个,且它们是完全随机的(出现概率均等)?这道题的解法非常多,网上讨论也非常热烈。本文要讨论的是,这个问题是从何而来,有什么实用价值?自从有了Hadoop之后,该问题便有了新的应用载体。随着数据量的增多,很多数据挖掘算法被转移到MapReduce上实现,而数据挖掘中有个基 本的问题是怎样对数据 阅读全文

posted @ 2012-05-24 10:04 buptLizer 阅读(555) 评论(0) 推荐(0) 编辑

欧拉回路
摘要:欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次,称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。判断欧拉路是否存在的方法有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。判断欧拉回路是否存在的方法有向图:图连通,所有的顶点出度=入度。无向图:图连通,所有顶点都是偶数度。程序实现一般是如下过程:1.利用并查集判断图是否连通,即判断p[i] < 0的个数,如果大于1,说明不连通。2.根据出度入度个数,判断是否满足要求。3.利用dfs 阅读全文

posted @ 2012-04-15 15:54 buptLizer 阅读(16968) 评论(3) 推荐(7) 编辑

Reservoir Sampling
摘要:Reservoir Sampling:从N个数中随机抽取k个元素,保证每个元素被选中的概率相等,N不知道有多大。分析:这个问题称为蓄水池抽样,经典方法:Init : a reservoir with the size: kfor(int i = k + 1; i <= N; ++i){ m = random(1, i); if(k >= m) swap the mth value with the ith value;}这个每个元素被选择的概率为k/N,证明网上很多。简单证明:假设现在从第i+1个选择下一个元素,现证明每一个元素被选中的概率为k/(i + 1)。对于第i + 1 个 阅读全文

posted @ 2012-04-08 10:57 buptLizer 阅读(2783) 评论(0) 推荐(0) 编辑

poj2002 poj3432 正方形个数 (hash,二分)
摘要:给出一堆点,求其中正方形的个数。题目很简单,如果枚举,复杂度为O(n^4),肯定超时,我们利用hash,或者二分来降低复杂度,枚举其中的两个点,然后利用正方形的性质求出其余的两个点,然后判断这两个点是否都存在,如果存在,说明可以组成一个正方形。判断的方式利用hash或者二分都可以,这个题目用的hash,poj3432用的二分。下面的问题就是给出两个点,如何求出其余的两个顶点。给出两个点(a1,a2),(b1,b2),我们得到其余两个顶点为(a1+(b2-a2),a2-(b1-a1)),(b1+(b2-a2),b2-(b1-a1)),或者(a1-(b2-a2), a2+(b1-a1)),( b1 阅读全文

posted @ 2011-12-03 16:58 buptLizer 阅读(1089) 评论(0) 推荐(0) 编辑

poj3320 快排离散
摘要:题目要求求出包含所有ideas的最段序列,如果整数的范围很小的话就简单了,但是这个题目中idea可能很大,因此无法直接用数的大小对应下标所以必须离散化才可以,因为数一共有1000000,所以最大编号最大为1000000,利用快排离散。m[i]为原始数据,s[i]为压缩后每个idea对应的编号,index[i]为每个编号出现的下标,其实这个题就是之前遇到的那个求包含给定字符集的最短子串是一个问题,只是这个题目多了一个离散。源代码:#include <iostream>#include <algorithm>#include <stdio.h>using nam 阅读全文

posted @ 2011-09-25 12:32 buptLizer 阅读(440) 评论(0) 推荐(0) 编辑

poj1804逆序数
摘要:冒泡求逆序数View Code #include <iostream>#include <stdio.h>using namespace std;const int N=1001;int m[N],s[N];int main(){ int t,n,i,j,sstep,mstep,tmp,cnt=1; bool flag=false; scanf("%d",&t); while(0 <= --t) { scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d&qu 阅读全文

posted @ 2011-09-23 10:51 buptLizer 阅读(201) 评论(0) 推荐(0) 编辑

poj3368 RMQ
摘要:题目大意说给出一系列数,这列数是不降的,然后任意给出一个区间[i,j],让你求出那个重复次数最多的数的出现次数。由于给出的查询次数很多,我就考虑用RMQ来解,但是这个不能直接套用模板,因为加入我们对区间[i,j]进行查询,如果从k处分开取两边区间的最大的重复次数是不一定正确的,因为分开的那个地方可能把实际重复次数最多的那个数一分为二,这样求出的就不是最大的了,所以只需要多加一个判断,从分开出往左往右循环找到最大的重复次数,看这个数是否大于我们当前得到的那个数(这个数是取左右区间的最大值)。代码如下:#include <iostream>#include <cmath># 阅读全文

posted @ 2011-09-17 18:04 buptLizer 阅读(1105) 评论(0) 推荐(0) 编辑

poj2452 Sticks Problem RMQ问题
摘要:题目大意说:给出一系列的木棒的长度,求出一个最大的区间[x,y],满足所有的len[k]>len[i] && len[k]<len[j] ,i<=k<=j。我看的题目分类说这个题目用RMQ,所有就用了RMQ实现,由于开始的时候我是枚举的所有的区间,所以肯定超时,后来改为从i找出以i开始的最大区间范围,然后在这个范围内求出最大值的下标j,那么j就是从i开始的所有>i且<j的最大区间,枚举采用二分,这样时间复杂度为O(nlogn).#include <iostream>#include <stdio.h>#include 阅读全文

posted @ 2011-09-17 12:01 buptLizer 阅读(351) 评论(0) 推荐(0) 编辑

博弈小结
摘要:这几天一直再看博弈的东西,现在按照自己的理解总结一下:首先需要明白的是必胜态和必败态的理论:1所有的末状态为必败态;2从P状态只能转移到必胜态N;3从N从能找到一个转移使其到P状态。下面将的所有的定理结论都是基于这三条的,所以应该好好理解。一、博弈论基础知识1巴什博弈(bash game)一堆含有n个石子游戏,每次只能去1..m个,问先手是必胜还是必败,这个很简单,只需要判断n%(1+m)就行了。2威佐夫博弈有两堆石子,每次要么从一堆中取出任意一个,要么从两堆中取走相同数量的石子,先取光着为胜,为先手是否必胜,这个用到了一个结论,就是奇异和非奇异局势。一个奇异局势不管怎么转移都转换为非奇异的, 阅读全文

posted @ 2011-09-02 11:47 buptLizer 阅读(247) 评论(0) 推荐(0) 编辑

博弈 取石子
摘要:题目链接:http://acm.bupt.edu.cn/onlinejudge/newoj/showProblem/show_problem.php?problem_id=65Description champ最近在和dalong玩一个取石子游戏,游戏规则很简单:有三堆石子,两人轮流取,每次任选两堆石子,然后从一堆中取走x(x>=1)个石子,另一堆中取走2*x个石子,最后不能取者输掉游戏,champ每一次都先取。 现在,champ告诉你初始三堆石子的数量,他想知道,自己是否有必胜的策略。你可以假定champ和dalong都足够聪明,每次都会选择最优的策略。Input多组测试数据每行3个正 阅读全文

posted @ 2011-09-02 11:12 buptLizer 阅读(433) 评论(0) 推荐(0) 编辑

导航