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)\),非常优秀啊 .

posted @ 2023-08-27 06:48  Jijidawang  阅读(104)  评论(3编辑  收藏  举报
😅​