编程处理指数爆炸问题
什么是指数爆炸?
指数爆炸是指数字不断翻倍,反反复复,呈指数式增长。或许听完这个概念你还不了解,讲一个具体的例子就明白了。
示例如下:
假设现在有一张厚为1mm的纸,这种纸非常柔软,可以无数次对折。每对折一次,厚度便翻一番。请问对白50次后纸的厚度?
初一看,这个问题如此简单,不就是对折一次,厚度乘2么,有什么了不起,对折50次,不就是2的50次方么?好,下面我们来算一算。
对折次数与厚度对应关系如下:
1 -------- 2mm
2 -------- 4mm
3 -------- 8mm
4 -------- 16mm
5 -------- 32mm
6 -------- 64mm
7 -------- 128mm
8 -------- 256mm
9 -------- 512mm
10 -------- 1024mm
对折10次后厚度是1024mm。也就是1.024m,那就省略小数吧,哥们大方。下面以米为单位:
11 -------- 2m
12 -------- 4m
13 -------- 8m
14 -------- 16m
15 -------- 32m
16 -------- 64m
17 -------- 128m
18 -------- 256m
19 -------- 512m
20 -------- 1024m
对折20次后已经超过1km了,那就以千米为单位吧。
21 -------- 2km
22 -------- 4km
23 -------- 8km
24 -------- 16km
25 -------- 32km
26 -------- 64km
27 -------- 128km
28 -------- 256km
29 -------- 512km
30 -------- 1024km
到这里还没有结束了,还要乘20次,想必到这里已经知道了,指数增长的速度了……
指数与编程有什么关系?
上面说了指数爆炸,那与编程有什么关系呢?很多人会这样问,其实在平常的编程过程中,我们在很多地方都会考虑指数爆炸的问题。比如用二分查找代替顺序查找,在快速排序中也是为避免指数爆炸的问题,而对数据进行加密时恰恰是利用了指数爆炸,如现在的加密算法都是512位的,如果使用暴力法,估计要破解密码得到世界末日。
如何处理指数爆炸?
对于指数爆炸问题,一般有四种处理方法。
1.极力求解
该方法是”知道方法以后极力求解“。即增强计算机性能的方法。例如,使用超级计算机、并行计算机或先进的计算机。
极力求解固然是重要的方法,但问题规模稍有扩大就应付不了了。这就变成了问题规模和计算机之间的赛跑。
2.变相求解
这种方法是”转换成简单问题来求解“。即寻找更好的解法或算法。
遗憾的是对于涉及指数爆炸的问题,并非总能找到比一个不漏地反复试验更好的方法。这项工作难度很高。
3.近似求解
第三种方法是”不求完全解答,而是指出近似解“。这是通过估算或使用模拟器等求解的方法。得出的结果虽然在数学层面稍欠严密,但有助于实际应用。
4.概率求解
这是求解时使用随机数的方法,就好比使用掷股子得到的数。有效利用该方法,或可在短时间内解决难题。但是这种方法无法把握解决问题所需时间,运气不好的话有可能永远找不到答案。”概率求解“听起来不靠谱,不过在实际运用中去是非常重要的方法。