【算法设计与分析】变治法

一、变治法的思想

把解决A问题变成解决B问题/把A问题变成简单A/把A问题的表现形式改变

 

 二、变治法的实例

    1. 预排序

    把一些问题转换为先排序(nlog2n),然后迅速得解

       1.1 检验数组中元素的唯一性

 

 

 

 

 

 1.2 模式计算

      计算哪个数出现的次数最多,可以转换为先排序,然后看连续出现的次数最多的元素

 

 1.3 查找问题 

    如果先排序,折半查找就会很快

 2. AVL树

把一个集合变换为一颗而二叉查找树,平均情况下,查找、插入、删除都为O(logn)

但是最坏的情况下会退回0(n),所以需要调整成平衡情况。

AVL树要求左子树和右子树的高度差不能超过1.

 

参考文章:https://blog.csdn.net/zxnsirius/article/details/52137704?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

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 完整包含各种情况的例子

 

正确的转换结果:

 

 

posted @   SeasonBubble  阅读(1017)  评论(0编辑  收藏  举报
编辑推荐:
· 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)
点击右上角即可分享
微信分享提示