闲话:随机 Hash
随机 Hash:堆叠必要条件#
如果我们有一种方法来检验某个对象的某个性质,当对象满足这个性质的时候,这个方法必然能使该对象通过检验;否则这个方法会使该对象以 的概率通过检验。那么我们将得到一个极可能正确的检验方法:连续使用前述方法检验该对象足够多次。误通过检验的概率 将随检验次数 的提升而迅速降低,因此我们的方法是极可能正确的。
当然,我们不能无限制地提升检验次数,这会让我们的检验速度变低。那么,我们应该怎样选择检验次数,才能使 错误率 被控制到一个可以接受的范围内?
怎样的错误率是可以被接受的?#
不难发现,可以被接受的错误率与实验次数 有关。在具体的题目中,我们几乎要在每一次实验中都不误判,除此之外的结果都难以接受。因此, 越大,可以被接受的错误率就越小。
下面是当错误率 和实验次数 在某个量级的时候,通过所有实验的正确率表格。(即通过所有实验不报错的概率)
单次错误率 () / 实验次数 () | ||||
---|---|---|---|---|
这里的实验次数一般要考虑到数据组数或者测试点数量(毕竟我们不想在 CF 中 WA 哪怕一个点对吧?)。
如果对单次正确率有自信,可以直接使用伯努利不等式:
该不等式表明当我们足够悲观(直接认为错误率为单次错误率乘实验次数)时,正确率也是有保障的。
当单次错误率在 ( 看上去不错,但是接近 的错误率不够小)的时候,我们的总体正确率都是非常乐观的,因为几乎没有题目会实验 次。
当单次错误率较高的时候,我们有几乎没有代价的降低错误率方法:重复随机。选取合适的重复随机次数,将单次错误率维持在 级别,我们就可以认为这是可以接受的错误概率。
具体的错误率分析#
Sum Hash 一例:QOJ 5254 Differences#
考虑答案串,其它每个字符串都和它有 个相同的字符。必要条件呼之欲出:和该字符串相同的位恰有 个。
进一步地,给每个字符串随机赋权 。枚举答案串的每一位,统计这一位和答案串相同的串的权值和。那么,仅当权值和为 时,答案串合法。
考虑分析错误率。当某一种权值 并非出现了 次时,考虑固定其余的 不变,值域内至多只有 种 会使得它和 相等,因此错误率可以近似看作 。
Sum Hash 一例:CF 1746F Kazaee#
给每种数赋随机权值然后检验区间和是否是 的倍数。此处值域可看作 ,那么当随机权值取遍 的时候,固定其余的随机权值不变,类似的分析可以分析出:错误率至多 (当 的时候达到最高)。
此时需要将随机次数提升到 次左右( 左右的错误率)。
Xor Hash 一例:CSP 2022 星战#
前面的部分略去。
首先不难分析出按位独立。然后,每一位非法时错误率约 (套用 Sum Hash 时的分析方法:固定其余不变,改变钦定的关键元素的权值),因此错误率为 ,其中 为向量长度。
Xor Hash 另一例:Dzy loves Chinese#
这里我们需要把随机权值当成 使用并插入进线性基里。这要求我们每次取样的大小必须远小于向量位长。我们认为一次错误是误把线性无关组判断为线性相关组,即插进线性基失败了。
如果我们的向量长度为 ,每一位均匀取 ,那么我们可以近似估计错误率:第 个向量插入时已经有 位有主元,从而有 的概率被前 个向量线性表出(考虑将有主元的位消成 ,此时只有 的概率满足整个数就是 ;其它情况下可以找到一位作为主元)。
因此,正确率为 ,其中 是取样大小。这也和蒙特卡洛方法得出的结果大致吻合。
作者:Meatherm
出处:https://www.cnblogs.com/Meatherm/p/18301654
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步