《大数据算法》一2.5 串相等判定算法

本节书摘来华章计算机《大数据算法》一书中的第2章 ,第2.5节,王宏志 编著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.5 串相等判定算法

本节讨论一个通信亚线性算法问题,因为在很多情况下,数据传输时间和数据量大致成正比,因而将通信亚线性算法归到本章讨论。
在现实中会有这样的问题,假设A公司总部有一个庞大的数据库,而在分公司B处保存这个数据库的副本,为了数据库的一致性,要定期地比较数据。这就涉及串相等判定问题。
串相等判定问题
输入:串s1和s2。
输出:如果s1=s2输出“是”,如果s1≠s2输出“否”。
很显然,任何一致性检测都要求发送所有n位数据,否则,无法检测未发送位置的错误。但是,对于庞大的数据库,n可能非常大,传输全部n位几乎不可能。
设将s1中的n位数据表示为(a1,…,an),s2中的n位数据表示为(b1,…,bn),一个可能的方法是随机选一些位,然后对随机选择的位进行判断。这样做的问题在于,如果产生的错误在总的串中比例很小(比如仅有一个错误),则这种方法将失效。因而需要具有全局性的方法。
基本想法是为两个字符串制作指纹来体现字符串的全局特征,即我们将数据看成n位的整数a和b,image,定义指纹函数(p为素数):Fp(x)=x mod p。
算法是随机选取素数p,检测Fp(a)=Fp(b)是否成立。
下面讨论p的选取对算法的影响。
根据这个算法,在计算过程中,需要比较的数字最大不超过p,因而需要传输logp位,而不是n位。考虑到传输效率的问题,希望选择一个较小的p。
下面讨论算法的误判概率,在a和b不等且都与p同余的情况下会发生假阳性的误判。
设c =a-b,也就是,当a≠b且c整除p时发生误判。由于c≤2n,c的素因子至多有n个。给定一个p,通过素数定理,大概有p/ln(p)个小于p的素数,此时出错的概率是nlnp/p。
根据上述讨论,现在我们想选择一个素数p,这个数字要足够大以确保有足够多小于p的素数,同时这个数字又要足够小以确保高效的通信。
取p=2n2ln(n)(取这个数是为了计算方便,但这样的p可能不是一个整数,在实际实现中可以取p是一个大于2n2ln(n)但和2n2ln(n)最接近的素数),代入出错概率公式,发生错误的概率不超过2/n,在这种情况下需要传输的位数为O(logn)。
习题
2.1 证明2.1.3节中生成的多边形PA和PB包含点的个数为O(n)。
2.2 为了保障航运安全,旅客不允许携带危险品乘坐飞机,因此在旅客登机前需要由安检人员检测旅客是否携带危险物品。假设共有n名旅客需要登机,用o(n)时间近似判断这n名旅客是否有人携带危险品。
2.3 在输入的正文串(长度为n)中查找某一字符是否出现,若出现,输出1,否则输出0。设计时间复杂度为o(n)的算法求解这个问题。
2.4 miRNA(微小RNA)在生命活动中具有重要功能,由约21个碱基构成,比如AUGUCCUCCUUAUGCCUAUGC可能就是一条miRNA。如果我们想知道细胞内有没有感兴趣的miRNA,可以通过测序解决。测序结果可能是n个21碱基的序列。设计时间复杂度为o(n)的算法,给定包含n个测序结果的集合S(n条序列)和感兴趣的miRNA序列l,判定S是否包含l。
2.5 一幅二值图(有n个像素)仅由0和1组成,设计时间复杂度为o(n)的算法,判断该图的黑色(1)和白色(0)是否各占一半。
2.6 设计亚线性算法检查两个字符串是否相同。
2.7 设计时间复杂度为o(n)的算法,判断一个包含n个数的数组是否有相同的数字。
2.8 设计时间复杂度为o(n)的算法,判定输入规模为n的0,1数组中,是否正好有k(k≤n)个0。
2.9 设计时间复杂度为o(n)的算法,判定一个长度为n的0,1数组是否为0,1交替的循环数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值