当前位置: 首页 > news >正文

算法:程序员的数学读书笔记

目录

​0的故事

​一、按位计数法

二、不使用按位计数法的罗马数字

三、十进制转二进制​​​​​​​

​四、0所起到的作用​​​​​​​

逻辑

一、为何逻辑如此重要

二、兼顾完整性和排他性

三、逻辑

四、德摩根定律

五、真值表

六、文氏图

七、卡诺图

八、逻辑表达式

余数

一、余数

二、余数性质

三、更多思考题

四、奇偶校验

五、总结

数学归纳法

一、简介

二、说明

三、定义

排列组合

一、计数

二、计数方法

三、排列组合​​​​​​​

递归

一、开头

二、汉诺塔

三、阶乘

四、斐波那契数列(Fibonacci sequence)

五、分形图(fractale)

指数爆炸

一、指数爆炸

二、倍数游戏

三、二分法查找

四、对数

五、如何处理指数爆炸

六、总结


​0的故事

——无即是有

​一、按位计数法

生活中常见的计数法:

  • 10进制计数法:十进制计数法是世界各国常用的一种记数方法。也是我们从小学就开始学习的计数法。常说“满十进一”,这种以“十”为基数的进位制,叫做十进制。
  • 2进制计数法:一打啤酒是12瓶,每12瓶就是一打,这个就叫做十二进制。

  • 16进制计数法:“半斤八两”一词是个常用成语,很多人却忘了我们中国所用的称重单位斤和两,一斤=16两,每满16两是一斤,这就叫做十六进制。

编程中常见的计数法

  • 2进制计数法:二进位计数制仅用两个数码。0和1,所以,任何具有二个不同稳定状态的元件都可用来表示数的某一位。而在实际上具有两种明显稳定状态的元件很多。
  • 8进制计数法:使用的数字有0、1、2、3、4、5、6、7共 8种。80的位、81的位、82的位、83的位……(基数是8)
  • 16进制计数法:使用的数字有0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F共 16种。160的位、161的位、162的位、163的位……(基数是16)在16进制计数法中,使用 A、B、C、D、E、F(有时也使用小写字母 a、b、c、d、e、f)来表示 10以上的数字。

二、不使用按位计数法的罗马数字

罗马计数法的特征如下:

  • 数位没有意义,只表示数字本身。
  • 没有0。
  • 使用 I (1)、 v (5)、 X (10)、 L (50)、 C (100)、 D (500)、 M (1000)来记数。
  • 将并排的数字加起来,就是所表示的数。

例如,3个并排的1( I )表示3,并排的 V 和 I ( VI )表示6, VII 表示8。
罗马数字的加法很简单,只要将罗马数字并排写就可以得到它们的和。比如,要计算+2,只要将表示1的 I 和表示2的 I 并排写作皿就行了。但是,数字多了可就不太简单了。

​思考:为什么十二写成10而不是102?

N = a_{n}b^{n} + a_{n-1}b^{n-1} + ... + a_{1}b + a_{0}

0~15不同按位计数法表示:

二进制八进制十进制十六进制
0000
1111
10222
11333
100444
101555
110666
111777
10001088
10011199
10101210A
10111311B
11001412C
11011513D
11101614E
11111715F

三、十进制转二进制​​​​​​​

除二取余

​​​​​​​

​四、0所起到的作用​​​​​​​

0的作用:站位

在按位计数法中,数位具有很重要的意义。即使十位的数字“没有”,也不能不写数字。这时就轮到0出场了,即0的作用就是占位。换言之,0站着一个位置以保证数位高于它的数字不会产生错位。

0的作用:统一标准,简化规则

“0次方”,还将1特意表示成10的0次幂,能够将按位计数法的各个位数所对应的大小统一表示成10的n次幂。计算机中,计数也是从0开始。

日常生活中的0

日常生活中0表示“无”或“没有”。

逻辑

——真与假的二元世界

一、为何逻辑如此重要

逻辑是消除歧义的工具:

我们平时使用的语言——自然语言,是极易产生歧义的。就连“或者”一词,也不是只有一个正确意义。然而,规格说明书(记述如何编写程序文件)一般都是用自然语言描述的。因此,程序员必须走出自然语言歧义的迷宫,谨慎解读规格说明书,确定其正确的意义。“逻辑”,是消除自然语言歧义、严密准确地记还事物的工具。

二、兼顾完整性和排他性

  • 有没有“遗漏”
  • 有没有“重复”
  • 画一根数轴辅助思考
  • 注意边界值
  • 使用 if 语句分解问题
  • 逻辑的基本是两个分支

三、逻辑

  • 逻辑非!:不是 A
  • 逻辑与&,&&:A 并且 B 
  • 逻辑或|,||:A 或者 B
  • 异或:A 或者 B (但不都满足)
  • 相等==:A 和 B 相等
  • 蕴涵:若A 则 B

四、德摩根定律

  • 非(P 且 Q) = (非 P) 或 (非 Q)
  • 非(P 或 Q) = (非 P) 且 (非 Q)

真值证明

假设你要证明:

 (A v B) = A ^ B,则可构造真值表如下:

A

B

AvB

