【算法设计与分析】变治法
一、变治法的思想
把解决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 完整包含各种情况的例子
正确的转换结果: