当前位置: 首页 > news >正文

算法基础(十三)——随机算法为什么有时主动引入随机性

1. 定位导航

前面已经学习了分治、递归树和主方法。

这些内容都在帮助我们分析算法的运行时间。

接下来进入另一个重要思想:

随机化。

随机化不是为了让算法变得不可控,而是为了避免算法总是被某些固定输入拖入最差路径。

一个典型例子是快速排序。

如果每次都固定选第一个元素作为主元,那么在某些输入下可能表现很差。

但如果每次随机选择主元,输入就很难稳定地“针对”算法。

2. 概念术语

术语定义举例
随机算法执行过程中使用随机选择的算法随机化快速排序
随机化主动引入随机性改变执行路径随机选择主元
确定性算法同样输入下执行路径固定固定选择第一个元素
期望运行时间多次随机运行的平均运行时间平均划分成本
坏输入会触发算法差表现的输入已有序数组对某些快速排序实现不友好
Las Vegas 型结果一定正确,运行时间随机随机化排序
Monte Carlo 型运行时间可控,但结果可能小概率出错部分随机测试

关键澄清:

  1. 随机算法不是随便乱做选择。
  2. 随机性通常只出现在关键决策点。
  3. 很多随机算法结果仍然是正确的,只是运行时间会随机波动。
  4. 分析随机算法时,经常看期望运行时间。

3. 为什么需要随机算法

确定性算法有一个特点:

同样输入下,它永远走同一条执行路径。

这有好处:稳定、可复现。

但也有风险:如果某类输入刚好让这条路径很差,那么算法每次都会很差。

随机算法的思路是:

不让输入完全决定算法路径,而是在算法内部主动加入随机选择。

随机性的作用不是让结果变得混乱,而是让算法不容易被固定输入“卡死”。

4. 确定性算法的问题

假设一个排序算法每次都固定选择第一个元素作为划分点。

如果输入刚好是:

[1, 2, 3, 4, 5, 6, 7]

每次选到的主元都可能导致很不均衡的划分。

这种情况下,递归树可能变得很高,运行时间变差。

确定性策略的问题在于:

只要输入模式固定,坏情况就会稳定重现。

随机化策略则会让主元位置变化。

即使输入固定,执行路径也可能不同,从而降低连续踩中坏划分的概率。

5. 随机性通常加在哪里

随机算法不是在所有地方都随机。

通常只在关键决策点加入随机性。

常见位置包括:

随机位置作用
随机选择主元避免快速排序总选到坏主元
随机打乱输入把输入顺序的影响打散
随机采样用较小样本估计整体情况
随机哈希降低冲突被针对的概率
随机重试避免固定路径失败

这些随机选择的目标都是类似的:

让算法不要过度依赖某个固定输入形态。

6. 动态推演:随机选择主元

下面用动态图看一个简单例子。

假设数组是:

[9, 1, 8, 2, 7, 3, 6]

如果每次都固定选第一个元素,主元就是9

但如果随机选择,主元可能是:

9、7、8、2 ...

这样做的目的不是保证每次都选到最好主元,而是降低每次都选到最差主元的概率。

7. 期望运行时间

随机算法的运行时间可能每次不一样。

所以分析它时,不能只看单次结果,而要看:

多次运行的平均表现。

这就是期望运行时间。

比如某个随机算法运行 10 次,成本分别是:

38, 22, 31, 26, 29, 24, 33, 27, 30, 25

单次结果有波动,但平均值可能比较稳定。

随机算法的分析重点通常是:

期望运行时间是否足够好? 坏情况发生概率是否足够低?

8. 两类随机算法

随机算法常见有两种视角。

8.1 Las Vegas 型

这类算法的特点是:

结果一定正确,但运行时间是随机的。

随机化快速排序可以从这个角度理解。

它最终一定能排好序,但因为主元选择不同,运行时间可能不同。

8.2 Monte Carlo 型

这类算法的特点是:

运行时间通常可控,但结果可能有小概率错误。

这类算法常用于快速测试、近似判断、随机采样等场景。

入门阶段可以先重点理解第一类:结果正确,时间随机。

9. 代码实践:随机选择主元

下面用 Python 演示随机选择主元。

importrandomdefrandomized_partition_demo(nums):arr=nums[:]pivot_index=random.randint(0,len(arr)-1)pivot=arr[pivot_index]less=[]equal=[]greater=[]forxinarr:ifx<pivot:less.append(x)elifx>pivot:greater.append(x)else:equal.append(x)returnpivot,less,equal,greater nums=[9,1,8,2,7,3,6]for_inrange(5):pivot,less,equal,greater=randomized_partition_demo(nums)print(f"pivot={pivot}")print(f"less={less}")print(f"equal={equal}")print(f"greater={greater}")print()

可能输出:

pivot=7 less=[1, 2, 3, 6] equal=[7] greater=[9, 8] pivot=2 less=[1] equal=[2] greater=[9, 8, 7, 3, 6] pivot=8 less=[1, 2, 7, 3, 6] equal=[8] greater=[9]

可以看到,同一个输入,多次运行可能选到不同主元,划分结果也不同。

这就是随机化执行路径的效果。

10. 常见误区

误区一:随机算法就是碰运气

