导读:算法是一种解决方案,着重描写了解决问题的步骤。对于算法,主要包括两个方面:设计和分析。这两者之间相辅相成,设计出的算法需要校验和评价,而对算法的分析,又可以促使算法的设计更加的优良。本篇博客主要解决有关算法的基础概念知识,而后会对其设计和分析进行总结。首先看算法的知识分布:
一、是什么
1.1,概念
算法(Algorithm):是对特定问题求解步骤的一种描述,它是指令的有限序列,其中一条指令表示一个或多个操作。
1.2,特性
有穷性:一个算法必须是在执行有穷步之后结束,并且每一步都可以在有穷时间内完成
确定性:算法中的每一条指令必须有确切的含义,理解时不会产生二义性。并且在任何条件下,算法只有唯一的一条执行路径,即对于相同的输入,只能得出相同的输出
可行性:一个算法是可行的,计算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现
输入:一个算法有0个或者多个输入,这些输入取自于某个特定的对象的集合
输出:一个算法有一个或多个输出,这些输出是同输入有着某些特定关系的值
1.3,表示
常用的算法表示方法有:自然语言、流程图、程序设计语言、伪代码等。
表示方法 分析 |
优点 |
缺点 |
自然语言 |
容易理解 |
易出二义性、冗长 |
流程图 |
直观易懂 |
严密性小于程序设计语言、灵活性小于自然语言 |
程序设计语言 |
直接执行 |
抽象性差,要求设计人员拥有编程技巧 |
伪代码 |
表达力、简明扼要 |
处于自然语言和程序设计语言之间 |
1.4,理解
前面没有正儿八经看过书,对算法的理解一知半解,从心底里给自己贴了一个标签:算法好难,我不会!所以,其实对于算法的定义,我都不是很清楚,脑袋里就只有一个印象,好难。但是,其实所谓的算法,根本说来就是一个解决方案,就是对一个解决方案每一步骤的描述。广义说来,编写的每一个过程的代码,都是一个算法。我能写出一个系统的代码,一个算法,只要我认真去研究学习,也不是什么难事儿。
二、从哪里来(设计)
2.1,基本思想
算法经过设计而来,常见的设计方法有:分治、回溯、贪心、动态规划法,其各自的基本思想是:
分治:将一个难以直接解决的大问题分解成一些规模较小的相同问题,以便各个击破,分而治之。分治和递归经常同时应用于算法设计之中,并由此产生许多高校的算法。
动态规划法:和分治法类似,是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。动态规划法通常用于求解具有某种最优性质的问题。
贪心法:根据当前已有的信息做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变。通常用于解决最优问题。
回溯法:具有“通用的解题法”之称,在确定了解空间的组织结构后,回溯法从开始结点(根结点)出发,以深度优先的方式搜索整个解空间。适用于解决组合数较大的问题。
2.2,对比
2.2.1,分治VS动态规划
动态:经分解得到的子问题往往不是独立的
分治:相同的子问题会被求解多次,以致于最后解决原问题需要耗费指数级时间
2.2.2,贪心VS动态规划
相同点:都是用于求解最优值
不同点:贪心的最优求解是局部的,动态规划的最优求解是全局的
2.2.3,回溯VS分治
相同点:都应用到了递归式
不同点:基本思想不同,应用的场合不同。
三、效果(分析)
算法的分析包括其基本的标准和次要标准,其基本标准从程序设计的角度来说是一种功能上的要求,而次要标准则是性能要求,那么在这里主要介绍一些有关性能方面的分析,即:时间复杂度和空间复杂度,而着重介绍时间复杂度。
3.1,定义
时间复杂度:算法的运行时间,即算法执行所需要的基本操作数
空间复杂度:对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。
3.2,时间复杂度
时间复杂度的分析包括3种情况:最佳情况(使算法执行时间最少的输入)、最坏情况(使算法执行时间最多的输入)、平均情况(算法的平均运行时间)。
分析原则:一般情况下,不进行最优的时间复杂分析,而是进行最坏的时间复杂分析,最坏的时间复杂度给的是一个保障值,实际情况不会比这个更糟。二对于许多算法来说,最坏的时间复杂度和平均时间复杂度是一致的。其分析步骤是:1,将所有的输入按其执行时间分类;2,确定每类输入发生的概率;3,确定每类输入的执行时间
四、总结
现在只是将算法的一些基本的概念、知识点给稍加整理罗列了一下,接下来会对算法进行总结,主要是关于算法设计方面的内容。算法一直是自己的一个大难点,希望通过总结,让自己一步一步的领悟。算法不是一个跨不过的难点,我不能再给自己贴上消极的标签了。