算法的正确性
‘壹’ 一个好的算法应该具备哪些特征
一个好的算法应该具亩悔备以下特征:
正确性:算法应该正确地解决问题,并且没有明显的错误。
易于理解:算法应该清晰明了,容易理解,易于实现和调试。
可证明性:算法应该有明确的证明,证明其正确性和最优性。
效率:算法应该具有较高的效率,能够在可接受的时间内完成计算。
稳定性:算法的结果应该稳定,不会随着数据的变化而变化。
适用性:算法应该适用于不同的数据类型和规模
可源耐源扩展性:算法应该具有可扩展性,能够适应不断增长的数据量。
雹态
‘贰’ 在算法实现中,算法的正确性如何保证
算法本身的正确性用逻辑推理来证明,和数学定理类似
实现算法的程序的正确性则是两码事
简单的程序也用逻辑推理来证明,稍复杂的可以用某些专门验证程序正确性的程序来验证,再复杂的就没什么好办法了,事实上很多复杂的程序在比较极端的输入下或多或少都会有点问题
‘叁’ 算法的正确性证明方法一: 循环不变量
在之前的一篇文章里写到 算法的正确性 的概念以及它的作用,下面就来写写循环不变量在算法的正确性证明中的用法。
在使用循环的算法里,可以通过循环不变量证明其正确性。
所谓循环不变量是指一种在整个循环过程中保持不变的性质,它必须在以下3种情况下均保持不变,且该性质源困在循环终止后能证明算法的正确性。
接下来就 归并排序(Merge sort) 中的 merge 函数来说明一下循环不变量
先解释一下这个函数的作用,sld 和 srd 为已排序数组,大小分别为 lc 和 rc,循环 tc (lc + rc) 次把它们的元素进行比较并复制到新分配的数组 md 中,那要怎么证明这个算法的正确性呢。
让我们先设定循环不变量,然后看8-18行的循环能否在以上3种情况都满足这个循环不变量。
结束时循环不变量给了我们一个有用信息,此迟氏时 md 已经把 sld 和 srd 中全部元素合并排序了, 从雹旦念而证明了算法的正确性。
‘肆’ 设计算法的原则
设计算法的原则:
1、正确性:算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需要、能够得到问题的正确答案。
2、可读性:设计算法的目的,一方面是为了让计算机执行,但还有一个重要的目的就是为了便于他人的阅读,让人理解和交流,自己将来也可阅读。如果可读性不好,时间长了自己都不知道写了什么,可读性是评判算法(也包括实现它的程序代码)好坏很重要的标志。
3、健壮性:当输入的数据非法时,算法应当恰当地做出反应或进行相应处理,而不是莫名其妙的输出结果。并且处理出错的方法不应是中断程序的执行,而应是返回一个表示错误或错误性质的值,以便于在更高的抽象层次上进行处理。
4、高效率与低存储量:通常,算法的效率指的是算法的执行时间;算法的存储量指的是算法执行过程中所需要的最大存储空间,两者的复杂度都与问题的规模有关。算法分析的任务是对设计的每一个具体的算法,利用数学工具,讨论其复杂度,探讨具体算法对问题的适应性。
(4)算法的正确性扩展阅读:
算法的“正确”通常在用法上有很大的差别,大体分为以下4个层次:
1、算法程序没有语法错误;
2、算法程序能够根据正确的输入的值得到满足要求的输出结果;
3、算法程序能够根据错误的输出的值满足规格说明的输出结果;
4、算法程序对于精心设计、极其刁难的测试数据都能满足要求的输出结果。
对于这4层含义,层次要求最低,因为仅仅没有语法错误实在谈不上是好的算法。而层次(4)是最困难的,人们几乎不可能逐一验证所有的输入都得到正确的结果。因此,算法的正确性在大部分情况下都不可能用程序来证明,而是用数学方法证明的。
‘伍’ 一个算法的评价主要从哪些方面来考虑
一个算法的评价主要从以下几个方面来考虑:
1、时间复杂度
算法的时间复杂度是指执行算法所需要的计算工作量。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做。
T(n)=Ο(f(n))
因此,问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。
2、空间复杂度
算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。
3、正确性
算法的正确性是评价一个算法优劣的最重要的标准。
4、可读性
算法的可读性是指一个算法可供人们阅读的容易程度。
5、健壮性
健壮性是指一个算法对不合理数据输入的反应能力和处理能力,也称为容错性。
(5)算法的正确性扩展阅读:
算法可大致分为基本算法、数据结构的算法、数论与代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法,厄米变形模型,随机森林算法。
算法可以宏泛的分为三类:
一、有限的,确定性算法 这类算法在有限的一段时间内终止。他们可能要花很长时间来执行指定的任务,但仍将在一定的时间内终止。这类算法得出的结果常取决于输入值。
二、有限的,非确定算法 这类算法在有限的时间内终止。然而,对于一个(或一些)给定的数值,算法的结果并不是唯一的或确定的。
三、无限的算法 是那些由于没有定义终止定义条件,或定义的条件无法由输入的数据满足而不终止运行的算法。通常,无限算法的产生是由于未能确定的定义终止条件。
‘陆’ 算法及其特性有哪些
1.算法的重要特性(1)有穷性:一个算法必须在执行有穷步骤之后正常结束,而不能形成无穷循环。
(2)确定性:算法中的每一条指令必须有确切的含义,不能产生多义性。
(2)可行性:算法中的每一条指令必须是切实可执行的,即原则上可以通过已经实现的基本运算执行有限次来实现。
(4)输入:一个算法应该有零个或多个输入。
(5)输出:一个算法应该有一个或多个输出,这些输出是同输入有特定关系的量。
2.算法描述的方法(1)框图描述:该方法使用流程图或N-S图来描述算法。
(2)自然语言描述:该方法采用自然语言,同时添加高级程序设计语言如while、for和if等基本控制语句来描述算法。这类描述方法自然、简洁,但缺乏严谨性和结构性。
(2)类语言描述:这是介于程序设计语言和自然语言之间算法描述形式,其特征是突出算法设计的主体部分而有意忽略某些过于严格的语法细节,如类C或C++的伪语言。这种算法不能直接在计算机上运行,但专业设计人员经常使用它来描述算法,它具有容易编写、阅读和格式统一的特点。
(4)程序设计语言描述:采用某种高级程序设计语言(如C或C++)来描述。这是可以在计算机上运行并获得结果的算法描述。
本课程将采用伪C语言进行算法描述。
2.算法与程序的关系算法的含义与程序十分相似,但二者是有区别的。算法和程序都是用来表达解决问题的逻辑步骤;算法是对解决问题方法的具体描述,程序是算法在计算机中的具体实现;一个程序不一定满足有穷性(死循环),而算法一定满足有穷性;程序中的指令必须是机器可执行的,而算法中的指令则无此限制;一个算法若用计算机语言来书写,则它就可以是一个程序。因此,程序是算法,但算法不一定是程序。4.算法设计要求在算法设计中,对同一个问题可以设计出不同的求解算法。如何评价这些算法的优劣,从而为算法设计和选择提供可靠的依据?通常可从以下四个方面评价算法的质量:
(1)正确性:算法应该能够正确地执行预先规定的功能,并达到所期望的性能要求。
(2)可读性:算法应该好读,以有利于读者对程序的理解,便于调试和修改。
(2)健壮性:算法应具有容错处理。当输入非法数据时,算法应对其作出反应,而不是产生莫名其妙的输出结果。
(4)效率与低存储量需求:效率指的是算法执行的时间。对于同一个问题,如果有多种算法可以求解,执行时间短的算法效率高。算法存储量指的是算法执行过程中所需要的最大存储空间。高效率和低存储量这两者与问题的规模有关。
‘柒’ 算法的五个重要特性
算法的五个特征是:有穷性,确切性,输入项,输出项,可行性。实际上就以上五个特性是没法解释算法与程序的区别的。因为算法是程序的概述,程序是算法的实现,算法所具有的特性,程序都具有。如果没有算法的支持,程序只是一堆无序的代码。
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
形式化算法的概念部分源自尝试解决希尔伯特提出的判定问题,并在其后尝试定义有效计算性或者有效方法中成形。这些尝试包括库尔特·哥德尔、Jacques Herbrand和斯蒂芬·科尔·克莱尼分别于1930年、1934年和1935年提出的递归函数,阿隆佐·邱奇于1936年提出的λ演算,1936年Emil Leon Post的Formulation 1和艾伦·图灵1937年提出的图灵机。即使在当前,依然常有直觉想法难以定义为形式化算法的情况。