当前课程知识点:数据结构(上) > 第一章 绪论(下) > (e)迭代与递归 > 01-E-5: 数组倒置
我们再来看
减而治之策略的另一个
典型的应用实例
这个问题要求对于
任何给定的数组
将其中元素的存放位置
前后颠倒
就像翻烙饼一样
这里我们给出一个统一的接口
以便不同的算法
能够在统一的接口下实现
也就是 将数组A中
从lo一直到hi
大家注意包括lo,包括hi
这样的一个区间中的所有的元素
实现刚才所说的前后颠倒
当然有很多种算法
我们这里
不妨给出其中的一种
我们来看一下
我们不断地来判断一下
如果lo和hi之间
还有足够多的元素
还没有到退化的情况
我们就将当前的lo和当前的hi
这两个元素彼此互换
接下来呢
递归地去求解一个
规模更小的问题
这个问题从数组的范围来说
是从lo + 1到hi - 1
为什么它是减而治之呢?
因为我们可以认为
通过这样一次O(1)时间的操作
可以将问题规模减少为
(比)原来规模少2个元素
那么当然
这里其实隐含着有一个else
你可以认为这个else后面
直接给了一个return
没有做任何的事情
但是它确实隐含在这儿
而这个隐含的return呢
实际上就是我们所说的递归基
所以大家这里要回去验证一下
对于这个问题而言
我们的递归基是不是
足以应付所有的情况
我给大家的提示
这里实际上有两种情况要解决
哪两种呢?
取决于这个区间的宽度
我们知道区间的宽度
经过了这样的一个减而治之以后
虽然有所减少
但每次减少的都是两个单位
所以它的奇偶性是不变的
最终的情况
实际上有最小的奇数
1个元素以及最小的偶数
也就是0个元素的两种情况
请大家回去验证一下
不可见的这个else
都是足以应付的
好 我们再回到这个算法的本身
它是一个减而治之的一个策略
它的正确性 我们也可以用
这样一个图来表示
再看一遍
为了求解这样一个
将n个元素前后颠倒次序的问题
我们将它转化为一个
平凡的问题
也就是将这一对元素lo和hi互换
以及另一个规模缩小
在这里讲 具体是两个单位的问题
但是这个问题的形式
和原来那个问题的形式
是完全一样的
所以它可以继续递归得以实现
当然这个问题还有别的版本
比如说有迭代版
甚至还有更精简的迭代版
这个呢 我们留给大家
课后进行推敲
我们把注意力还是放在
这个递归的算法
我们要问一问
这样一个也能够证明
是正确的算法
它的复杂度相对于
最初的问题的规模n
也就是lo和hi的差
具体的是多少?
我们请大家参照上述所给的
两种主要的方法
针对这样一个减而治之策略的算法
来分析它的时间复杂度
并且相互佐证
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验