摘要: 此经典算法收录于TAOCP中,但高大爷只给出算法步骤没给出证明,这里将详细定义并做证明 定义: 从N个记录中随机选择n个记录,但一开始并不知道N为多少。 算法: 1. 选择抽样算法: 可顺序扫描N个记录,对第t+1个记录以概率(n-m)/(N-t)来选择(m为已选得的记录数),但这样做必须事先顺序扫描一遍文件以获得N的大小。 2. 水库抽样算法: 2.1... 阅读全文
posted @ 2011-11-15 11:03 Allen Sun 阅读(3035) 评论(0) 推荐(0) 编辑
摘要: 布隆过滤器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。在垃圾邮件过滤的黑白名单方法、爬虫(Crawler)的网址判重模块中等等经常被用到。哈希表也能用于判断元素是否在集合中,但是布隆过滤器只需要哈希表的1/8或1/4的空间复杂度就能完成同样的问题。布隆过滤器可以插入元... 阅读全文
posted @ 2011-02-16 23:19 Allen Sun 阅读(58960) 评论(14) 推荐(24) 编辑
摘要: 由于Python功能强大并且各种应用程序库十分丰富,它常常可以以一种简单的方式来完成C/C++比较难实现的功能。Python/C API可以使得C/C++程序员在他们的程序中嵌入Python程序,使得开发的灵活性和简易性大大提高。在这里我以python 2.5版本举一个小例子来简单讲述一下Python/C API的用法,如果大家有兴趣可以参见官方文档来深入学习: http://docs.pyth... 阅读全文
posted @ 2011-02-04 00:33 Allen Sun 阅读(7281) 评论(0) 推荐(0) 编辑
摘要: 模幂运算常常作为一些算法的中间求解步骤,算法的思路十分巧妙并且高效。模幂运算的描述如下:     已知b, e, m, 求c。形如:         其中,bm (若bm,可转换b为b%=m)     算法一:最显而易见的办法就是先求幂,再取模。例如 ,得到 c = 445。 。 注意到b=4为1位,e=13为2位,m=497为3位,c=445为3位,但是 为8位。这很可能造成溢出... 阅读全文
posted @ 2011-01-30 13:06 Allen Sun 阅读(6646) 评论(0) 推荐(0) 编辑
摘要: Fermat定理: 如果P是任意一个不能整除整数a的素数,则 之后我会展示一些用到这一经典定理的算法。例如:, 等等证明:考虑a的倍数: (1) 证明这些整数中任意两个都不能模p同余。 反证法:假设 ,即 这不可能,因为p为素数且s-rp,p不能整除a,所以p不可能是(s-r)a的因子。得证结论。(2) 证明这些数中没有一个能和0同余。 证明:因为1, …, (p-1)都小于p,且p为素数,p不能整除a,因此p不能整除 。(3) , 当且仅当d为素数,则 或 由(1)和(2)可得, 必须对应于余数1, 2, 3, …, (p-1)。根据同余式乘法性质可得: 由(3)可知,因为k不 阅读全文
posted @ 2011-01-28 00:54 Allen Sun 阅读(2397) 评论(0) 推荐(1) 编辑
摘要: Fibonacci数大家一定很熟悉了: Fibonacci质数的定义: 若某Fibonacci数与任何比它小的Fibonacci数互质,那么它就是Fibonacci质数。但是哪些的Fibonacci数才是Fibonacci质数呢?这里先给出结论: 1. F(3)和F(4)是Fibonacci质数;从F(5)开始,某项为Fibonacci质数当且仅当它的项数为质数 2. 第k小的Fibonacci质数是以质数数列中的第k个数为项数的Fibonacci数( 除F(3)和F(4)之外 )证明如下:证明任何与“互质”有关的问题,可以从余数入手,因此考察所有数除以M(M任意)的余数所组成的序列 : 所有 阅读全文
posted @ 2011-01-27 15:36 Allen Sun 阅读(3747) 评论(0) 推荐(0) 编辑
摘要: 某日,老师在课堂上想考考学生们的智商,就问一个男孩: “树上有十只鸟,开枪打死一只,还剩几只?” 男孩反问:“是无声手*枪,还是其他没有声音的枪么?” “不是.” “枪声有多大?” “80~100分贝.” “那就是说会震的耳朵疼?” “是.” “在这个城市里打鸟犯不犯法?” ‘不犯.” “您确定那只鸟真的被打死啦?” “确定.”老师已经不耐烦了,”拜托,你告诉我还剩几只就行了,OK?” “OK.鸟... 阅读全文
posted @ 2010-11-29 19:12 Allen Sun 阅读(709) 评论(0) 推荐(1) 编辑
摘要:   http://poj.org/problem?id=3750   方法: 1012类似,但稍复杂 约瑟夫环问题:三个参数————人数n,开始人的号start,数到step出队一人 此问题一般有两种形式(这里都给了实现) 1、求出队顺序:利用数组或循环链表模拟出队过程,复杂度为O(step*n)      技巧:循环链表实现时... 阅读全文
posted @ 2010-11-09 20:06 Allen Sun 阅读(812) 评论(0) 推荐(0) 编辑
摘要:   http://poj.org/problem?id=3748   方法: 给定16进制32bit数,将其第x位置0,第y位开始的三位置成110 注意考虑待置位数中有a~f的情况   Description 假设你工作在一个32位的机器上,你需要将某一个外设寄存器的第X位设置成0(最低位为第0位,最高位为第31位),将第Y位开始的连续三位设置成110(... 阅读全文
posted @ 2010-11-09 20:01 Allen Sun 阅读(516) 评论(0) 推荐(0) 编辑
摘要:   http://poj.org/problem?id=3630   方法一: 利用Trie可以很好的解决此类前缀问题。它有一个很大的好处就是可以边插入边判断是否是前缀。 由于号码只由0~9组合,因此Trie的数组分支也为10个,即son[10](就像当英文字典时为son[26])。 一般而言Trie的节点都在需要时被new出来,但这样无疑会浪费太多的时间。因此我们可以... 阅读全文
posted @ 2010-11-08 19:59 Allen Sun 阅读(419) 评论(0) 推荐(0) 编辑