当前课程知识点:数据结构(上) > 第一章 绪论(下) > (d)算法分析 > 01d-7: 封底估算-2
无论费米还是埃拉托斯特尼
无论是物理学
还是几何学 包括测地学
之所以能成功运用这种方法
关键都在于它们
善于抓住问题的主要方面
从而简捷地得出
这个问题的总体的规律
我们说这种方法
可以很自然地运用到
我们复杂度的分析过程中
当然对象变成了时间
因此我们对很多的时间量
从今天开始就要建立起
直接的概念
有哪些概念呢?
第一个就是关于一天
我们说我们的基本计算单位
当然是秒
我们的CPU在一秒钟
现在gigahertz
大概是10的9次方次运算
那么一天有多少秒呢?
我们这里要换算一次
并且把它记下来
我们说大概是24小时
乘以60分钟乘60秒
那么技巧就是
把24小时
要放大估算为25
把六六三千六放大成大概是4000
这个时候 我们就看得出来端倪了
大概是 1后面接5个零
所以我们从此要建立一个概念
一天大概就是10的5次方秒
那么我们的一生呢?
当然希望各位都是长命百岁
我们不妨用一个世纪来估算
100年 每年360天
大概是三万多天
如果这么样换算的话
大概是3乘以10的9次方秒
在清华 我们都有一个宏伟的目标
要为祖国健康的工作50年
那么这50年是多少呢?
从今天开始我们应该有一个概念了
大概1.6乘以10的9次方
而无论这个 还是这个
我们说都不是很好记忆
那么怎么好记忆呢?
今天的人们更喜欢用
三生三世这样的词来形容长久
那么这个准确地讲 又是多少呢?
我们说大概近似为300年
那么恰好大致是
10的10次方秒
这是个非常好记的数值
所以我们以后要记住
所谓的三生三世
其实对应的就是
10的10次方秒
所以串起来 我们说
在三生三世中的一天
其实就相当于
在一天中的一秒
这个概念 我们要从此建立起来
我们也知道现代物理学
所估算出的宇宙大爆炸至今
也就是宇宙的寿命
大概是10的21次方秒
所以相对而言
在整个宇宙生命中的三生三世
其实就相当于
在三生三世中的0.1秒
我们来看封底估算的
一个具体实例 也就是
如果我们承担一个任务
要对全国人口普查的数据进行排序
这个时候的任务的规模
十几亿人口
我们大致归算为十亿
也就是10的9次方
那么我们将可以
怎么来完成这个任务呢?
我们有两方面的选择
一方面是在硬件机器上
不断地做改进
一方面是在算法上做改进
我们分别来看一下
先来考虑用普通的PC机
也就是诸位用的
台式机和笔记本电脑
目前主流的频率
大概都是10的9次方
我们大致地认为它在一秒钟之内
可以进行的浮点
包括通常的整数运算吧
我们估算为10的9次方次
那么如果采用我们刚刚介绍的
Bubble sort 就是起泡排序
会怎么样呢?
我们刚才说了
它的复杂度是平方
所以是10的9次方再平方
应该是10的18次方
这样的一个计算量
这两个做一除法 就会得到
大致需要10的9次方秒
10的9次方秒是多少呢?
我们刚刚估算过
一个世纪大概是
3乘以10的9次方秒
而10的9次方秒大概就是
三分之一个世纪
也就是约30年
我们再来看看
如果改用比较高性能的机器
比如天河1A
这也是一度成为世界上
计算速度最快的机器
它的计算能力是千万亿次
我们大致认为是一个P(peta)
具体来说 就是10的15次方
那么如果估算一下的话
这边是10的18次方
除以10的15次方
我们说 还需要大概一千秒
一千秒什么概念呢?
大致是20分钟
所以通过硬件的改进
我们可以将这个问题
从30年改进为20分钟
这个硬件的改进
确实有相当的效果
但是我们再来看另一个维度
如果我们改用不同的算法
比如说 稍候要介绍的
Merge sort 也就是归并排序
那么它的复杂度是nlogn
所以除了这个10的9次方以外
它还要附属的乘上去一个
10的9次方的对数
这样乘下来呢
是大概等于3乘以10的10次方
而这个地方是10的9次方
经过一个简单的估算 就会发现
实际上用这种算法
即使是用普通的PC机
我们也只需要30秒
没错 30秒
和刚才的一千秒比起来
小很多
如果你既要用这样的
一个高明的算法
同时用这样一个
更好的机器来计算的话
那么完成这个任务
大致只需要零点几个毫秒
所以从这里我们也可以
看出来算法的威力
我们再看一遍
通过硬件的改进
我们是将30年缩短为20分钟
而通过算法的改进
我们可以将30年缩短为
不足一分钟 只有半分钟
从这里 我们也可以看出来
算法改进的威力是多么的巨大
我们的数据结构
研究这样一类问题
那么它的意义更是可想而知
我们更是有必要把这门课
学好 掌握好
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验