当前课程知识点:数据结构(上) >  第一章 绪论(下) >  (e)迭代与递归 >  01-E-7: 二分递归:数组求和

返回《数据结构(上)》慕课在线视频课程列表

01-E-7: 二分递归:数组求和在线视频

01-E-7: 二分递归:数组求和

下一节:01E-8 二分递归:Max2

返回《数据结构(上)》慕课在线视频列表

01-E-7: 二分递归:数组求和课程教案、知识点、字幕

还是我们刚才所讨论过的

数组元素求和的那个问题

只不过这里的形式

我们做了一般性的推广

也就是说

对于任何给定的数组A

我们要求和的元素范围

是从第lo到第hi个元素

所以为此

我们首先要处理递归基

也就是判断一下lo和hi

是否已经足够接近

如果它们足够接近

以致于问题的有效范围

只有一个单元

那么我们就直接把

这个元素返回就可以了

否则的话

我们会通过一次右移操作

也相当于是除二

在lo和hi之间

取它的中点mi

进而 将原来那个问题

分解为两个形式与原来那个问题

完全一致的子问题

这两个子问题的区间范围

分别是lo到mi

也就是lo到mi

以及(mi+1)到hi

(mi+1)到hi

一旦能够将这两个子问题

递归地进行求解

我们接下来 只要做一次加法

就可以将它们的结果合并

并且得到最初问题的解

这样就得到了一个典型的

分而治之的策略

我们在这里不断地分

然后通过递归求解

得到它的解

并且进行合并

后一部分操作要做conquer “治”

那这种策略 所写出的这个算法

通过这样的一个解释

正确性也毋庸置疑

现在的问题是

它的复杂度是多少呢?

我们又当如何分析呢?

也是继续沿用我们此前

所给出的两个方法

先来看第一种方法

也就是递归跟踪

为此我们需要

以某一个具体的数值n为例

画出所有的递归实例,

相互之间彼此调用的

这样的一个关系图

比如说,在这里头

我们取的长度是8

也就是0到7 这样的一个实例

我们将所有递归实例的调用的情况

绘制成这样一个跟踪图

我们可以确认一下

0到7的求和问题

被化简为0到3的求和问题

以及4到7的求解问题

后者 又进而被划分为4到5

以及6到7之间的求和问题

诸如此类

直到最后 变成递归基的形式

也就是说 lo分别等于hi

比如说 这个地方全都等于0

这两个都等于1 等于2

换而言之 它们对应的都是

单个元素的 这些有效的区间

这样做完之后

我们接下来要做的事情

就是统计所有递归实例

所需要的时间总和

稍微回顾一下

刚才那个递归实例就会发现

如果把递归调用本身

那个语句去掉的话

里头也不包括任何形式的

隐式的或者是显式的迭代

换而言之 每一个递归实例

无论它所对应的有效区间或长 还是短

都是只需O(1)时间的

所以我们又回到了同样一个情况

也就是 我们只需要

将所有递归实例的总数

统计出来就够了

那么我们可以看到

这个统计呢 可以分层来进行

第一层 有2的0次方 1个

第二层 有2的1次方个

第三层 2的2次方

以及最后一层是2的logn次方

我们说经过这样

一系列的代数的运算

最后可以得出结论是O(n)

尽管在这里我们把这种

代数推导的方法也给出来了

但是实际上我们并不希望

你以后去这么做

实际上 运用我们此前所讲过的技巧

我们可以更加敏锐地

甚至是不需要任何更多的笔和纸

就可以得到同样这样一个结论

我们来看一下 怎么来分析

基于这样一个绘制出来的跟踪图

我们可以发现

按分层的关系而言

所有的递归实例

在每一层的总数

应该是构成一个

以2为倍数的几何级数

没错 几何级数 这非常重要

如果大家还记得的话

我们此前曾经讲过

几何级数的总和

应该是与它的末项同阶的

在这里来讲 实际上

底层递归实例的总数

从渐近的意义上讲

就已经能代表整体的总数了

那么问题是底层

到底有多少的递归实例呢?

有同学很敏锐地就发现了

没错 应该是n个

