一,零的故事
- 计算机为什么用2值表示. 方便的表示开关链通和断开的状态.
- 进制转换
- 十进制转换为二进制. 不断除以2之后余数的倒置. 如12 . 12 / 2 = 6 余0 , 6 / 2 = 3 余 0, 3 / 2 = 1 余1 , 1 / 2 = 0 余 1. 那么12 = 1100.
- 二进制转换为十进制. 如. 1100 = 1 * 2³ + 1 * 2² + 0 * 2¹ + 0 * 2º
- 0 的作用 :
- 占位
- 统一标准, 简化规则.
- 没有计划的计划, 用0表示空计划/没有安排的计划. 这样子可以不用检查那天不用执行计划.
- 没有药效的的药, 例如用药规则:3天服1天停, 可以使用一颗没有药效的药放在特定的位置. 即可进行统一处理.不用每次检查之前使用了多少天.
- 例如代码中. 重构中的空对象 : 使用空对象可以让集合进行统一处理, 而不需要每个都判断是否为NULL
- 总结: 0的思想, 一种解题方法, 思维. 可以达到简化题目,操作
二,逻辑
- 逻辑的基本思路: 兼顾 完整性(不遗漏) 和 排他性(不重复)
- 命题: 能够判断对错的称述 (基于规则的称述)
- 复杂命题: 由各种基本命题复合而成(基本组成: 否,与,或,异或)
- 列出真值表(要完整)或文斯图判断其真假性
- 蕴含 A==>B 若A则B 如果A, 那么B也是, 即:
- 如果你在A上, 那么你必须在B上. A为true 则B必须true结果才能true
- 如果你不在A上, 那么你可以不在B上. A不为true则B可以不为true 结果也会是true
- 蕴含的逆否命题: 不是A, 或者是B
- 德摩根律:
- (~A)V(~B) = ~(A^B)
- (~A)^(~B) = ~(AVB)
- 原理: 对偶性.
- true<===>false
- ~A<===>A
- ^<====>V
- 对偶性变换, 奇函数变换原则, 基于逆否<原命题与逆否命题真值表相同>
- 命题是对解题的简化. 简化题目规则和解题
- 二灯游戏, 使用卡诺图再进行简化
- 为什么要了解逻辑, 程序的运行方式: 基于逻辑
三,余数
- 解决不可数或难数的问题, 分组问题.
- 例如1: 今天星期天. 100天后的是星期几. 由于星期是7的重复. 因此 可用 7 来除, 达到分组的目的.
- 例如2: 数据库分表, 可以根据要分成几个表.然后用id/分表数, 得到余数, 来放置数据
- 找规律.
- 例如. 今天星期天. 10 的1000次方天之后是星期几?
10 的 1 次方 1 / 7 = 0 余 1 10 的 10 次方 10 / 7 = 1 余 3 10 的 100 次方 100 / 7 = 14 余 2 10 的 1000 次方 1000 / 7 = 142 余 6 10 的 10000 次方 10000 / 7 = 1428 余 4 10 的 100000 次方 100000 / 7 = 14285 余 5 10 的 1000000 次方 1000000 / 7 = 142857 余 1 10 的 10000000次方 10000000 / 7 = 142851 余 3 ... 可以发现每增加6个0,星期数相同.因此计算指数的余数即可.
- 例如. 1234567 的 7654321 次方的个位数是什么? 可以发现, 个位数只要看当前个位数即可, 和当前其他位的值是无关的. 所以相当于是 7 的 7654321 次方的各位数.
7 的 2 次方的个位 = 9 7 的 3 次方的个位 = 3 7 的 4 次方的个位 = 1 7 的 5 次方的个位 = 7 7 的 6 次方的个位 = 9 7 的 7 次方的个位 = 3 7 的 8 次方的个位 = 1 7 的 9 次方的个位 = 7 7 的 10次方的个位 = 9 ... 可以发现, 只要计算指数的余数即可找到对应的值.
- 例如. 今天星期天. 10 的1000次方天之后是星期几?
- 奇偶校验.
- 黑白棋魔术 : 不管原数是什么, 增加一位校验码, 使某些数的重复为偶数(或奇数,只要固定规则即可) , 那么如果发生错误, 就可以大概知道是否发生错误. 局限性: 只能对奇位数出错时有作用, 如果偶数位例如, 相邻两个值对调了. 是无法校验的.
- 多次重复同一动作的问题范例: 寻找恋人. 如图. 算出, 恋人在A的概率. 解: 不考虑路线, 着眼于目的地.那么有:
- 12个月前(0次移动),在G
- 11个月前(1次移动),在C,F,H 其中之一.
- 10个月前(2次移动),在B,D,E,G 其中之一.
- 9 个月前(3次移动),在A,C,F,H 其中之一.
- 8 个月前(4次移动),在B,D,E,G 其中之一.
- 7 个月前(3次移动),在A,C,F,H 其中之一.
- 6 个月前(4次移动),在B,D,E,G 其中之一.
- 发现,奇数次移动在A,C,F,H其中之一.偶数次移动在B,D,E,G其中之一,分成两个组..因此12个月.不在A上.概率为0.
- 一笔画: 七桥联通问题. (图论).要一次性走遍7桥.如图:
- 解法:简化为如图:
- 可以发现,要通过一个非终点和起点的点,该点必须偶次线连接,我们把线记位度数.即度数必须为2的倍数.奇点: 度数为奇数, 偶点: 度数为偶数.
- 那么,可以得出,如果起点和终点是同一个点,那么.所有点都必须为偶点.如果,起点和终点不是同一个点,那么,除了起点和终点是奇点,其他的必须为偶点.
- 可以得出,无法一次性走完
四, 数学归纳法 <证明法>:
- 证明步骤:
- 1) n=0 <起始> 时 成立,
- 2) 假设n=k 时, 命题成立, 那么如果n=k+1时也应该成立
- 即: 从个别数 n=0,1, 开始 推出一般性
- 例如,证明: G(n):0 到 n的整数之和等于 n*(n+1) /2
- n=0时G(0) 成立
- 假设n=k时,G(k)成立,即G(k)=k*(k+1)/2; 需要证明 G(k+1)=0+1+2+...+k+(k+1)=(k+1)(k+1+1)/2 成立;证明如下.
- 由G(k)得到G(k+1)左边结果为: k(k+1)/2 + (k+1) = (k+1)(k+1+2)/2 即等于(k+1)(k+1+1)/2 即右边的值.因此 G(k+1)也成立.
五,排列组合
- 排列组合置换: 解决计数问题
- 置换: n个事务按顺序排序 置换数: 有多少种
- 排列: n个中取出k个来排序, 有几种排序方法
- 组合: n个中取出k个来, 不进行排序 即 排列 / 置换数
六,递归
- 递归: 将复杂问题转换为较为简单的同类问题(解题法)
- 经典递归: 汉诺塔
- 递归与数学归纳法:
- 递归:一般是正确的,一直交给下一层,直到个别可以解决.从一般到具体
- 数学归纳:个别可以解,推断出一般.从个别到一般
- 递归和数学归纳.在代码中可能表现为递归函数和循环的互换.
- 如,我们在数学归纳那里的例子.求前n项的和.我们上次是证明,这次我们用递归定义出来.S(n) = 0 , [n=0时];S(n) = n+S(n+1) [n=1,2,3...时].
七,指数爆炸
- 1mm的纸,只需要对折39次,就达到了大约55完公里,远远超过地月距离39万公里。
- 指数运用: 二分法
- 询问一个人的生日在几号,最多只需要询问4次。
- 对数: 计算指数的工具
- 什么是对数,求 100000 即 10的5次方中0的个数(5个),就称作求100000的对数,也称作取对数。对数可以把庞大的数变为较小的数。100000的对数是5,以10为底,100000的对数是3.
- 在算法中的树,常见到对数的出现,注,不要和根号以及负次方混淆了,根号是1/2次方,而负次方则是正次方的倒数,不是为了求幂值。而对数是求幂值,对数是乘方的逆运算。
- 10² * 10¹ = 10 ³ 即 同底的指数相乘,可使用 幂相加. 那么写成对数为 ㏒10² + ㏒ 10¹ = ㏒ 10²*10¹ = ㏒ 10³ 即 , log(A* B) = log A + log B.
- 通过对数递增性: 例如对于 lgx=y 底数相同, 那么x大y就大
- 指数的运用: 密钥技术(相关知识书: 密码技术入门).
- 保护密码或者加密数据, 是用秘钥去加密解密(对称)的, 假设原文: XX 加密为 ?xzdad , 假设秘钥为3位,那么解这个密文, 只需要测试2³ =8次.
- 那么,如果秘钥长度是 512位呢? 则是 2的512次方,这是目前计算机短时间算力无法计算出来的.
八,不可解问题
- 此处的不可解:无穷,无限之类的命题。
- 反证法: 解决不可证或者无限问题问题的工具
- 遇到不可解问题,我们找出其否命题。证明命题其否定式真假, 即可得出原命题真假(真假性相反)
- 例如, 证明质数是无穷的。 (只能被1和本身整除的大于1的整数)。
- 假设质数是有限的,有限集写作 S = {2,3,5,7,...p}
- 将所有质数相乘,加1得Q, 即Q = 2*3*5*7...p+1; 因为质数是有限个的,所以这个Q的大小也是有限的。
- 而Q比所有质数相乘大1,因此Q不属于S集中,即Q不是质数。
- 然而,Q除以2,3,5,7,P中的任何一个数,余数都为1(不能整除),表明,Q只能被1和自身整除。因此Q是质数。
- 上面两个结论矛盾,因此质数是有限的命题是错误的。因此可以说明其否命题是真。即质数是无限的。
- 另一个简单的例子:证明,不存在最大的整数。
- 假设,存在最大的整数。
- 即该数为M,那么M+1也是整数,并且比M大。假设不成立。
九,评价
- 个人认为本书主要讲的是通过一些例题从而理解解题的思维,难能可贵的是讲的通俗易懂,是在读一些比较高阶的算法或者数学的入门好书
- 刚好最近要学算法导论, 在看算法导论之前花一点时间看一下这本书作为基础数学的复习和入门是挺好的。