(AvB)

 A

 B

A^B

0

0

0

1

1

1

1

0

1

1

0

1

0

0

1

0

1

0

0

1

0

1

1

1

0

0

0

0

可见,在A和B的所有可能取值下, (A v B) 与  A ^ B 的值都相同,故要证明的式子成立。
对于 (A ^ B) =  A v B 的情形可以同样的方法证明。

逻辑证明

  • 设x属于Cu(A∪B)
  • 则x属于u却不属于A∪B
  • 所以x属于u却不属于A,也不属于B
  • 故x属于CuA且属于CuB
  • 故x属于CuA∩CuB
  • 反过来,式子仍然成立
  • 同理,另一式也成立

五、真值表

表征逻辑事件输入和输出之间全部可能状态的表格。列出命题公式真假值的表。通常以1表示真,0 表示假。命题公式的取值由组成命题公式的命题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。

​​​​​​​真值表是在逻辑中使用的一类数学表,用来确定一个表达式是否为真或有效。
表达式可以是论证:
表达式的合取,它的每个结合项(conjunct)都是最后要做的结论的一个前提。

六、文氏图

文氏图(英语:Venn diagram),或译Venn图、 [1]  温氏图、维恩图、范氏图,是在所谓的集合论(或者类的理论)数学分支中,在不太严格的意义下用以表示集合(或类)的一种草图。

它们用于展示在不同的事物群组(集合)之间的数学或逻辑联系,尤其适合用来表示集合(或)类之间的“大致关系”,它也常常被用来帮助推导(或理解推导过程)关于集合运算(或类运算)的一些规律。

七、卡诺图

卡诺图是逻辑函数的一种图形表示。卡诺图是一种平面方格图,每个小方格代表逻辑函数的一个最小项,故又称为最小项方格图。

方格图中相邻两个方格的两组变量取值相比,只有一个变量的取值发生变化,按照这一原则得出的方格图(全部方格构成正方形或长方形)就称为卡诺方格图,简称卡诺图。

八、逻辑表达式

用逻辑运算符将关系表达式或逻辑量连接起来的有意义的式子称为逻辑表达式。逻辑表达式的值是一个逻辑值,即“true”或“false”。C语言编译系统在给出逻辑运算结果时,以数字1表示“真”,以数字0表示“假”,但在判断一个量是否为“真”时,以0表示“假”,以非0表示“真”。

余数

——周期性与分组

一、余数

概念

余数就是做除法预算时剩下的数。周期性和分组是余数性质的体现。

作用

当数据很大时,找到规律,使用余数,获得正确的答案。也就是说,运用余数,大数值得问题就能简化成小数值问题。

二、余数性质

问题 : 今天是星期日,100天以后是星期几?

答案:100%7=2 星期二

周期性

一周有7天。每过7天,变循环到相同的星期数。

分组

余数的力量——将较大的数字除一次就能分组

数0~6分别代表星期日~星期六,为一组。

三、更多思考题

加大难度

问题 : 今天是星期日,10的100次幂天以后是星期几?

答案:100%6=4 星期四

可以直接计算吗?当然不行,数太大。那我们该怎么做?先不急求出答案,先找规律。

规律

1天以后                  1%7=1                   星期一

10天以后                10%7=3                 星期三

100天以后              100%7=2               星期二

1000天以后            1000%7=6             星期六

10000天以后          10000%7=4           星期四

100000天以后        100000%7=5         星期五

1000000天以后      1000000%7=1       星期一

省略…

余数以1,3,2,6,4,5…的顺序循环。

数0~5分别代表星期一、星期三,星期二、星期六、星期四、星期五为一组。

再加大难度

问题 : 1234567的987654321次幂个位数是多少?

答案:987654321%4=1 个位数为7

通过试算找出规律吗?1234567的2次幂,数就很大了。

那我们该怎么做?能影响乘方结果个位数的只有个位数。

规律

7的0次幂   1

7的1次幂   7

7的2次幂   9

7的3次幂   3

7的4次幂   1

7的5次幂   7

7的6次幂   9

省略…

个位以1,7,9,3…的顺序循环。

数0~3分别代表1、7,9、3为一组。

四、奇偶校验

作用

数据传输过程会受到外界干扰,造成数据的改变。通常让数据流的前面或者后面一位成为奇偶校验位,用来检测数据传输过程中是否发生变化。

奇校验

比如Ascll码,我们知道它使用了7位二进制表示了128个常用的字符。现在我们令它的最高位成为奇偶校验位。在发送前,通过改变奇偶校验位是0还是1,从而使得8位数据中1的个数为奇数。
比如0101011,它包含了4个1,在发送前,我们需要在最高位,也就是我们约定的奇偶校验位也加上一个1。如此一来,数据中总共包含了5个1。
在数据传输过程中,如果受到外界干扰,其中任意一个0变为1,则1的个数变为了偶数6。如果其中任意一个1变为了0,则1的个数也变为了偶数4。
如此一来,接收方便可以通过检查1的个数是否为奇数来确保数据是否发生了改变。如果检查的1的个数是奇数,就是正确的数据。如果是偶数,说明数据发生了改变,就丢弃它。