原因是 底层的递归实例

对于原始的区间中的每一个元素

都各自有且仅有一个对应的实例

所以原来那个区间有多宽

这里在底层上

就会有多少个递归实例

或者准确地讲 就是n个

这也就是为什么

可以直接得出结论

这个算法所需要的时间是O(n)

我们可以看到

在我们掌握了这种方法和技巧

和这种思维的方式以后

这些代数的计算

其实都变得 在某种意义上讲

有些多余

我们也可以采用

递推方程的方法

对刚才那个算法进行分析

从递推的角度来看

为了求解一个刚才规模

是从lo到hi的问题

实际上 我们是将它分而治之

化简为两个问题

一个是从lo到mi

一个是从mi到hi

总体来说 这两个问题的规模

都大致是n/2

一旦这两个问题的解

通过递归获得了

我们进而只需要

对这两个问题的解

花O(1)的时间进行累加

即可得到原问题的解

当然这里 我们同样

要罗列出递归基的处理

我们说递归基

也就是 当lo等于hi的时候

只需要O(1)的时间

直接把这个元素返回就可以了

所以整理一下

我们就可以得到

这样的递推关系

也就是

为了求解规模为n的问题

我们要将它化解为

两个规模大致均为n/2的问题

然后在O(1)的时间内

将它们归并

而递归基 只需要O(1)的时间

同样地 利用前面类似的技巧

我们把这个只是罗列在这了

我们不再去花时间细讲

总而言之

利用此前类似的方法

我们可以最后同样得出一个结论

这个算法所需要的时间

是O(n)线性的

再一次地

我们殊途同归 不谋而合

而这个并不出乎我们的意料

这只不过是

我们通过了两种等效的方法

来估计同一个算法的复杂度而已

数据结构(上)课程列表:

第零章

-选课之前

--写在选课之前

--宣传片

-考核方式

--考核方式

-OJ系统说明

--关于OJ

--1-注册与登录

--2-界面与选课

--3-提交测试

-关于课程教材与讲义

--课程教材与讲义

-关于讨论区

--关于讨论区

-微信平台

--html

-PA晋级申请

--PA晋级

--MOOC --> THU 晋级申请专区

--THU --> CST 晋级申请专区

--编程作业不过瘾?且来清华试比高!

第一章 绪论(上)

-(a)计算

--01-A-1: 计算

--01a-2: 绳索计算机

--01a-3: 尺规计算机

--01a-4: 算法

--01a-5 : 有穷性

--演示

--01a-6 : 好算法

--(a)计算--作业

-(b)计算模型

--01b-1: 性能测度

--01b-2: 问题规模

--01b-3: 最坏情况

--01b-4: 理想模型

--01b-5: 图灵机

--01b-6: 图灵机实例

--01b-7: RAM模型

--01b-8: RAM实例

-(b)计算模型--作业

-(c)大O记号

--01c-1: 主流长远

--01c-2: 大O记号

--01c-3: 高效解

--01c-4 : 有效解

--01c-5 : 难解

--01c-6: 2−Subset

--01c-7: 增长速度

-(c)大O记号--作业

第一章 绪论(下)

-(d)算法分析

--01d-1: 算法分析

--01d-2: 级数

--01d-3: 循环

--01d-4: 实例:非极端元素+起泡排序

--01d-5: 正确性的证明

--01d-6: 封底估算-1

--01d-7: 封底估算-2

-(d)算法分析--作业

-(e)迭代与递归

--01-E-1: 迭代与递归

--01-E-2: 减而治之

--01-E-3: 递归跟踪

--01-E-4: 递推方程

--01-E-5: 数组倒置

--01-E-6: 分而治之

--01-E-7: 二分递归:数组求和

--01E-8 二分递归:Max2

--01E-09: Max2:二分递归

-(e)迭代与递归--作业

-(xc)动态规划

--01XC-1: 动态规划

--01XC-2: Fib():递推方程

--01XC-3: Fib():封底估算

--01XC-4: Fib():递归跟踪

--01XC-5: Fib():迭代

--01XC-6: 最长公共子序列

-- 演示

