当前课程知识点:计算思维导论 >  第八单元 >  8.2 算法设计方法——枚举 >  Video

返回《计算思维导论》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《计算思维导论》慕课在线视频列表

Video课程教案、知识点、字幕

大家好

这一节讲

算法设计方法之枚举

先看一些生活中的事例

大家知道

旅行箱现在多半都配了密码锁

外出旅行时

为了安全起见

人们都会用密码锁锁住旅行箱

令人尴尬的是

有时候人们会忘记密码

这可怎么办呢

最笨也许最可行的办法就是

从000到999挨个儿试

肯定能找出密码来

不过

这是一件很不爽的苦差事

但确实能解决问题

再看一个有趣的事例

早年漫步街头

发现有人在街边

设了这么一个“赌局”

一中年男子在地上摆一张白纸

一支笔

旁边还有一份“游戏规则”

规则明确指出

谁要是一口气不间断地

在白纸上从1写到300

而没有半点错漏

则给你20块钱

如果有一点错漏

则给设局之人5块

这么简单的“游戏”

谁都认为自己能赢

于是 不少人上前一试“身手”

结果出人意料

竟然输多赢少

设局之人暗自高兴不已

为什么这么简单的事情

“输多赢少”呢

原来人很容易疲劳

虽然写几个数字

是很简单的事情

但不断重复这些简单的事情

容易使人疲劳

人一疲劳就容易出错

这或许是人类自身的不足之一

正因为如此

一些睡眠有问题的人

比如神经衰弱

心事重重

喝了浓咖啡等等

睡不着的时候就开始数数

或者想象着在草地上数羊

数着数着也许就睡着了

非常有意思的是

计算机跟人不一样

与人相比

它的最大特点恐怕就是

计算速度非常快

太快

在这一点上

人类已经被远远甩在了后面

而且永远也别想赶上它

另外 它还不怕麻烦

不嫌累

不会疲劳

除非出现硬件故障或掉电

枚举法正是利用了

计算机的这一特点

甚至把这一特点发挥到了极致

我们知道

银行卡的密码通常是6位数字

也就是说

任何一张银行卡的密码

都在000000到999999

这个范围之内

理论上

如果一个一个去试探

只要有足够的耐心和时间

肯定可以试探出来

只是没有哪一家银行的柜员机

允许你这样做

即便允许你这样去试探

恐怕也要把人累得要死

但是如果利用计算机来做这件事

恐怕要不了1分钟

就可以“搞定”

这种破解方法

也称为暴力破解法

有时候也叫做蛮力法

枚举法也叫穷举法

它的基本思想是

首先依据题目的部分条件

确定答案的大致范围

然后在此范围内

对所有可能的情况逐一验证

直到全部情况验证完为止

如果某个情况

使验证符合题目的条件

则为本题的一个答案

如果全部情况验证完

均不符合题目的条件

则问题无解

以枚举思想设计算法

能解决许多问题

所以应用非常广泛

比如“百鸡问题”

“白鸡问题”说的是

公鸡每只五元

母鸡每只三元

小鸡三只一元

花100块钱买100只鸡

要求每种鸡至少买一只

试问有多少种不同的买法

“百鸡问题”是一个

不定方程的问题

我们不妨设xyz分别表示

公鸡

母鸡

小鸡 买多少只

公鸡每只五块

母鸡每只三块

小鸡三只一块

对于一百块钱买一百鸡的问题

我们可以写出下面的代数方程

也就是

x 加 y 加 z 等于 100

另外一个方程是

5x加3y加z除以3等于100

除此以外

你再也找不出别的方程了

那么两个方程怎么解三个未知数

这是典型的不定方程组

这类问题用枚举法来写算法

就很方便

它的基本思想是

把xyz可能的取值

一一列举

如果有解

解必在其中

如果不止一个解

也能全部找出来

枚举法的特点是算法思想

很简单

对求解那些可确定解的范围

并且一时又找不到

其他更好的方法的时候

就可以用它

这就是“百鸡问题”的枚举算法

这个算法其实很简单

它是一个两重循环

外循环 x从1循环到20

表示公鸡至少要买一只

顶多也就是买20只

内循环 y从1循环到33

表示母鸡至少要买一只

顶多也就是买33只

一旦x和y确定了

z可以用100减去x

减去y计算

那么只要

5x加3y加z除以3等于100

