惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Darknet – Hacking Tools, Hacker News & Cyber Security
V
Vulnerabilities – Threatpost
Cloudbric
Cloudbric
G
GRAHAM CLULEY
S
Securelist
Schneier on Security
Schneier on Security
Help Net Security
Help Net Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Project Zero
Project Zero
Spread Privacy
Spread Privacy
P
Privacy International News Feed
C
Cyber Attacks, Cyber Crime and Cyber Security
Cisco Talos Blog
Cisco Talos Blog
T
Tailwind CSS Blog
博客园_首页
有赞技术团队
有赞技术团队
Simon Willison's Weblog
Simon Willison's Weblog
Stack Overflow Blog
Stack Overflow Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Latest news
Latest news
T
Tor Project blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Attack and Defense Labs
Attack and Defense Labs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
O
OpenAI News
J
Java Code Geeks
T
Tenable Blog
K
Kaspersky official blog
AWS News Blog
AWS News Blog
S
Security @ Cisco Blogs
The GitHub Blog
The GitHub Blog
T
Threatpost
月光博客
月光博客
H
Heimdal Security Blog
Security Latest
Security Latest
The Hacker News
The Hacker News
Y
Y Combinator Blog
A
Arctic Wolf
Apple Machine Learning Research
Apple Machine Learning Research
C
Cisco Blogs
美团技术团队
Microsoft Security Blog
Microsoft Security Blog
Hugging Face - Blog
Hugging Face - Blog
T
The Blog of Author Tim Ferriss
C
CERT Recently Published Vulnerability Notes
D
Docker
Google Online Security Blog
Google Online Security Blog
D
DataBreaches.Net
V
Visual Studio Blog
H
Help Net Security

博客园 - smalldust

NTT大规模网络故障 亲手焙制一个极其简单但却极其实用的Reflector插件 关于园子里讨论的软件的追求的杂谈 Reflector保护方法初探 .Net 2.0 原汁原味读取注册表 为什么我不用IE7和FireFox 给.Net程序员的PInvoke Tips [2]: Are Strings Immutable? 除了Exception,你还能throw什么? 给.Net程序员的PInvoke Tips [1]: String is Sometimes an Integer CLR Team程序员出的难题,有兴趣的朋友不妨挑战一下 - smalldust - 博客园 Google Trends发布 也谈用反射实现Enum→String映射:一种重视性能的方法 针对个例的、社区性的维基系统设想(草稿) WinForm程序启动时不显示主窗体的实现方法 C#程序模拟鼠标操作 [Simulate Mouse Movement and Click Programmatically] 如何在C#中获取“当前目录” Windows Vista将推迟到2007年1月发布 .Net 2.0实例学习:WebBrowser页面与WinForm交互技巧 使用关键字作为自定义标识符
数学的思考方式 VS 程序的思考方式
smalldust · 2006-04-12 · via 博客园 - smalldust

高中的时候,老师给我们出了一道题:
四个圆最多可以把平面分成多少个部分?
我们这些学生拿到题,都开始拼命在纸上画圆,一个,两个,三个……各种可能的稀奇古怪的位置都要考虑到。
等我们费尽力气算出是14个部分之后,老师又问:那么10个圆呢?
这下我们都傻了,10个圆,这要怎么画啊。
不过也有善于小聪明的学生,试着推算:一个圆的话是2,两个圆是4,三个圆是8,可是四个圆怎么不是16呢……看来行不通。

最后,老师告诉我们,大家要学会推论的思考方法:两个圆最多有两个交点,那么假设平面上已经有n个圆,那么当我们画第n+1个圆的时候,它最多和已有的n个圆有2n个不同的交点。这些点把第n+1个圆划分成了2n段弧,而因为每一段弧把其所在的空间分割成了2部分,所以每一段弧意味着增加了一个部分。总结起来就是:当平面上有n个圆的时候,再画一个圆最多可以增加2n个部分。
当老师给我们讲解了推论方法之后,我才明白,原来这个问题这么简单!

当我接触了计算机,接触了编程之后,我还是总会试着用这种数学的方法思考问题;——这是没有任何错误的,但是我最容易犯的错误就是忽视计算机很多时候可以解决我们无法或者难以通过“公式”“推论”所解决的问题:因为计算机拥有无比快速的大脑。

有一道ACM的问题(http://acm.uva.es/p/v1/136.html),描述如下:

************************************************************************

如果一个数的质因子只包含2,3,5,那么它就被称为“Ugly Number”。下面是Ugly Number从小到大排列的序列:

1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ...

(按照习惯,我们这里把1也算作Ugly Number)

那么现在,请你写程序求出第1500个Ugly Number。

************************************************************************

不知道你看到这个题目的时候有什么思路呢?
(如果决定自己想一想,请不要往下看^_^)

直接看结果请看下面……

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

我最开始看到这个题目,开始时脑海中的想法是:必须推算出Ugly Number的公式呀!
但是我左推推,右推推,没有半点头绪。天啊,看来这个题目需要比较高的数学知识!——我想。

好吧,既然公式推不出来,那么就只好一个一个检查了——把每个数都分解因数,
如果它的质因数只包含2,3,5,那么就把它们加入一个队列就是了!
但是仔细考虑一下,就发现这样做太耗时了(ACM竞赛对程序执行时间有限制,例如1秒),又是分解又是判断质数,到了1500难免要超时。

那么,还有没有什么好方法呢?
答案是肯定的。既然从自然数中“筛选”Ugly Number比较困难,反过来我们逐个生成Ugly Number如何?
我们假设一个数n是Ugly Number,那么也就是说

n = 2^x * 3^y * 5^z,其中x, y, z >= 0。

那么很容易看出2n,3n,5n也都是Ugly Number。

既然这样,那么我们就从1开始,不断地乘以2,3,5,把每个得到的数按大小加入到Ugly Number的队列中;并不断对Ugly Number对列中的下一个数进行乘2,3,5操作,这样我们不久可以得到整个Ugly Number的序列了吗?

很简单,不是吗?
(这里要注意一点,就是如何确定这些生成的Ugly Number的顺序问题。——也即,你生成了一个Ugly Number,并把它加入到队尾的时候,你如何保证它和前一个Ugly Number之间没有别的Ugly Number?这个问题就留给喜欢研究的朋友了:P)

看来,算法虽然和数学有着很深的渊源,但是利用算法来解决问题与利用纸笔+数学的头脑来解决问题,有时候方向还是不同的。■