2023.8.27 闲话
给两个正整数 \(n,v\),随机生成长度为 \(n\) 的处于 \([1,v]\cap\Z\) 内的元素不重的序列 .
怎么做呢?哦哦首先拒绝采样我们是非常会的,每次不断随机直到和以前都不同,这样不难证明是均匀随机 . 那么算一下复杂度吧,期望是概率的倒数,那么每次选一下成功的概率就是 \(p=\frac{v-n+1}v\),所以期望次数就是 \(O(\frac 1p)=O(\frac {v}{v-n+1})\) .
令 \(k=\frac{v}{n-1}\),那么复杂度可以改成 \(O(\frac k{k-1})\),选 \(n\) 次就是 \(O(\frac{nk}{k-1})\) .
这个算法的问题在于如果 \(k\) 非常小的话(\(n=v\))这个就成 \(O(n^2)\) 这种量级了,还是不太能接受的 .
考虑对于 \(k\) 比较小的情况有没有什么好做法,注意到最朴素的想法就是给整个值域 shuffle 出来暴力取前 \(n\) 个,这样就是 \(O(v+n)\) 的了,那么想一下怎么平衡 .
直接解 \(v+n=kn\le \frac{nk}{k-1}\) 可以得到的是 \(0<k\le 2\),那么以 \(2\) 为阈值分治即可,最后可以得到的是复杂度为 \(O(n)\),非常优秀啊 .
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/17652862.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