满足这么一个条件

就能找到一组解

这个循环

循环下去

就可以把所有可能的解找出来

那么我们再来看第二个例子

求自然数M和N的最大公约数

类似这样的题

用枚举法来求解也是很简单的

我们可以先找出

M与N之间较小的那个数

把它设为T

则M和N的公约数的取值范围

就可以确定了

这个范围就是从1到T

最大公约数

自然也在这个区间里面

接下来我们从大到小去枚举

找到的第一个公约数

就是我们要找的解

这就是求最大公约数的算法

这个算法非常简单

首先是一个条件语句

if M大于等于N

T取N的值

否则T取M的值

然后就是一个while循环

这个循环当M和T不能整除

或者N和T不能整除的时候

就循环

执行循环体

循环体就是使T减一

然后继续循环

这样找到的

第一个满足条件的T

就是我们所需要的解

可见枚举法并不高明

但效果却很好

它充分体现了

“扬长避短”的“计算思维”

因为 一计算机的计算速度

远胜于人

它能轻易地从1枚举到n

二 重复做类似的事情

人很容易疲劳出错

机器不会这样

好 这一节就到这

谢谢大家

计算思维导论课程列表:

第一单元

-1.1 计算思维及其教育

--Video

第二单元

-2.1 计算是什么

--Video

-2.2 计算与自动计算

--Video

-2.3 计算机及其计算本质特征(I)

--Video

-2.4 计算机及计算的本质特征(II)

--Video

第三单元

-3.1 数的表示与模拟计算

--Video

-3.2 数的表示与数字计算

--Video

-3.3 二进制加法运算的机器化

--Video

-3.4 “九九归一”的加法运算

--Video

-3.5 二进制之优越性及问题与代价

--Video

第四单元

-4.1 从数学危机到图灵机

--Video

-4.2 图灵机的计算能力

--Video

-4.3 什么问题都能计算吗?

--Video

-4.4 冯•诺依曼机及其发展与演化

--Video

-4.5 从算盘到图灵机——机械计算的本质

--Video

-4.6 电子计算机——透过现象看本质

--Video

第五单元

-5.1 思维可机械计算吗(I)

--Video

-5.2 思维可机械计算吗(II)

--Video

第六单元

-6.1 量子理论

--Video

-6.2 量子计算机

--Video

第七单元

-7.1 人类求解问题之过程

--Video

-7.2 基于计算(机)的问题求解过程

--Video

-7.3 面向过程的结构化设计方法学

--Video

-7.4 面向对象之方法学

--Video

-7.5 面向对象技术

--Video

-7.6 抽象

--Video

-7.7 计算学科中的抽象

--Video

-7.8 时间与空间及其相互转换

--Video

-7.9 技术层面的其他方法学

--Video

-7.10 认知层面的其他方法学

--Video

第八单元

-8.1 算法与程序

--Video

-8.2 算法设计方法——枚举

--Video

-8.3 算法设计方法——递推

--Video

-8.4 算法设计方法——递归

--Video

-8.5 算法设计方法——分治

--Video

-8.6 算法设计方法——仿生

--Video

第九单元

-9.1 机器间的通信方式

--Video

-9.2 数据转发方法

--Video

-9.3 网络分层体系结构

--Video

-9.4 有趣的对称加密技术

--Video

-9.5 难解的非对称加密技术

--Video

-9.6 数字签名及其应用

--Video

-9.7 从自然智能到人工智能

--Video

-9.8 符号主义的基本思想

--Video

-9.9 连接主义Ⅰ

--Video

-9.10 连接主义Ⅱ

--Video

-9.11 行为主义的基本思想

--Video

-9.12 机器翻译的愿景与困难

--Video

-9.13 峰回路转的自然语言处理

--Video

-9.14 信息传输中的问题与挑战

--Video

-9.15 重复传输与冗余编码

--Video

-9.16 校验与校验和

--Video

-9.18 自纠错技术及应用

--Video

-9.19 两种简单的数据压缩方法

--Video

-9.20 哈夫曼编码

--Video

-9.21 数据压缩极限与LZ压缩方法

--Video

-9.22 大海捞针的搜索引擎

--Video

-9.23 网页排序方法(PageRank)

--Video

第十单元

-10.1 计算文化

--Video

期末考试

-期末考试--作业

Video笔记与讨论

也许你还感兴趣的课程:

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