程序员的数学

目录

1 数字0

如何定义\(10^0\)

不要死记其等于1。按规律来,\(10^3, 10^2, 10^1, 10^0\) ,每一个之间差了10倍,所以\(10^0=1\) 。\(10^{-1}\) 的结果同理。

  • 这不是 记忆力 的问题,而是 想象力 的问题。目的是 简化规则
  • \(0!=1\) 同理,简化递归规则 \(n!=n\times (n-1)!\) 即 \(1!=1\times 0!\)

0的作用:占位

用在按位计数法中,表示“没有”

  • 现实中经典案例:通过没有药效的药,填满每日的服药例程中;简化了服药规则,病人只需要每天按时吃药就行,无需记服药日期。

历史

  • 古埃及人:5进制和10进制混合计数,非按位计数法,不存在0
  • 巴比伦人:仅两种符号表示1和10,硬件条件限制(粘土板),容易刻画。采用10进制和60进制,1小时60分钟即来源于此
  • 玛雅人:从0开始数数,20进制
  • 罗马人:罗马表示法,5为一个单元
  • 印度人:十进制含0,现代计数源头;叫阿拉伯数字,是因为是阿拉伯学者将数字传入西欧。

2 逻辑

命题(proposition)的定义

能够判断对错的陈述句 叫做命题。同时满足true和false的不能称为命题,既不为true也不为false的也不能称为命题。

完整性及排他性

应用检查if语句逻辑

  • 数值类型通过在数轴上画清边界值,通过查看有无“重复”或“遗漏”,分别判断排他性或完整性。
  • 没有“遗漏”,具备完整性
  • 没有“重复”,具备排他性

图表表示

  • 真值表
  • 文氏图
  • 使用卡诺图简化逻辑

undefined

  • None and True is None

3 计数

集合数量

  • \(|A|\) 表示集合A的数量
  • 加法法则

    \[|A\cup B| = |A| + |B| - |A\cap B|\]

  • 乘法法则

    \[|A\times B| = |A|\times |B|\]

排列

使用类似条件概率属性图的方式可帮助理解

组合

先排列后去重,分母中的 \(k!\) 即为去重操作

4 递归

通过递推公式求递归解析式全靠猜,需要数感和想象力

找出递归结构

  1. 从整体问题中隐去部分问题
  2. 判断剩余部分是否和整体问题是同一类问题

分布式归并排序

distributed_mergesort.png 注意点:

  • 机器1、2、3都没有被分配排序的工作,只是在子结点的排序完成后进行有序数组的合并
  • 另一种可能的数据切分方式是,每台机器拿出一半的数据给另一台机器处理,而自己来完成剩下一半的数据。

MapReduce架构

mapreduce_architecture.png

  1. 数据分割是指将数据源进行切分,并将分片发送到 Mapper 上。
  2. 映射是指 Mapper 根据应用的需求,将内容按照 键 - 值 的匹配,存储到哈希结构中。
  3. 归约是指接受到的一组键值配对,如果是键内容相同的配对,就将它们的值归并。

注意点:

  • MapReduce 采用了哈希映射来分配数据,而普通的分治或递归不一定需要。
  • 由于哈希映射的关系,MapReduce 还需要洗牌的步骤,也就是将键 - 值的配对不断地发给对应的 Reducer 进行归约。
  • 在数据映射和洗牌之间,加入合并的过程,在每个 Mapper 节点上先进行一次 本地的归约

5 指数爆炸

对数

对数是解决指数爆炸的有效手段

  • 对数的作用之一是可以将乘法运算变为加减法,指数爆炸情况下更容易发现规律
  • 对数坐标轴:想象两个点同时乘以1.05倍,这1.05倍在坐标轴上的长度是一样的

涉及指数爆炸的四种处理方法

  • 穷举拼性能
  • 投机取巧,只需满足问题,变相求解;如哥尼斯堡七桥问题和铺设草席问题
  • 求近似解:看需求,实用性强
  • 概率求解:随机撞大运

6 解题思路

  1. 缩小问题规模(建议数字3和5)