--01XC-7: LCS:递归

--01XC-8: LCS:理解

--01XC-9: LCS:复杂度

--01XC-A: LCS:动态规划

-(xc)动态规划--作业

-本章测验--作业

第二章 向量(上)

-(a)接口与实现

--02A-1 接口与实现

--02A-2 向量ADT

--02A-3 接口操作实例

--02A-4 构造与析构

--02A-5 复制

-(a)接口与实现--作业

-(b)可扩充向量

--02B-1 可扩充向量

--02B-2 动态空间管理

--02B-3 递增式扩容

--02B-4 加倍式扩容

--02B-5 分摊复杂度

-(b)可扩充向量--作业

-(c)无序向量

--02C-1 概述

--02C-2: 循秩访问

--02C-3 插入

--02C-4 区间删除

--02C-5 单元素删除

--02C-6 查找

--02C-7 唯一化

--02C-8 遍历

-(c)无序向量--作业

-(d1)有序向量:唯一化

--02D1-1 有序性

--02D1-2 唯一化(低效版)

--02D1-3 复杂度(低效版)

--02D1-4 唯一化(高效版)

--02D1-5 实例与分析(高效版)

-(d1)有序向量:唯一化--作业

-(d2)有序向量:二分查找

--02D2-1 概述

--02D2-2 接口

--02D2-3 语义

--02D2-4 原理

--02D2-5 实现

--02D2-6 实例

--02D2-7 查找长度

-(d2)有序向量:二分查找--作业

第二章 向量(下)

-(d3)有序向量:Fibonacci查找

--02D3-1 构思

--02D3-2 实现

--02D3-3 实例

--02D3-4 最优性

-(d3)有序向量:Fibonacci查找--作业

-(d4)有序向量:二分查找(改进)

--02D4-1 构思

--02D4-2 版本B

--02D4-3 语义

--02D4-4 版本C

--02D4-5 正确性

-(d4)有序向量:二分查找(改进)--作业

-(d5)有序向量:插值查找

--02D5-1 原理

--02D5-2 实例

--02D5-3 性能分析

--02D5-4 字宽折半

--02D5-5 综合对比

-第二章 向量(下)--(d5)有序向量:插值查找

-(e)起泡排序

--02 E-1 构思

--02E-2 改进

--02E-3 反例

--02E-4 再改进

--02E-5 综合评价

-(e)起泡排序--作业

-(f)归并排序

--02F-1 归并排序:构思

--02F-2 归并排序:主算法

--02F-3 二路归并:实例

--02F-4 二路归并:实现

--02F-5 二路归并:正确性

--02F-6 归并排序:性能分析

-(f)归并排序--作业

-本章测验--作业

第三章 列表

-(a)接口与实现

--03A-1 从静态到动态

--03A-2 从向量到列表

--03A-3 从秩到位置

--03A-4 实现

-(a)接口与实现--作业

-(b)无序列表

--03B-1 循秩访问

--03B-2 查找

--03B-3 插入与复制

--03B-4 删除与析构

--03B-5 唯一化

-(b)无序列表--作业

-(c)有序列表

--03C-1 唯一化·构思

--03C-2 唯一化·实现

--03C-3 查找

-(c)有序列表--作业

-(d)选择排序

--03D-1 构思

--03D-2 实例

--03D-3 实现

--03D-4 推敲

--03D-5 selectMax()

--03D-6 性能

-(d)选择排序--作业

-(e)插入排序

--03E-1 经验

--03E-2 构思

--03E-3 对比

--03E-4 实例

--03E-5 实现

--03E-6 性能分析

--03E-7 平均性能

--03E-8 逆序对

-(e)插入排序--作业

-(xd)习题辅导:LightHouse

--03X D 习题辅导:LightHouse

-本章测验--作业

第四章 栈与队列

- (a)栈接口与实现

--04A-1 栈

--04A-2 实例

--04A-3 实现

- (a)栈接口与实现--作业

-(c1)栈应用:进制转换

--04C1-1 应用

--04C1-2 算法

--04C1-3 实现

-第四章 栈与队列--(c1)栈应用:进制转换

