当前课程知识点:数据结构(上) > 第一章 绪论(上) > (b)计算模型 > 01b-2: 问题规模
我们这里所谓的测量或者测度
实际上是算法分析的范畴
具体来说 所谓的算法分析
主要的有两个方面
第一证明一个DSA是正确的
当然这件事情不是那么简单
其中用到的很多工具和方法
都不是那么一目了然
但是这并不是我们这门课
最最主要的一个方面
尽管我们会在后面结合具体的DSA
给大家做一些具体的方法的介绍
但是系统的学习
将留待算法分析的相关理论里深入了解
而在这里我们首先关注的是
算法分析的另一个方面
也就是我们前面所说过的性能方面
这里如果倒过来看
就是所谓的成本
具体来说 分为两个部分
也就是所谓的时间成本和空间成本
正如我们在稍后会解释的一个原因
在这里 我们不妨首先采用都比较公认
和普遍应用的一个方法
也就是暂时把空间忽略掉
而把注意力更多的集中在时间方面
所以我们的问题归纳一下的话就是
如果我们关注一个DSA的时间成本
我们应该如何来度量它
如果这种度量
涉及到两个或者多个DSA
那么它们之间又该如何进行比较
我们的思路 首先是从建模开始
不妨定义这么样一个数学上的描述
也就是说 如果我们采用
名字叫A的这么样一个算法
求解某一个问题具体的一个实例
一个instance
如果把它的名字叫作P的话
那么它所需要的计算的时间成本
就会被记成TA(P)
比如说我们前面讲过的三等分问题
可能我们用的那个算法
就是欧几里得的尺规作图法
那么 那个具体的实例呢
也可能就是我们在前面的那章
片子里所放的那个问题
当然也可能很不一样
那个输入也就是那条线段
有可能是不同长度的
也可能是不同的方向
总而言之对任何一个具体的实例P
我们都可以从数学上
记下这么样一个量
如果我们能够真正地获得
这么样一个度量值的话
当然我们就可以来对算法进行比较
但是很遗憾 纯粹从数学上
所做的这样一个定义
其实意义不大
为什么呢?
因为同样一个问题
它所能够出现的实例
是非常非常非常多的
通常情况下都是无数的
所以我们不可能把目光注意到
这样一个一个的具体实例上去
任何一个具体的实例都存在
以偏概全的问题
它不可能使我们获得对这个问题
所对应的这个算法一个总体的认识
所以我们必须进行归纳和概括
那么如何归纳和概括呢?
数学给我们提供了常用的
也是非常有效的方法
就是划分等价类
一般来说
需要对任何一个问题无数的实例
进行一定的粗分类
并且就某一类谈它的计算成本
那么怎么分类呢
我们这里观察到
大家普遍能接受的
定性的一个结论
虽然它不见得总是成立
但是它大多数时候都是成立的
也就是说任何一个问题
它的计算成本
实际上是和对应的
那个实例的规模相关的
一般来说还是正相关的
我再强调一次
这里说的都是往往一般
并不是说所有的时候都这样
在我们的习题集中
大家可以比较轻易地构造出一些反例
但这不影响我们这里基本的一个判断
也就是说大体来说是这样的
比如说回到前面三等分的那个问题
如果我们把分成多少段 这个段数
作为问题输入的规模
那么应该很自然的能理解
随着你要求分的段数越多
这个问题的计算成本和代价
也会相应的更高
所以概括起来而言
问题规模越接近
它们所对应的计算成本
也会相应地彼此接近
而随着规模的增加
计算成本通常也会呈上升的趋势
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验