AngryRED

Easier & Better

程序员的数学(一)

06 Aug 2018 » java

最近重温结城浩的《程序员的数学》,感触颇深。数学的应用广泛不言而喻,我们在平时的生活中离不开数学, 而作为搞开发的人来说,数学更是重中之重,这套书从基础的数学到概率统计,线性数学介绍了我们在日常开发中可能碰到的实例。

逻辑

真与假的二元世界

德摩根定律

  • !A 或 !B == !(A 和 B)
  • !A 和 !B == !(A 或 B)

余数

周期性与分组

今天是星期天,100天之后是星期几?

运用余数思考,100天以后就是“100除以7的余数”

0123456
100 % 7 = 2

​ 所以100天以后是星期二

今天是星期天,10¹⁰⁰天以后是星期几?

由于数字比较大,我们用余数来计算也变得比较费事,我们可以尝试寻找其它的规律: 如1,10,100,1000,10000……这样,依次增加0的个数,观察其规律:

0的个数天数余数星期
011 % 7 = 1
11010 % 7 = 3
2100100 % 7 = 2
310001000 % 7 = 6
41000010000 % 7 = 4
5100000100000 % 7 = 5
610000001000000 % 7 = 1
71000000010000000 % 7 = 3
8100000000100000000 % 7 = 2
910000000001000000000 % 7 = 6
101000000000010000000000 % 7 = 4
11100000000000100000000000 % 7 = 5

很明显的规律:

012345

也就是说,每增加6个0,星期数就相同,因此周期为6。将0的个数除以6,得到的余数所对应的星期数即为所求。

那回到题目10¹⁰⁰天后是星期几?

100 % 6 = 4

则10¹⁰⁰天后是星期四。

涉及大数值是,如果不能直接计算,先尝试用较小的数字试算,找到规律,然后可能的话,在用余数计算。

运用余数,大数字的问题,就能简化成小数字的问题。

奇偶校验

奇偶校验在通信领域运用非常广泛,其实是将问题简化,分成2组。

最经典的就属:

哥尼斯堡七桥问题和欧拉猜想(一笔画的问题)

如果能够一笔画成,必须满足所有的顶点都是偶点或者只有2个奇点。

高斯求和

1 + 2 + 3 + 4 + … + n = ?

高斯断言

0到n的正数之和为 \[G(n) = \frac{n (n + 1)}{2}\]

排列(Permulation)

从n中取出k个按一定的顺序排列 \[P_{n}^{k} = \frac{n!}{(n - k)!}\]

组合(Combination)

从n中取出k个,不考虑顺序 \[C_{n}^{k} = \frac{P_{n}^{k}}{P_{k}^{k}} = \frac{\frac{n!}{(n-k)!}}{k!} = \frac{n!}{(n-k)!}\frac{1}{k!} = \frac{n!}{(n-k)!k!}\]

递归

汉诺塔

三根细柱A,B和C,A上面有n个圆盘,最终全部移到B(每次移到1个,小圆盘上面不能放大圆盘)

递归分析
  1. 首先将(n-1)个圆盘先移到C上。
  2. 将第n个圆盘移到B上。
  3. 然后将C上的(n-1)个圆盘移到B上,完成。

可以得到递归关系如下: \[H(n) = \begin{cases} 0 & \text{ ( } n= 0) \\ H(n-1) + 1 + H(n -1) & \text{ (} n= 1, 2, 3...) \end{cases}\]

解析式优化

从上面的H(0), H(1), H(2), … H(n)的结果,可以进一步的抽象出H(n)。

0123456
0137153163

即可以用: \[H(n) = 2 ^ n - 1\]

阶乘的递归

同样的,阶乘用递归可以表述为: \[n! = \begin{cases} 1 & \text{ ( } n= 0) \\ n (n - 1)! & \text{ (} n= 1, 2, 3...) \end{cases}\]

斐波那契数列

有1种动物,它出生2天后就开始以每天1只的速度繁殖后代。假设第1天有1只这样的动物,到第n天共有多少只?

分析

123456789
112358132134

结论 \[F(n) = \begin{cases} 1 & \text{ ( } n <= 2) \\ F(n-1) + F(n-2) & \text{ (} n > 2) \end{cases}\]

指数爆炸

假设有一张厚度为1mm的纸,非常柔软,可以对折无数次,每对折一次,厚度就翻一番。已知地球距月球的距离是39万公里,请问对折多少次后厚度能超过地月距离呢?

如果没有计算过,数字绝对让你想不到……

121020303839
2mm4mm1024mm1048.576m1073.741824km274877.906944km549755.813888km

答案是39,没错,这就是指数爆炸。

二分法在计算机中常用的查找数据的方法,其目的是在有序的数据中找出目标数据,其核心是“总是判断目标数据所在范围内的正中间的数据”。

二分查找法也正是使用了“指数爆炸”的方法,所以在大量的数据查找中,威力巨大。也就是说,每判断一次就能筛选出近一半的查找对象

对数(Logarithm)

如果: \[A = 10^n\]

那么: \[log_{10}A = n\]

指数法则
\[10^a * 10^b = 10^{a + b}\]
对数法则
\[log_{10}(A * B) = log_{10}A + log_{10}B\]

总结

对于涉及指数爆炸的问题,大体上有四种处理方法。

  1. 极力求解

    知道方法以后极力求解,即增强计算机性能,使用超级计算机或更先进的计算机来计算。

  2. 变相求解

    换成简单问题来求解,即寻找更好的解法或算法。

  3. 近似求解

    不求完全解答,而是找出近似解。

  4. 概率求解

    有效使用随机数,在短时间内解决难题。


学生:老师,我的人生出现了360度的大转弯呢!

老师:360度的话,不就是没发生变化吗?

Related Posts