偶校验

偶校验和奇校验一样,这不过在发送的时候校验位要添加的值要确保数据中1的个数是偶数。然后再接收方要检查1的个数是不是偶数,如果是偶数,就是正确的数据,否则,数据发生了改变。

使用奇校验还是偶校验由通信双方规定。它们的区别在于,使用奇校验发送的数据中不会全是0。

五、总结

对于难以处理的庞大数值,只要发现其周期性并使用余数,就能够简化问题。此外,还可以根据余数结果的差异,将许多事物进行分组。只要运用奇偶性就能省略反复试验的过程。当我们“想要详细地研究”事物时,往往容易陷人“想正确把握所有细节”的思维。但是,像奇偶性校验那般,较之“正确地把握”,有时“准确地分类”更为有效。人们只要发现了周期性和奇偶性,就能将大问题转换为小问题来解决。余数就是其中一种重要的武器。

感兴趣的同学:

可以自行百度寻找恋人、铺设草席、哥尼斯堡七桥(一笔画)问题。

数学归纳法

——如何征服无穷数列

一、简介

数学归纳法是证明某断言对于0以上的所有整数(0,1,2,3,…)都成立的方法。0以上的整数0,1,2,3,…有无穷个,但若使用数学归纳法,只需要经过“两个步骤”,就能证明有关无穷的命题。

二、说明

1+2+3…+100?

大家都知道1加到100是5050。如果通过一步一步计算需要很长的时间。那么,有没有一个方法快速的求出答案。

德国数学家高斯(Karl Friedrich Gauss,1777-1855,后来成为了历史上著名的数学家。)在9岁时遇到了同样的问题,却马上得出了答案。当时他既没有计算器也没用计算机,是不是很厉害啊!那么,他究竟是怎么算出来的呢?

小高斯是这么想的:

1+2+3…+100正向计算和100+99+98…+1逆向计算的结果是相同的。那么,如果两者相加就是100个101,100×101=10100。再除于2,获得一半的值就是5050。真是妙不可言啊!

小哆啦是这么想的:

1+100是101,2+99也是101…

那么101有100÷2=50个

所以答案是101×50=5050

多米诺骨牌

想要推到所有的多米诺骨牌,我们会怎么做呢?

大家会说,把它们排成前面一个倒下就能顺次带倒下一个骨牌,推到第一个骨牌就可以了。是的,没错,就是这样。

以上两个案例,就体现了数学归纳法的“两个步骤”。

三、定义

数学归纳法是证明有关整数的断言对于0以上的所有整数(0,1,2,3,…)是否成立时,所用的方法。

假设现在要用数学归纳法来证明“断言 P ( n )对于0以上的所有整数 n 都成立”。数学归纳法要经过以下两个步骤进行证明。

  1. 基底( base ):证明“ P (0)成立”
  2. 归纳( induction ):要证明无论 k 为0以上的哪个整数,“若 P ( k )成立,则 P ( k + I )也成立”。

若步骤1和步骤2都能得到证明,就证明了“断言 P ( n )对于0以上的所有整数 n 都成立”。

排列组合

——解决计数问题的方法

一、计数

概念

有人会说:计数有什么概念可言,我们从小就学会“数数”,再简单不过了。但是,如果数非常大的时候,计数结果的正确性,我们就很难保证了。这时,我们就需要通过一些方法,获得正确的计数结果。计数就是通过加法法则、乘法法则、置换、排列、组合等计数方法。获得准确的计数结果。

注意

我们不需要死记硬背计数方法,而是注意这些方法是如何推导出来的。

注意“遗漏”和“重复”

计数和第二期内容讲的逻辑是一样的,遗漏就是没有数全所有的数,重复则和遗漏恰恰相反,是将已经数了的,又多数一次或几次。所以,有“遗漏”或“重复”,就不能获得准确的计数结果。

举个例子:

爸爸是大学毕业生,开发工程师

妈妈是大学毕业生,测试工程师

舅舅是高中毕业生,饭店老板

初中以上学历的学历的是3人,根据条件判断,不能有遗漏。即是大学毕业生,又是开发工程师的是1人,不能重复计算,因为是同一人。

注意不要忘记0

我们回顾一下,0所起到的作用。0的作用:站位、统一标准,简化规则。在计算机中,0起到非常重要的作用。不仅在二进制,排序、集合等等都有涉及。

问题 : 间隔1米站1位同学,那么10米需要几位同学?

需要11位同学,因为第一位同学不需要间距,10÷1是10是间隔数,而不是人数。本题和植树问题相似,不要忘记0的重要性。

二、计数方法

加法法则

要数出分为两个集合的事物时,可以使用加法法则。但是,加法法则只在集合中没有重复元素的条件下成立。也就是说,使用加法法则时,一定要注意是否有重复。

问题 : 1~13数字中2的倍数和6的倍数的有多少?

2的倍数有:2,4,6,8,10,12,共6个

3的倍数有:3,6,9,12,共4个

即是2的倍数,又是3的倍数有:6,12,共2个

因此有6+4-2=8

