随机打乱数组算法、蓄水池算法
undefined
1.随机打乱数组(洗牌算法)
分析洗牌算法正确性的准则:产生的结果必须有 n! 种可能,否则就是错误的。这个很好解释,因为一个长度为 n 的数组的全排列就有 n! 种,也就是说打乱结果总共有 n! 种。算法必须能够反映这个事实,才是正确的。
代码:
def shuffleArr(arr):
l = len(arr)
for i in range(l):
rand = random.randint(i,l-1)
arr[i],arr[rand] = arr[rand],arr[i]
print(arr)
arr = [1,2,3,4,5]
shuffleArr(arr)
2.蓄水池算法
应用场景:长度未知的海量数据流中随机等概率抽取一个数据
算法过程:
假设数据序列的规模为n,需要采样的数量的为k。
首先构建一个可容纳k个元素的数组,将序列的前k个元素放入数组中。
然后从第k+1个元素开始,以的概率来决定该元素是否被替换到数组中(数组中的元素被替换的概率是相同的)。 当遍历完所有元素之后,数组中剩下的元素即为所需采取的样本。
证明过程:
对于第i个数()。在k步之前,被选中的概率为1。当走到第k+1步时,被k+1个元素替换的概率 = 个元素被选中的概率 i被选中替换的概率,即为。则被保留的概率为。依次类推,不被k+2个元素替换的概率为。则运行到第n步时,被保留的概率 = 被选中的概率 * 不被替换的概率,即:
对于第j个数()。在第j步被选中的概率为。不被j+1个元素替换的概率为。则运行到第n步时,被保留的概率 = 被选中的概率 不被替换的概率,即: 所以对于其中每个元素,被保留的概率都为.
代码:
import random
def ReservoirSamplingTest(k):
N = 10
pool = [i for i in range(N)]
result = pool[:k]
for i in range(k,N):
r = random.randint(0,i+1)
if r < k:
result[r] = pool[i]
return result
res = ReservoirSamplingTest(4)
print(res)
参考文献:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现