【算法设计与分析】变治法
一、变治法的思想
把解决A问题变成解决B问题/把A问题变成简单A/把A问题的表现形式改变
二、变治法的实例
1. 预排序
把一些问题转换为先排序(nlog2n),然后迅速得解
1.1 检验数组中元素的唯一性
1.2 模式计算
计算哪个数出现的次数最多,可以转换为先排序,然后看连续出现的次数最多的元素
1.3 查找问题
如果先排序,折半查找就会很快
2. AVL树
把一个集合变换为一颗而二叉查找树,平均情况下,查找、插入、删除都为O(logn)
但是最坏的情况下会退回0(n),所以需要调整成平衡情况。
AVL树要求左子树和右子树的高度差不能超过1.
https://www.sohu.com/a/270452030_478315(下图来自此文)
2.1 平衡因子计算
其上的数字表示此点左右子树结点的差,左-右
2.2 如何旋转
所谓左左型,从原理上理解,是因为都在同一边,最顶层的数据是最大的,所以,如果要使其平衡,并且符合二叉树特性,则需要把它的子节点变为头结点,这样比它的和比它小的就都有了,也就平衡了。
我们需要把最大的s点降下来,放在E点的右儿子位,
在E-S中间的数,大于E又小于S,放在s的左儿子位
同理,右右的情况,顶层是最小的数4,要把顶层的右儿子6当父节点,而顶层4变为其左儿子,而顶层右儿子的左儿子5是大于4小于6的,放在换位后的4的右儿子位
2.3 完整包含各种情况的例子
正确的转换结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· Apache Tomcat RCE漏洞复现(CVE-2025-24813)