既不是2的倍数,也不是3的倍数。的倍数的个数,加上3的倍数的个数,再减去重复的个数,就是容斥原理(the rinciple of inclusion and exclusion)。这是“考虑了重复元素的加法法则”。在使用容斥原理时,必须弄清“重复的元素有多少”。这也是“认清计数对象性质”的一个例子。

乘法法则

需要根据两个集合进行“元素配对”时,可以使用乘法法则。

举2个例子:

  1. 大家都非常熟悉扑克牌,有4种花色,每个花色有A、2~10、J、Q、K,共13张牌。除大王牌,一共是4×13=52张牌。
  2. 有3个骰子,摇骰子,3个骰子摇出来的数,形成3位数,共能形成6×6×6=216种。也可以理解为6的3次幂,每个骰子出来的结果有1~6,6种情况,3个骰子就有6的3次幂种。

置换

将 n 个事物按顺序进行排列称为置换(substitution)。 

举个例子:

A、B、C这3张牌,有3×2×1=6种排法。因为第1张牌,可以从A、B、C任选。而第2张牌,只能从剩下2张牌中选,第3张牌没得选。

问题:扑克牌(不包括王牌)摆成一排,有多少种排法呢?

和↑例子,思路相同。

52!=52×51×50×…×1 数非常大

这里,52!称为52的阶乘(factorial),是因乘数呈阶梯状递减而得名。

0! 是多少呢?0还是1 

三、排列组合​​​​​​​

排列

排列(permutation)和置换类似,都需要考虑顺序。区别是置换是排序所有事物,而排序是从事物中拿出几个或多个进行排序。 

举个例子:

在上面置换例子的基础上,多了D和E两张牌,也就是有5张牌。从5张牌中,选择3张牌,有如下图所示种排法。P是排列首字母大写。

P_{5}^{3} = \frac{5!}{(5-3)!} = \frac{5 \times 4 \times 3 \times 2 \times 1}{2 \times 1} = 5 \times 4 \times 3

组合

组合(combination)和置换、排列不同,不考虑排序,内容一样就是相同。

举个例子:

5张里面取3张的组合的总数写作C_{5}^{3}(C是combination的首字母。)计算如下。

5张里面取3张的组合的总数 = 5张里面取3张的排列总数(考虑顺序排列的数) / 3张的置换总数(重复度)\frac{P_{5}^{3}}{P_{3}^{3}} = \frac{5 \times 4 \times 3 }{3 \times 2 \times 1} = 10​​​​​​​

置换、排列和组合的关系

  • 置换:可以看作是排列的一个特例,即当排列中选取的元素数目等于集合中元素的总数时,排列就变成了置换。
  • 排列和组合:虽然都涉及从n个不同元素中取出m个元素,但排列关注的是元素的有序排列,而组合关注的是元素的无序组合。简单来说,排列是需要考虑顺序的;组合不需要考虑顺序,仅考虑选择对象。​​​​​​​

递归

——自己定义自己

一、开头

“GUN is Not UNIX”,这里GUN是什么的缩写?是“GUN is Not UNIX”的缩写。那第一个单词GUN是什么的缩写?那也是“GUN is Not UNIX”的缩写。是不是一脸懵,这就是递归。在开发中,常常使用递归,方法调用自己。使用递归时,要注意逻辑,不然有可能死循环。

二、汉诺塔

有可能大家没有听说过“汉诺塔”这个词汇。但是,大家一定玩过或听说过这个游戏。是一个由法国数学家爱德华.卢卡斯(Edourd Lucas)于1883年发明的游戏。

​​​​​​​

游戏规则

有3个柱子,1个柱子上有圆盘,从上往下,圆盘逐渐变大。需要把所有的圆盘从一个柱子上,移动到另一个柱子上。

  • 规则1:一次只能移动一个圆盘。
  • 规则2:圆盘上不能放置比自己大的圆盘。

问题 : n层汉诺塔,至少要移动多少次呢?

2的n次幂减1

我们先笼统的看一下,需要进行的步骤。因为,规则2的限制,需要将最大圆盘以上的圆盘,移动到临时柱子上。我们先将n-1层汉诺塔的移动次数,用H(n-1)函数表示。最大圆盘,只要移动一次,就能放到目标柱子上。然后,我们需要将剩余的圆盘,从临时柱子上,移动到目标柱子。同样,用H(n-1)函数表示。所以,总的移动次数H(n)=H(n-1)+1+H(n-1)。我们将这种 H(n) 和 H(n-1) 的关系式称为递推公式(recursion relation , recurrence)。

我们先依次计算一下:

0个圆盘,H(0)=0,没有圆盘,不需要移动。

1个圆盘,H(1)=H(0)+1+H(0)=0+1+0=1,只需要移动最大圆盘。

2个圆盘,H(2)=H(1)+1+H(1)=1+1+1=3,需要将上面的圆盘先移动到临时柱子,再移动到目标柱子。

3个圆盘,H(3)=H(2)+1+H(2)=3+1+3=7

6个圆盘,H(6)=H(6)+1+H(6)=31+1+31=63

在来回移动圆盘的过程中,你一定会觉得“在重复做相似的事情”。之所以会产生这种感觉是因为我们有“发现规律的能力”。这种感觉很重要。

