《算法基础:打开算法之门》一1.1 正确性

简介:

本节书摘来自华章出版社《算法基础:打开算法之门》一书中的第1章,第1.1节,作者 [美]托马斯 H 科尔曼(Thomas H Cormen),更多章节内容可以访问云栖社区“华章计算机”公众号查看

1.1 正确性

产生问题的一个正确解决方案意味着什么呢?我们通常会精确地定义一个正确的解决方案涉及的内容。例如,为了寻找出最佳旅行路线,你的GPS会产生一个正确的解决方案。该方案可能是从你所在位置到目的地的所有可能路线中最快的路线,也可能是具有最短距离的路线,或者是能使你最快到达目的地同时也能免交过路费的路线。当然,你的GPS确定路线时所使用的信息可能不完全匹配实际情况。除非你的GPS能够获取实时路况信息,否则它可能假定穿过一条道路的时间等于道路的长度除以道路的限定时速。

然而,如果道路拥挤,当你在寻找一条最快路线时,GPS可能不能给你提供好的建议。然而,即使算法的输入是不正确的,我们仍然可以说GPS所提供的路线选择算法是正确的,即对于给定的输入,该路线选择算法输出最快的路线。然而,对于某些问题,可能难以判定甚至不可能判定一个算法是否产生了正确的输出。以光学字符识别为例。这个11×6像素的图像表示5还是S呢?
image

一些人可能会说它是5,而其他人可能说它是S,因此我们也不能判定计算机的输出是否正确。在本书中,我们将只关注有确定解的计算机算法。

然而,有些时候,我们可以接受可能会产生错误解的算法,只要产生错误解的频率可以被控制。加密算法就是一个范例。最常用的RSA加密系统依赖于确定大数是否为素数,这里的大数指相当大的数,如数百位那么长。如果你曾经写过一个计算机程序,你可能能够写出一个判定数n是否是素数的程序。它将测试从2到n-1的所有候选除数,如果这些候选除数中有一个除数确实能被n整除,那么n是合数。如果2和n-1之间的任何数均不能被n整除,那么n是素数。但是如果n是数百位长的数,那就会产生大量的候选除数,即使是一个运行相当快的计算机进行相应的检查操作也会超过合理的运行时间。当然,可以进行一些优化操作,例如当检测出2不是n的除数后,在候选除数中可以去除所有的偶数,或者循环到候选除数等于〖KF(]n〖KF)]时终止由于若d>〖KF(]n〖KF)],且n mod d=0,那么〖SX(]nd〖SX)]<〖KF(]n〖KF)],n mod (n/d)=0;这说明若n能整除一个大于〖KF(]n〖KF)]的数,则n也必定能够整除一个小于〖KF(]n〖KF)]的数。如果n是一个数百位的数,则尽管〖KF(]n〖KF)]的位数是数百位的一半,但是它仍然是一个非常大的数。好消息是,我们知道一个可以高效测试一个数是否是素数的算法。坏消息是,该算法可能会得出错误的结论。特别是,当该算法得出n是合数时,则n一定是一个合数,但是若该算法得出n是一个素数,n实际上也可能是一个合数。但是坏消息也不全不好,我们可以对其加以控制,使得错误率降到足够低,例如每执行250次才会出现一次错误。那是相当罕见的了——大约每千万亿次才出现一次错误——在RSA中应用这个方法来判定一个数是否是素数对于大多数人而言是安全的。对于另一类算法——近似算法,正确性也是一个需要着重考量的问题。近似算法适合于优化问题,即根据一些量化测度来寻找最优解的问题。例如GPS中寻找最快路径问题就是一个优化问题,它的量化测度是旅程中花费的时间。对某些问题,我们找不到任何可以在合理的时间内求解出最优解的算法,但是我们能够找到一个近似算法,它可以在合理的时间内求解得出一个近似的最优解。3“近似最优”就是近似算法输出的解的量化测度值介于最优解的量化测度值的一个已知因子之内。只要指定了目标因子,我们就可以说一个近似算法的正确解是任意一个量化测度值在最优解目标因子之内的解决方案。

相关文章
|
机器学习/深度学习 人工智能 算法
一文搞懂模型量化算法基础
一文搞懂模型量化算法基础
4047 0
|
算法 C语言
C语言算法基础-在一个单链表中值为y的结点前面插入一个值为x的结点
题目:3.4设计一个算法,在一个单链表中值为y的结点前面插入一个值为x的结点。即使值为x的新结点成为值为y的结点的前驱结点。 题目来自李云清版《数据结构》
315 5
C语言算法基础-在一个单链表中值为y的结点前面插入一个值为x的结点
|
算法 C语言
C语言算法基础-求单链表中带头结点的结点个数
题目:3.2 设计一个算法,求一个单链表中的结点个数。 来源李云清版《数据结构》
218 3
C语言算法基础-求单链表中带头结点的结点个数
|
算法 API
算法基础学习2——冒泡排序
要比较的每一对元素是相邻的,从下标为0开始,到最后一个元素,如果下标设为 j,则相邻元素下标值为 j +1,搜索到最后一个元素:j+1<a.length,而 a.length - 1 = i ;所以终止条件是 j < i
128 0
算法基础学习2——冒泡排序
|
机器学习/深度学习 算法 Java
算法基础学习1——时间复杂度和空间复杂度
算法基础学习1——时间复杂度和空间复杂度
125 0
算法基础学习1——时间复杂度和空间复杂度
|
搜索推荐 Java
Java基础数组-冒泡排序算法
Java基础数组-冒泡排序算法
Java基础数组-冒泡排序算法
|
存储 编解码 算法
【算法基础】希尔排序解析
希尔排序的基本思想是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
116 0
|
编解码 算法 网络协议
【算法基础】冒泡排序解析
在我们数组排序中,每一个数组元素根据大小比对,小的元素不断向前移动,如同气泡在冒出一样,我们称这种排序方法为冒泡排序。
168 0
|
机器学习/深度学习 编解码 算法
【算法基础】归并排序解析
归并排序是建立在归并操作上的一种有效,稳定的排序算法,它是采用分治法的一个非常典型的应用。将待排序数组分为两条线逐级拆分,将子序列进行排序,然后沿两条线逐级合并,得到完全有序序列。这种通过递归,层层合并的方法,称为归并。
170 0
|
存储 算法
算法基础
递归算法在计算机系统中用栈帮助实现,一般常见的算法有深度优先遍历(DFS),可以解决的问题有迷宫问题是否连通的问题,递推会对应一个递归搜索树,递归搜索树可以帮助我们更好的理解递归的流程,递归要注意的有是否可以进行剪枝,在迷宫问题中,也要考虑是否要保存原有的迷宫。
205 0
算法基础