不是。

好的随机算法会明确控制随机发生的位置,并能分析期望表现。

误区二:随机算法结果一定不可靠

不一定。

有些随机算法结果一定正确,只是运行时间随机。

例如随机化排序最终仍然会得到正确有序结果。

误区三:只看一次运行结果

随机算法单次运行可能波动。

要关注多次运行的平均表现,也就是期望运行时间。

误区四:随机越多越好

不是。

随机性也有成本,比如随机数生成、不可复现、调试困难。

真正好的随机化,是少量、关键、可分析的随机化。

11. 现代延伸

随机化思想在现代工程中非常常见。

场景随机化作用
快速排序随机主元降低坏划分概率
哈希表随机哈希降低碰撞被针对概率
负载均衡随机分配请求避免热点
抽样统计用样本估计整体情况
A/B 测试随机分组降低偏差
机器学习随机初始化、随机梯度下降
分布式系统随机退避避免同时重试

例如分布式系统中,如果所有客户端失败后都立刻重试,可能造成雪崩。

加入随机退避后,每个客户端重试时间错开,就能降低瞬时压力。

这也是随机化思想的典型工程应用。

12. 思考题

  1. 为什么随机算法不是“碰运气”?
  2. 随机化快速排序为什么要随机选择主元?
  3. 什么是期望运行时间?
  4. Las Vegas 型随机算法和 Monte Carlo 型随机算法有什么区别?
  5. 在工程系统中,你见过哪些地方使用随机化来降低风险?

13. 本篇小结

本篇主要讲了随机算法的基础思想:

  • 随机算法是在执行过程中主动使用随机选择;
  • 随机性通常用于打散坏输入带来的固定风险;
  • 随机算法不是乱来,而是有目的地降低坏情况概率;
  • 分析随机算法时,经常关注期望运行时间;
  • 有些随机算法结果一定正确,只是运行时间随机;
  • 随机化思想在排序、哈希、负载均衡、机器学习、分布式系统中都很常见。

后面学习随机化快速排序时,要重点抓住一句话:

随机主元不是为了每次都选最好,而是为了不总是选到最差。
http://www.jsqmd.com/news/810239/

相关文章:

  • Anno 1800 Mod Loader终极指南:解锁《纪元1800》无限可能的模组加载神器
  • 2026年昆明短视频运营与GEO全网推广完整指南:本地化获客与AI搜索流量双引擎 - 企业名录优选推荐
  • 为什么92%的Node.js团队在Claude集成中忽略上下文窗口管理?——内存泄漏检测脚本+自动chunking策略开源
  • 基于MCP协议的数据中心选址智能体:从地理空间分析到AI决策
  • 蒸汽发生器十大品牌 2026 工业知名品牌纽克曼排名 - 速递信息
  • 浏览器扩展开发实战:KeepChatGPT会话保持原理与实现
  • SpringBoot项目快速接入Taotoken大模型API的完整配置指南
  • 全球主流电脑代工公司排行:核心实力与场景适配盘点 - 奔跑123
  • 北大:Agent Skills被结构化图谱讲清楚了
  • 解锁Windows文件管理的隐藏力量:FileMeta元数据管理完全指南
  • 工程师创意竞赛全流程策划:从社区激活到公平投票的实战指南
  • 2026 零售验厂生死线:Bon-Ton+Nordstrom+Williams Sonoma 三大巨头标准大 PK
  • 2026年济南婚纱摄影服务能力横向深度测评:5大品牌全维度实测对比 - 速递信息
  • Obsidian OCR:释放图片与PDF中隐藏文字价值的终极指南
  • 2026年5月最新的正规海南注册公司代办机构推荐排名:综合实力与权威资质并重的双优评选 - 华Sir1
  • Simulink Function子系统代码生成避坑指南:从Global配置到多输出端口的指针传递
  • langgragh的state设计;langgragh本地的流程控制机制interrupt();
  • Gemini Pro提示工程进阶:从Prompt注入到可控生成,6个对抗性测试案例揭示安全边界
  • Adobe-GenP 3.0:3步搞定Adobe全家桶免费使用的终极指南
  • OpenAI与微软设380亿美元收入分成上限,或为IPO铺路,还面临竞争与诉讼挑战
  • 全球ODM服务器电脑代工企业实力排行及核心能力解析 - 奔跑123
  • 2026雅思备考:口碑好的线上直播课程怎么选?精选推荐 - 品牌2025
  • 专利数据分析实战:从高通5G专利预测看技术趋势与竞争情报
  • 维普AI率80%来不及处理?嘎嘎降AI几分钟双降AI率和重复率! - 我要发一区
  • [工业互联-7]:从“神经末梢”到“智慧大脑”:工业自动化核心元器件深度解析
  • 苏州亿帆扬环保科技:专业的江苏生产性废旧金属回收公司 - LYL仔仔
  • Cursor AI破解工具终极指南:如何永久免费使用Pro功能
  • 近4小时深度访谈!Google DeepMind科学家姚顺宇分享AI研究见解与职业抉择
  • 微信公众号自动化发布工具:wechat-oa-skill 核心原理与实战
  • 2026年西安图文快印代工:高新技术印刷企业如何破局传统工厂困局 - 年度推荐企业名录