接下来的算法学习内容主要根据《程序员必读经典(算法基础+计算机系统)》一书而写,作为读书笔记,感兴趣的可以见参考文档阅读书籍详细内容。😁😁😁
关注算法缘由
最短路径算法:GPS寻找旅行路线
加密算法:安全网站网上购物
使用计算机算法解决计算问题时,我们会关注两个因素一个是给定问题,输入的正确性;第二是运行,算法能够有效利用计算资源。
- 正确性:一种算法是希望在一定时间找到正确结果,例如进行快速数学计算;另一种算法是近似算法,希望在合理的时间内得出一个近似的最优解。
- 资源利用:近似算法中,衡量效率的标准时间。(例如GPS寻找最佳线路。);占用计算机内存空间,包括其他资源。
描述计算机算法基础
线性查找:
程序:线性查找
输入:一个数组,要查找数组中某个元素个数,查找是否存在某个数值
输出:满足条件数值或者NOT-FOUND
线性查找就是从数组初始值逐步查找是否满足要求。
循环:
执行重复操作
迭代:
将每次循环操作称为循环的一次迭代
描述运行时间
运行时间可以表示成一个关于输入规模的函数。 前提假定每步单独的操作就会花掉不依赖于输入规模的固定时间。
表示运行时间时,所花费时间不同,但是花费时间存在上界与下界。例如在数量为n的数组A组寻找元素x,所需操作数最少为1,如果A【0】=x;操作数最多为n,如果A【n-1】=x。即使n的数量足够大,所需要的运行时间不能简单表示成关于n的函数。
但是可以用O(n)表示运行时间的上界,用Ω(n)表示运行时间的下界,Θ-符号、O-符号和Ω-符号这几个符号均是渐近符号。因为这些符号记录了随着变量近似趋向于无穷大时函数的增长趋势。所有这些渐近符号均使得我们去掉了低阶项和高阶项的常数因子,以便能够淡化不必要的细节而专注于主要方面:函数是如何随着n增长而变化的。
循环不变式
证明正确性的一个常用方法是使用循环不变式证明:即证明循环的每次迭代之前循环不变式为真。循环不变式能够帮助证明循环步骤正确性,关于循环不变式,包含以下3条性质:
初始化:循环的第一次迭代之前,它为真。
保持 :如果循环的每次迭代之前它为真,那么下次迭代之前它仍为真。
终止 :循环终止时,当它确实终止时,伴随循环终止的原因。
以BETTER-LINEAR-SEARCH算法为例,以下是一个循环不变式:
在第1步迭代开始时,如果数组A中存在x,那么x一定在A[i]~A[n]的子数组(数组的一段连续部分)中。
下面使用循环不变式来证明如果程序是在第2步中返回NOT-FOUND,那么数组中一定不包含x。
- 初始化:初始时,i=1,因此循环不变式的子数组是A[1]~A[n],此时代表整个数组。
- 保持:假定当前循环变量是i,在迭代开始时,如果数组A中包含x,那么它一定在从A[i]到A[n]的子数组中。如果执行这次循环迭代而没有返回值,我们能得出A[i]≠x,因此能确定地说如果x在数组A内,那么它一定出现在A[i+1]~A[n]的子数组内。因为i在下次迭代之前会自增1,所以循环不变式在下次迭代之前仍为真。
- 终止:循环一定会终止,或者因为程序会在第1A步返回,或者由于i>n。我们已经对程序因在第1A步返回而导致循环终止的情况进行了验证。
为了处理因i>n而导致循环终止的情况,我们依据循环不变式的等价性来证明。命题“如果A那么B”的逆否命题是“如果非B那么非A”。一个命题为真当且仅当与它等价的命题也为真。该循环不变式的等价命题为“如果x没有出现在A[i]~A[n]的子数组中,那么数组A中就不存在x”。
现在,当i>n时,A[i]~A[n]这个子数组为空。因此这个子数组中不可能包含x。因此,根据循环不变式的等价式,x不可能出现在数组A的任意位置上,因此第2步中返回NOT-FOUND是恰当的。
参考文档
【1】《程序员必读经典(算法基础+计算机系统)》;科尔曼,钱晓捷;机械工业出版社;2019.