算法基本概念

算法(Algorithm)
是对待问题求解步骤的一种描述,他是指令的有限序列,其中每一条指令表示一个或多个操作。
特性:
(1)有穷性(Finiteness)。一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都在有穷时间内完成。
(2)确定性(Definitess)。算法中的每一套指令必须有确切的含义,理解时不会产生二义性。并且在任何条件下,算法只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出。
(3)可执行性(Effectiveness)。一个算法是可行的,即算法中的描述的操作都可以通过已经实现的基本运算执行有限次来实现。
(4)输入(Input)。一个算法有零个或多个输入,这些输入取自于某个特定的对象的集合。
(5)输出(Output)。一个算法有一个或多个输出,这些输出是同输入有着某些特定关系的量。

常用的表示算法的方法有自然语言、流程图、程序设计语言和伪代码等。
(1)自然语言。优点容易理解,缺点容易出现二义性,并且算法通常很冗长。
(2)流程图。优点直观易懂,缺点严密性不如程序设计语言,灵活性不如自然语言。
(3)程序设计语言。优点能用计算机直接执行,缺点抽象性差。
(4)伪代码。伪代码介于自然语言和程序设计语言之间的方法,它采用某一程序设计语言的基本语法,同时结合自然语言来表达。

不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
时间复杂度
算法的时间复杂度是指执行算法所需要的计算工作量。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做。
空间复杂度
算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。

常用的算法设计技术主要有分治法、动态规划法、贪心法、回溯法、分支限界法、概率算法和近似算法等。
分治法
分治法是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
分治法所能解决的问题一般具有以下几个特征:
(1) 该问题的规模缩小到一定的程度就可以容易地解决;
(2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
(3) 利用该问题分解出的子问题的解可以合并为该问题的解;
(4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
动态规划法
用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。
步骤:1、找出最优解的性质,并刻画其结构特征。
2、递归地定义最优解的值。
3、以自底向上的方式计算出最优值。
4、根据计算最优值时得到的信息,构造一个最优解。
动态规划适用的问题的性质。
1、最优子结构。如果一个问题的最优解中包含了其子问题的最优解,就说该问题具有最优子结构。
2、重叠子问题。重叠子问题只用来解原问题的递归算法可反复地解同样的子问题,而不是总在产生新的子问题。
贪心法
贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。
和动态规划法一样,贪心法也经常用于解决最优化问题。与动态规划法不同的是,贪心法在解决问题的策略上是仅根据当前已有的信息做出选择,而且一旦做出选择,不管将来有什么结果,这个选择都不会改变。换言之,贪心法并不是从整体最优考虑,他所做出的选择只是在某种意义上的局部最优。这种局部最优并不能保证总获得全局最优解,但通常能得到较好的近似最优解。
贪心法求得最优解问题中具有的性质。
1、最优子结构。
2、贪心选择性质。指问题的整体最优解可以通过一系列局部最优的选择。

回溯法
回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
其基本思想是,在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。 若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。 而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。

算法差异
(一)分治法和动态规划法的区别
共同点:二者都要求原问题具有最优子结构性质,都将原问题分成若干个子问题,然后将子问题的解合并,形成原问题的解。

不同点:动态规划法是将待求解问题分解成若干个相互重叠的子问题,而分治法是分解成若干个互不相交的子问题。利用分治法求解,这些子问题的重叠部分被重复计算多次。而动态规划法将每个子问题只求解一次并讲其保存在一个表格中,当需要再次求解此子问题时,只是简单地通过查表获得该子问题的解,从而避免了大量的重复计算。

(二)动态规划法和贪心法的区别
共同点:贪心算法和动态规划算法都要求问题具有最优子结构性质。

不同点:动态规划法用到之前的最优解,贪心则不是,贪心无法解决动态规划的问题,但是动态规划能解决贪心的问题。虽然能够应用贪心算法一定能够应用动态规划法,但是一般来说,贪心算法的效率高于动态规划法,因而还是应用贪心算法。动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每做一次贪心选择就将所求问题简化为规模更小的子问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值