【算法】(1)概述

【算法】(1)概述

一、概述

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。

也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

是对某问题求解步骤的的描述。有输入输出,可以解决某一问题。

二、特征

一个算法应该具有以下五个重要的特征:

有穷性(Finiteness)、确切性(Definiteness)、输入项(Input)、输出项(Output)、可行性(Effectiveness)

  • 有穷性:算法的有穷性是指算法必须能在执行有限个步骤之后终止。
    某个算法一定具有有穷性,在有限步骤内可以完成该算法。

  • 确切性:算法的每一步骤必须有确切的定义。
    算法每一个步骤定义都是清晰准确的。

  • 输入项:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件。
    需要计算值的输入。

  • 输出项:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
    对输入值进行计算,然后将计算结果输出。

  • 可行性:算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成(也称之为有效性)。
    算法可以被分解为各个操作步骤,每一个操作步骤都可以在有限时间内完成。


三、要素

1.数据对象的运算和操作

计算机可以执行的基本操作是以指令的形式描述的。一个计算机系统能执行的所有指令的集合,成为该计算机系统的指令系统。
一个计算机的基本运算和操作有如下四类:算术运算、逻辑运算、关系运算、数据传输。

  • 算数运算:加、减、乘、除等运算。
  • 逻辑运算:或、与(且)、非等运算。
  • 关系运算:大于、小于、等于等运算。
  • 数据传输:赋值、输入、输出等运算。

一个算法有多个步骤。计算机可以执行的基本操作是以指令形式描述的,算法的所有步骤可以在计算机中变成能执行的指令集合。将每一个指令看成一个操作(运算 + 操作),该操作为对数据对象的操作(运算 + 操作)。

2.算法的控制结构

一个算法的功能结构不仅取决于所选用的操作,而且还与各操作之间的执行顺序有关。

一个算法的功能结构不能仅仅取决于所选的操作(运算 + 操作),而且还要与各个操作间的执行顺序(执行时间顺序)有关。

四、描述方式

描述算法的方法有多种,常用的有自然语言、结构化流程图、伪代码和PAD图(problem analysis diagram,问题分析图)等,其中最普遍的是流程图。

描述方式总结图表如下,我个人觉得伪代码可能更多也更容易理解些。

算法表示优点缺点
自然语言容易理解二义性,冗长
流程图直观易懂严密性不如为伪代码,灵活性不如自然语言
PAD图这种图转换为程序代码比较容易不如流程图易于执行。
伪代码简明扼要

五、评定优劣

同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。
一个算法的评价主要从时间复杂度和空间复杂度来考虑。

一个算法的优劣主要从以下两个方便来进行评定。

  • 时间复杂度:
    算法的时间复杂度是指执行算法所需要的计算工作量。
    通常用大“O”记法来表示时间复杂度。表示方式为:O(频度)。

  • 空间复杂度:
    算法的空间复杂度是指算法需要消耗的内存空间。


六、常用方法

递推法

递推是序列计算中的一种常用算法。它是按照一定的规律来计算序列中的每个项,通常是通过计算前面的一些项来得出序列中的指定项的值。

其思想是把一个复杂的庞大的计算过程转化为简单过程的多次重复,该算法利用了计算机速度快和不知疲倦的机器特点。

递推是从已有(已知)的数据(初时条件)出发,根据某种递推关系,逐步推出中间结果,推出最后结果。

递归法

程序调用自身的编程技巧称为递归(recursion)。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

注意:

  • (1) 递归就是在过程或函数里调用自身;
  • (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

函数自己调用自己,满足某个递归结束条件时结束调用。

穷举法

穷举法,或称为暴力破解法,其基本思路是:对于要解决的问题,列举出它的所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的解。它也常用于对于密码的破译,即将密码进行逐个推算直到找出真正的密码为止。例如一个已知是四位并且全部由数字组成的密码,其可能共有10000种组合,因此最多尝试10000次就能找到正确的密码。理论上利用这种方法可以破解任何一种密码,问题只在于如何缩短试误时间。因此有些人运用计算机来增加效率,有些人辅以字典来缩小密码组合的范围。

暴力破解。

贪心算法

贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。

用贪心法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,它省去了为找最优解要穷尽所有可能而必须耗费的大量时间,它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题, 通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。

分治法

分治法是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

分治法所能解决的问题一般具有以下几个特征:

  • (1) 该问题的规模缩小到一定的程度就可以容易地解决;
  • (2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
  • (3) 利用该问题分解出的子问题的解可以合并为该问题的解;
  • (4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

动态规划法

动态规划是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。动态规划的思想是多种算法的基础,被广泛应用于计算机科学和工程领域。

迭代法

迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代法又分为精确迭代和近似迭代。“二分法”和“牛顿迭代法”属于近似迭代法。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。

分支界限法

分枝界限法是一个用途十分广泛的算法,运用这种算法的技巧性很强,不同类型的问题解法也各不相同。

分支定界法的基本思想是对有约束条件的最优化问题的所有可行解(数目有限)空间进行搜索。该算法在具体执行时,把全部可行的解空间不断分割为越来越小的子集(称为分支),并为每个子集内的解的值计算一个下界或上界(称为定界)。在每次分支后,对凡是界限超出已知可行解值那些子集不再做进一步分支,这样,解的许多子集(即搜索树上的许多结点)就可以不予考虑了,从而缩小了搜索范围。这一过程一直进行到找出可行解为止,该可行解的值不大于任何子集的界限。因此这种算法一般可以求得最优解。

回溯法

回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

其基本思想是,在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。 若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。 而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。

参考

百度百科:https://baike.baidu.com/item/%E7%AE%97%E6%B3%95