-(c2)栈应用:括号匹配

--04C2-1 实例

--04C2-2 尝试

--04C2-3 构思

--04C2-4 实现

--04C2-5 反思

--04C2-6 拓展

-(c2)栈应用:括号匹配--作业

-(c3)栈应用:栈混洗

--04C3-1 混洗

--04C3-2 计数

--04C3-3 甄别

--04C3-4 算法

--04C3-5 括号

-第四章 栈与队列--(c3)栈应用:栈混洗

-(c4)栈应用:中缀表达式求值

--04C4-1 把玩

--04C4-2 构思

--04C4-3 实例

--04C4-4 算法框架

--04C4-5 算法细节

--04C4−6A 实例A

--04C4−6B 实例B

--04C4−6C 实例C

--04C4-6D 实例D

-(c4)栈应用:中缀表达式求值--作业

-(c5)栈应用:逆波兰表达式

--04C5-1 简化

--04C5-2 体验

--04C5-3 手工

--04C5-4 算法

-第四章 栈与队列--(c5)栈应用:逆波兰表达式

-(d)队列接口与实现

--04D-1 接口

--04D-2 实例

--04D-3 实现

-第四章 栈与队列--本章测验

第五章 二叉树

-(a)树

--05A-1 动机

--05A-2 应用

--05A-3 有根树

--05A-4 有序树

--05A-5 路径+环路

--05A-6 连通+无环

--05A-7 深度+层次

-(a)树--作业

-(b)树的表示

--05B-1 表示法

--05B-2 父亲

--05B-3 孩子

--05B-4 父亲+孩子

--05B-5 长子+兄弟

-第五章 二叉树--(b)树的表示

-(c)二叉树

--05C-1 二叉树

--05C-2 真二叉树

--05C-3 描述多叉树

-(c)二叉树--作业

-(d)二叉树实现

--05D-1 BinNode类

--05D-2 BinNode接口

--05D-3 BinTree类

--05D-4 高度更新

--05D-5 节点插入

-(d)二叉树实现--作业

-(e1)先序遍历

--05E1-1 转化策略

--05E1-2 遍历规则

--05E1-3 递归实现

--05E1-4 迭代实现(1)

--05E1-5 实例

--05E1-6 新思路

--05E1-7 新构思

--05E1-8 迭代实现(2)

--05E1-9 实例

-(e1)先序遍历--作业

-(e2)中序遍历

--05E2-1 递归

--05E2-2 观察

--05E2-3 思路

--05E2-4 构思

--05E2-5 实现

--05E2-6 实例

--05E2-7 分摊分析

-第五章 二叉树--(e2)中序遍历

-(e4)层次遍历

--05E4-1 次序

--05E4-2 实现

--05E4-3 实例

-第五章 二叉树--(e4)层次遍历

-(e5)重构

--05E5-1 遍历序列

--05E5-2 (先序|后序)+中序

--05E5-3 (先序+后序)x真

-(e5)重构--作业

-本章测验--作业

第六章 图

-(a)概述

--06A-1 邻接+关联

--06A-2 无向+有向

--06A-3 路径+环路

-(a)概述--作业

-(b1)邻接矩阵

--06B1-1 接口

--06B1-2 邻接矩阵+关联矩阵

--06B1-3 实例

--06B1-4 顶点和边

--06B1-5 邻接矩阵

--06B1-6 顶点静态操作

--06B1-7 边操作

--06B1-8 顶点动态操作

--06B1-9 综合评价

-(b1)邻接矩阵--作业

-(c)广度优先搜索

--06C-1 化繁为简

--06C-2 策略

--06C-3 实现

--06C-4 可能情况

--06C-5 实例

--06C-6 多连通

--06C-7 复杂度

--06C-8 最短路径

-(c)广度优先搜索--作业

-(d)深度优先搜索

--06D-1 算法

--06D-2 框架

--06D-3 细节

--06D-4 无向图

--06D-5 有向图

--06D-6 多可达域

--06D-7 嵌套引理

-(d)深度优先搜索--作业

-第六章 图--本章测验

01-E-7: 二分递归:数组求和笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。