0x01 开坑:简介
现今对数据处理的都是大量,大集合,所以简介一些离散数学
例如:
问题一
设一组N哥数而要确定其中第K个最大者,我们称之为选择问题,只要学过编程的所以这种解决的“直观方法”很多
方法一:比如冒泡,递减顺序,然后返回位置K上的元素。
方法二:把K个元素读入数组并递减排序,然后将剩下的元素再逐个读入,当新元素被读到时,如果他小于数组的第K个元素则忽略,否则将他放在数组中的正确位置,同时将原数组中的最后一个元素挤出数组。当算法终止时,位于第K个位置上的元素作为答案返回
这两种都算法都非常简单,算法那个更好,或者是两个算法够好吗?例如使用3000万个元素的随机文件和k=15000000进行模拟指出,两个算法在合理的时间内均不能结束计算;每种算法都需要计算机若干天才能算完(不过最终结果还是能够算出来的).
问题二
解决字谜(word puzzle)游戏。输入由一些字母构成的二维数组和一个单词表组成。目标是找出字谜中的所有单词。如下表格
NULL | 1 | 2 | 3 | 4 |
---|---|---|---|---|
1 | t | h | i | s |
2 | w | a | t | s |
3 | o | a | h | g |
4 | f | g | d | t |
可以组成的单词可以是 this,two,fat和that
现在有两种算法可以满足这个问题。
方法一:对单词表中的每个单词,我们检查每个有序三元组(行,列,方向),验证是否有单词的存在。这需要大量嵌套的for循环,但他基本上是直观的算法
方法二:对于每一个尚未越出迷板边缘的有序四元组(行,列,方向,字符数),我们可以检测是否所指的单词再单词表中。这也导致使用大量嵌套的for循环。如果任意单词中的最大字符数已知,那么该算法有可能节省一些时间。
上述的两种方法,解决上面哪一种题还好解,如果要解决行列都有16个字符,上面就两种算法就要花费相当可观的时间了,但还是有方法能快速解决。
上述两个问题都是都能简单的体现在大量或大集合的运行时间问题,如果我们能够估算程序的运行时间,尤其是在,如何在尚未编码的情况下比较两个程序的运行时间。我们还将显著的节约成本,以及集中精力的优化代码段。
0x02 指数
0x03 对数
在计算机科学中,除非有特别的声明,所有的对数都是以2为底的。
定义1
定理1
证明:
设
此时由对数定义
联合上面三个则得到
定理2
证明:
方法同上
由定义得
下面的的公式都可以推导
0x04 级数
级数又分几何级数和算数级数
几何级数:从第二项起,每一项是前一项的多少次方
算术级数:从第二项起,每一项均由前一项加一个常数所构成的序列。
几何级数
常用的两个公式为
其中公式2如果0<A<1则
公式推导
设S为总和
同样的方法可以计算
算数级数
例如:
转换成一
转换成二
答案相同哟
但,现在下面说的两个公式就不常见了
当K=-1时,公式2不成立。此时我们需要下面的公式,这个公式在计算机科学中使用要远比在数学其他科学中用的频繁。
调和数的和又叫做调和和
下面近似中误差趋向于
称为欧拉常数
一下两个公式一般的代数运算:
0x05 模运算
如果N整除A-B,那么我们就说A与B模N同余,记为
无论A还是B被N除去,所有余数都是相同的。类似
如同等式的情形
N常常为素数,对此,我们有3个重要的定理:
定理一:
如果N是素数,那么
定理二:
如果N是素数
定理三:
如果N是素数
0x06 证明方法
证明数据结构分析结论的最常用的方法是归纳法和反证法(偶尔不得已也是用胁迫式证明(proof by intimidation)。证明一个定理不成立的最好方法是举出一个反例
归纳法证明
归纳法进行证明有两个标准的部分
- 证明基准情形(base case)
- 就是确定定理对于某个(某些)小的(通常是退化的)值的正确性
- 归纳假设(inductive hypothesis)
- 它指的是假设定理对直到某个有限数K的所有情况都是成立的。然后使用这个假设证明定理对下一个值(通常是k+1)也是成立的至此定理得证(k是在有限的情况下)
举例证明:斐波那契数列
定理:
0x07 总结
已经很久没有复习数学了,这一次复习已经把很多数学知识捡起来了,心累。
网友评论