2023.8.27 闲话

给两个正整数 n,v,随机生成长度为 n 的处于 [1,v]Z 内的元素不重的序列 .

怎么做呢?哦哦首先拒绝采样我们是非常会的,每次不断随机直到和以前都不同,这样不难证明是均匀随机 . 那么算一下复杂度吧,期望是概率的倒数,那么每次选一下成功的概率就是 p=vn+1v,所以期望次数就是 O(1p)=O(vvn+1) .

k=vn1,那么复杂度可以改成 O(kk1),选 n 次就是 O(nkk1) .

这个算法的问题在于如果 k 非常小的话(n=v)这个就成 O(n2) 这种量级了,还是不太能接受的 .

考虑对于 k 比较小的情况有没有什么好做法,注意到最朴素的想法就是给整个值域 shuffle 出来暴力取前 n 个,这样就是 O(v+n) 的了,那么想一下怎么平衡 .

直接解 v+n=knnkk1 可以得到的是 0<k2,那么以 2 为阈值分治即可,最后可以得到的是复杂度为 O(n),非常优秀啊 .

posted @   yspm  阅读(104)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
😅​
点击右上角即可分享
微信分享提示