我们看一下,依次计算结果:0,1,3,7,15,31,63…

我相信直觉敏锐且聪明的你,已经找到规律:

  0  =  1 - 1

  1  =  2 - 1

  3  =  4 - 1

63  =  64 - 1

获得表达式H(n)=2的n次幂-1,这种只使用 n 表示 H(n) 的式子叫作解析式。

总结

将 n 层汉诺塔转换为 n-1 层汉诺塔的问题,即在问题中找出递归结构。虽然不知道 H(n-1) 的结果,但将它当作“已知条件”来运用。接下来就根据递推结构建立递推公式,求出答案。这就是递归的思维方式。

三、阶乘

我们先看一下,上一期遗留的问题。

n! = n × (n-1) × (n-2) × … × 2 × 1

按照↑的定义,似乎“0的阶乘”意义不明确。

递归定义阶乘

阶乘的递推结构:

n! = n × (n-1)!

阶乘的递推公式:

3! = 3 × 2!

2! = 2 × 1!

1! = 1 × 0!

0! = 1

为了顺利进行上诉递归定义,所以 0! = 1。大家是否发现阶乘的递归定义和数学归纳法比较类似呢?n=0时相当于数学归纳法的步骤1(基底), n >1时相当于步骤2(归纳)。若用多米诺骨牌来打比方,“正确地定义0!”就相当于“确保推倒第1张多米诺骨牌”。

递归(recursion)和归纳(induction)在本质上是相同的,都是“将复杂问题简化”。

四、斐波那契数列(Fibonacci sequence)

数列0,1,1,2,3,5,8,13,21,34,55,89,… 是在13世纪由数学家斐波那契(Leonardo Fibonacci 1170-1250)发现的,因此被命名为斐波那契数列。

斐波那契数列,只要是程序员,都会了解并掌握。原题是不断繁殖的动物,动物出生后,第二天开始每天1只的速度繁殖下一代,不考虑死亡。动物数量呈爆发式增长。

递归思路和汉诺塔相近且网上有很多。

F(n) = F(n-1) + F(n-2)

F(0) = 0

F(1) = 1

F(2) = F(n-1) + F(n-2) = 1 + 0 = 1

F(3) = F(n-1) + F(n-2) = 1 + 1 = 2

感兴趣的同学:

可以继续计算一下,还可以百度摆砖头、创作旋律等递归。

五、分形图(fractale)

含有递归结构的递归图形叫做分形图。插入图片来自于网络。

杨辉三角(帕斯卡三角形)

百度百科解释:杨辉三角,是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形(Pascal's triangle)。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。

谢尔平斯基三角形

谢尔平斯基三角形(英语:Sierpinski triangle)是一种分形,由波兰数学家谢尔宾斯基在1915年提出。

递归图形

感兴趣的同学:

还有很多很多递归图形,可以自行查找。

指数爆炸

——如何解决复杂问题

一、指数爆炸

概念

“指数爆炸”,所谓爆炸,其实不是真的爆炸。指数爆炸(blow up),是一个数学术语,即指数函数的 “爆炸性” 增长。如果遇到的问题中包含指数爆炸就要多加注意了。因为一旦处理不好,该问题可能会膨胀到难以收拾的地步。相反,若能巧妙利用 “指数爆炸”,它将成为解决难题的有力武器。

我们先来体验一下指数爆炸的威力。

​​​​​​​

问题:假设现在有一张厚度为 1 mm 的纸,纸质非常柔软,可以对折无数次。毎对折1次,厚度便翻一番。已知地球距月球约 390000 km,请问对折多少次后厚度能超过地月距离呢?

◆提示
这个问题看上去有点异想天开。即从 1 mm 开始,反复进行厚度翻倍的 “倍数游戏”,要重复多少次才能超过 390000 km。

我们先凭感觉估计一下,需要对折多少次才能达到月球。一万次差不多吧?哈哈 学过的小伙伴们,应该已经知道答案了。经过计算发现,仅仅对折 39 次,就让 1 mm 的纸的厚度达到了地球到月球的距离,实在是让人大吃一惊!

仅仅反复 “折纸”,数值不断翻倍,就很快得出了非常庞大的数值。我们把这种数值息这增长的情况称为指数爆炸。之所以称为指数爆炸是因为折纸时厚度(2的n次幂)的指数 n 就是对折次数。根据上下文,也可以称为指数式增长。

虽然把 1 mm 的纸,仅仅对折 39 次,就能从地球到达月球。但是,我们对折 8 次,已经是极限。所以,对折 39 次,只是理论上来说是可以达到的,而现实是做不到的。如同,给我一个支点就能撑起整个地球。

二、倍数游戏

指数爆炸引发的难题

我们开发程序往往都需要测试,如果测试不完备,就会遗留Bug,程序就有可能崩溃(crash)或挂起(freeze)。

举个例子:

程序中有多个按钮,每个按钮都有ON、OFF两种状态,即开和关。每一种开关组合,对应一个指令,也可以说是功能。按钮个数为 3 个时,只有 8 种组合。但是,如果有 30 个按钮,就如折纸一样,会有爆炸性增长。30 个按钮说起来不多,开关组合却达到了 10亿 以上。综上所述,穷尽测试是不现实的。因此,通常在软件开发中不进行这种 “一个不漏” 的全覆盖测试,而是只挑选出可能对功能有影响的按钮进行测试。这时,如何选出要测试的范围是很重要的。

三、二分法查找

利用指数爆炸

二分法查找(binary search)是在有序数据中找出目标数据时“总是判断目标数据所在范围内正中间数据”的方法。也叫作 “二分法” “二分查找”。“二分法查找” 的递推公式和“汉诺塔”的递推公式相同,不过 n = 0 时的值不同。P(n) = 2的n+1次幂 - 1,通过 n 次查找,可以在(2的n+1次幂 - 1)数中找到答案。

“二分法查找” 使用了指数爆炸的方法进行查找,这句话的意思是每次查找查找范围会缩小一半儿。换言之,每判断 1 次就能从近 2 倍的查找对象中找出目标数据。

四、对数

掌握指数爆炸的工具

一旦发生指数爆炸,数字就会变得非常大。数字非常庞大,书写和处理起来非常麻烦。我们总是会把复杂的问题,转换为多个简单的问题或换一种方式来解决。

16、17世纪之交,随着天文、航海、工程、贸易以及军事的发展,改进数字计算方法成了当务之急。约翰·纳皮尔(John Napier,1550~1617)正是在研究天文学的过程中,为了简化其中的计算而发明了对数。

下面就是对数的表达式:

\chi = log_{\alpha N}

log 是 logarithm 的缩写,意为对数。x 叫做对数,a 叫做对数的底(基数),N叫做真数。a 为 10、N 为 100000 时,x 就等于 5。或许一看到算式,你觉得内容一下子变难理解了,其实只要理解为 “对数是乘方的逆运算”,就不难理解了。

算尺(slide rule),或计算尺,即对数计算尺,是一种模拟计算机,通常由三个互相锁定的有刻度的长条和一个滑动窗口(称为游标)组成。在1970年代之前使用广泛,之后被电子计算器所取代,成为过时技术。

五、如何处理指数爆炸

遇到任何问题,只要具备 “判断是否已成功破解的方法” 和 “按顺序试解的步骤” 就可以使用暴力破解法。人工智能的先驱马文·明斯基( Marvin Minsky )将其命名为 “解迷原理”。

四种处理方法

  • 极力求解
  • 变相求解
  • 近似求解
  • 概率求解

六、总结

随着时代的发展,计算机也在飞速的发展,处理数据越来越快。比方说,暴力破解密码,从理论上来说是可以的。但是,需要很长的时间,不符合我们的要求。同样,数据以指数爆炸增长的时代,暴力查找目标数据是不现实的。

我们用手机、电脑等电子产品,都追求流畅。所以,如何快速的处理庞大的数据,非常的关键。即使CPU处理速度非常快,暴力查找目标数据也会耗费很长的时间。我们可以利用指数爆炸,来减少查找目标数据次数(二分法查找),也可以进行加密。

二分法查找,虽然大大缩短查找时间。但是,必须满足有序的的条件。所以,不能满足所有的查找。算法就是一种提高计算效率的方法,满足我们即快速又准确处理数据的要求。

在生活中,也是同样的道理。遇到问题,我们应该先考虑,同样的问题是不是已经有解决的办法。如果有办法,就按部就班,可以快速解决问题。如果没有,就考虑怎样把问题转换为我们可以解决的小问题,把问题逐个击破。

相关文章:

算法:程序员的数学读书笔记

目录 ​0的故事 ​一、按位计数法 二、不使用按位计数法的罗马数字 三、十进制转二进制​​​​​​​ ​四、0所起到的作用​​​​​​​ 逻辑 一、为何逻辑如此重要 二、兼顾完整性和排他性 三、逻辑 四、德摩根定律 五、真值表 六、文氏图 七、卡诺图 八、逻…...

机器学习算法---时间序列

类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统计学检验箱…...

RK3568/RV1126/RV1109/RV1106 ISP调试方案

最近一直在做瑞芯微rv1126的开发,由于项目性质,与camera打的交道比较多,包括图像的采集,ISP处理,图像处理,H.264/H.265编解码等各个方面吧。学到了不少,在学习的过程中,也得到了不少…...

【TB作品】51单片机,语音出租车计价器

西交大题目 1.语音出租车计价器 一、功能要求: 1.具有可模拟出租车车轮转速传感器的硬件设计,可计量出租车所走的公 里数。 2.显示和语音播报里程、价格和等待红灯或堵车的计时价格: 3.具有等待计时功能 4.具有实时年月日显示和切换功能。 5.操作简单、界面友好。 二、设计建议…...

jmeter简单压测kafka

前言 这也是一个笔记,就是计划用jmeter做性能测试,但是这里是只要将数据放到kafka的topic里,后面查看下游业务处理能力。 一、方案 因为只要实现数据放到kafka,参考了下博友的方案,可行。 二、方案验证 详细过程就不…...

【漏洞复现】红帆OA iorepsavexml.aspx文件上传漏洞

漏洞描述 广州红帆科技深耕医疗行业20余年,专注医院行政管控,与企业微信、阿里钉钉全方位结合,推出web移动一体化办公解决方案——iOffice20(医微云)。提供行政办公、专业科室应用、决策辅助等信息化工具,采取平台化管理模式,取代医疗机构过往多系统分散式管理,实现医…...

04_Web框架之Django一

Web框架之Django一 学习目标和内容 1、能够描述Django的作用 2、能够使用Django创建应用 3、能够使用GET和POST请求方式进行传参 4、能够使用Django的函数式方法定义视图 5、能够进行Django的配置文件修改 6、能够基本使用Django的路由定义 一、Django相关介绍 1、什么是Djan…...

单机架构到分布式架构的演变

目录 1.单机架构 2.应用数据分离架构 3.应用服务集群架构 4.读写分离 / 主从分离架构 5.引入缓存 —— 冷热分离架构 6.垂直分库 7.业务拆分 —— 微服务 8.容器化引入——容器编排架构 总结 1.单机架构 初期,我们需要利用我们精干的技术团队,快…...

1.新入手的32位单片机资源和资料总览

前言: 学了将近1年的linux驱动和uboot,感觉反馈不足,主要是一直在学各种框架,而且也遇到了门槛,比如驱动部分,还不能随心所欲地编程,原因是有些外设的原理还不够深刻、有些复杂的底层驱动的代码…...

jmeter判断’响应断言‘两个变量对象是否相等

1、首先需要设置变量,json、正则、csv文件等变量 2、然后在响应断言中 ①JMeter Variable Name to use —— 输入一个变量,变量名即可 ② 模式匹配规则 ——相等 ③测试模式 ——输入引用的变量命${变量名} (注意这里是需要添加一个测试模式…...

【Linux基础命令使用】

文章目录 一. 操作系统和文件及文件路径介绍二. 基础指令介绍三. 结束语 一. 操作系统和文件及文件路径介绍 什么是操作系统?操作系统是一款进行软硬件资源管理的软件为什么要进行软硬件资源管理?对上提供良好的稳定的运行服务----工具Linux指令和图形化…...

【JNA与C++基本使用示例】

JNA中java与C使用注意事项和代码示例 JNA关系映射表使用案列注意代码示例C代码java代码 JNA关系映射表 使用案列 注意 JNA只支持C方式的dll使用C的char* 作为返回值时,需要返回的变量为malloc分配的地址C的strlen函数只获得除/0以外的字符串长度 代码示例 C代码…...

HttpRunner接口自动化测试框架

简介 HttpRunner是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。 项目地址:GitHub - httprunner/httprunner: HttpRunner 是一个开源的 API/UI…...

云计算:Vmware 安装 FreeNAS

目录 一、实验 1.Vmware 安装 FreeNAS 2.配置Web界面 二、问题 1.iSCSI如何限定名称 2.LUN和LVM的区别 一、实验 1.Vmware 安装 FreeNAS (1)环境准备 VMware Workstation 17 FreeNAS相关安装部署镜像: 官网地址: https://download…...

数据库交付运维高级工程师-腾讯云TDSQL

数据库交付运维高级工程师-腾讯云TDSQL上机指导,付费指导,暂定99...

目标检测YOLO实战应用案例100讲-光伏电站热斑检测(续)

目录 2.5 图像重建方法实验及其结果分析 2.5.1 数据集与超参数 2.5.2 结果分析...

jmeter如何循环运行到csv文件最后一行后停止

1、首先在线程组中设置’循环次数‘–勾选永远 2、csv数据文件设置中设置: 遇到文件结束符再次循环?——改为:False 遇到文件结束符停止线程?——改为:True 3、再次运行就会根据文档的行数运行数据 (如果需要在循环控制器中&…...

电路中的屏蔽罩作用及设计

1.1 屏蔽罩作用 1.1.1 屏蔽电子信号,防止外界的干扰或内部向外的辐射: 一般见于通信类电路PCB,主要一个无线通信产品上有的敏感器件、模拟、数字电路、DCDC电源电路,都需屏蔽隔离,是为了不影响其它电路,也有防止其它电…...

CodeBlocks定义异常:multiple definition of 和 first defined here

基于链表实现贪吃蛇案例时候,在CodeBlocks的CPP源文件定义函数和全局变量均报错 异常现象 在**自定义的cpp**文件定义全局变量、对象、函数等均出现重复定义和首次定义 multiple definition of Controller::showCopy() first defined here 异常解决方案 正确代码…...

RHEL7.5编译openssl1.1.1w源码包到rpm包

openssl1.1.1w下载地址 https://www.openssl.org/source/ 安装依赖包 yum -y install curl which make gcc perl perl-WWW-Curl rpm-build wget http://mirrors.aliyun.com/centos-vault/7.5.1804/os/x86_64/Packages/perl-WWW-Curl-4.15-13.el7.x86_64.rpm rpm -ivh pe…...

结构型设计模式(二)装饰器模式 适配器模式

装饰器模式 Decorator 1、什么是装饰器模式 装饰器模式允许通过将对象放入特殊的包装对象中来为原始对象添加新的行为。这种模式是一种结构型模式,因为它通过改变结构来改变被装饰对象的行为。它涉及到一组装饰器类,这些类用来包装具体组件。 2、为什…...

C#数据结构

C#数据结构 常见结构 1、集合 2、线性结构 3、树形结构 4、图形结构 Array/ArrayList/List 特点:内存上连续存储,节约空间,可以索引访问,读取快,增删慢 using System; namespace ArrayApplication {class MyAr…...

代码随想Day39 | 62.不同路径、63. 不同路径 II

62.不同路径 每次向右或者向下走两个选择,定义dp数组dp[i][j] 为到达索引ij的路径和,状态转移公式为 dp[i][j]dp[i-1][j]dp[i][j-1],初始状态的第一行和第一列为1,从左上到右下开始遍历即可。详细代码如下: class Sol…...

Autosar通信实战系列07-Com模块要点及其配置介绍(二)

本文框架 前言1. ComGeneral配置2. ComConfig配置2.1 ComGwMapping2.2 ComIPdus2.3 ComIPduGroups2.4 ComIPduSignals2.5 ComIPduSignalGroups2.6 ComTimeBasis前言 在本系列笔者将结合工作中对通信实战部分的应用经验进一步介绍常用,包括但不限于通信各模块的开发教程,代码…...

DSP捕获输入简单笔记

之前使用stm32的大概原理是: 输入引脚输入一个脉冲,捕获1开始极性捕获,捕获的是从启动捕获功能开始计数,捕获的是当前的计数值; 例如一个脉冲,捕获1捕获上升沿,捕获2捕获下降沿;而两…...

【Java基础】HashMap 原理

文章目录 1、HashMap 设置值的原理2、HashMap 获取值原理3、HashMap Hash优化4、HashMap 寻址优化5、HashMap 是如何解决Hash冲突的?5.1 get数据的时候,如果定位到指定位置的元素是一个链表,怎么办呢?5.2 红黑树 6、数组扩容6.1 数…...

vue3的大致使用

<template><div class"login_wrap"><div class"form_wrap"> <!-- 账号输入--> <el-form ref"formRef" :model"user" class"demo-dynamic" > <!--prop要跟属性名称对应-->…...

什么是计算机网络?计算机网络基础知识

1.网络的组成部分&#xff1a;由主机&#xff0c;路由器&#xff0c;交换机等组成 2.网络结构&#xff1a;网络的网络 3.信息交换方式&#xff1a;电路交换和分组交换 4.网络分层&#xff1a;分清职责&#xff0c;物理层&#xff0c;链路层&#xff0c;网络层&#xff0c;运…...

【机器学习 | 假设检验系列】假设检验系列—卡方检验(详细案例,数学公式原理推导),最常被忽视得假设检验确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…...

RealBasicVSR高清处理视频

autodl做了镜像&#xff1a;高清RealBasicVSR 首先在剪映将视频剪好导出&#xff0c;最多是720像素的&#xff0c;不然后面超分的时候会爆显存。剪映视频也最好是双数帧数结尾的&#xff0c;不然超分的时候单数图片会报错->RuntimeError: non-empty 3D or 4D input tensor …...

宁波外贸公司为什么这么多/seo关键词排名优化如何

2019独角兽企业重金招聘Python工程师标准>>> 本文是从FISCO-BCOS的官方GitHub中的安装包进行安装的记录过程 1. Node.js环境准备 #nodejs安装 nvm curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash source ~/.bashrc nvm ins…...

手机上怎么做微电影网站/好项目推荐平台

百度的对话式 AI 领先能力获世界级认可。近日&#xff0c;全球权威的技术研究与咨询机构 Gartner 发布《竞争格局报告&#xff1a;对话式 AI 平台》报告&#xff0c;百度成为国内唯一入围的供应商&#xff0c;在对话式人工智能领域处于市场领先地位。 ▲ Gartner 发布《竞争格局…...

360网站建设/西安seo培训

成为Excel精英真不容易啊&#xff0c;正则表达式必须拿下&#xff01; ()可以让括号内作为一个整体产生重复Sub t29()Dim regx As New RegExpDim srsr "A3A3QA3A37BDFE87A8"With regx.Global True.Pattern "((A3){2})" 相当于A3A3Debug.Print .Replace(…...

如何做微网站平台/百度世界排名

ios操作系统的流畅度非常的高&#xff0c;因此人们都愿意购买 苹果 的手机。大家都知道苹果智能手机的售价是非常昂贵的&#xff0c;并不是社会上每一个人都可以负担得起的。有非常多的消费者为了可以达到非常好的操作体验&#xff0c;因此有非常多人们都会购买安卓智能手机&am…...

在线看网站源码/怎样才能注册自己的网站

结构图 流程图 审批节点设置(使用流程变量 # 或 $ 均可) 示例代码 package cn.itcast.k_personalTask;import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map;import org.activiti.engine.ProcessEngine; import org.activi…...

网站栏目关键词/超级外链

java中map的取值 博客分类&#xff1a; java基础 mapvaluejava package com.itcast.map; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import org.junit.Test; public class MapTest { /** * 取得Map里面的值的两种方…...