一 算法概述
算法含义:是求解问题的计算规则集,每天规则都执行某种计算。它旨在根据精确定义的指令,为任何有效的输入产生对应有效的输出结果
英语词典含义:算法是由无歧义指令构成的有限集合,它在给定的一组初始条件下按预订顺序执行,知道满足给定的可识别的结束条件,以实现某种目的
** 算法的五个重要特征:**
- 有穷性(Finiteness):算法的有穷性是指算法必须能在执行有限个步骤之后终止
- 确切性(Definiteness):算法的每一步骤必须有确切的定义
- 输入(Input):一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件
- 输出(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的
- 可行性(Effectiveness):算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成(也称之为有效性)
** 算法的分类 **
- 数据密集型算法:旨在处理大量数据,处理需求相对简单,压缩大型文件的算法就是数据密集型算法的一个典型例子
- 计算密集型算法:具有大量计算型需求而不涉及到大量数据(寻找 大素数算法)
- 数据密集型+计算密集型算法:需处理大量数据,同时要有大量计算需求(视频信号的情感分析)。这类算法最耗费资源,需对算法进行精心设计,并对可用资源进行智能分配
二 算法的评定
好的算法具备三个关键特征
第一:算法是正确的,如果无法给出正确的答案,则毫无用处
第二:算法是易懂的,如果太复杂,在计算机无法实现,则毫无用处
第三:算法是高效的,即算法能产生正确的结果,但是可在有效的时间内解决
量化评价分析算法的方式:
-
空间复杂度(对空间内存的需求):就是估计算法在处理输入数据时所需的内存量。在分布式计算时- 代,数据结构的规模、类型和数量将决定对于底层硬件的内存需求
空间复杂度若没展开分析,临时数据结构可用的内存不足,可能会触发不必要的磁盘溢出,从而大大影响算法的性能效率 -
时间复杂度(算法运行的时间):就是依据算法结构来估算算法完成指定工作需要的时间,这个完全取决于算法本身的结构。
主要解决的问题:是否具有良好的可扩展性?算法在处理更大规模数据集是性能如何变化
最好复杂度:输入数据经过组织,能够得到算法的最佳性能,最好复杂度分析得出算法性能的上届
最坏复杂度:尝试找到算法在给定条件下完成工作所需最大可能时间。在评估算法在处理大规模数据的复杂问题时,最坏复杂度分析特别有用,给出算法性能的下界
平均复杂度:将各种可能的输入划分为不同的组,然后从每组中选择具有代表性的一个输入来分析算法的性能,最后计算出算法在各组输入上的平均性能
** 复杂度常用的算法:**
- 常数时间复杂度(O(1)):如果算法运行时间是独立于输入数据规模的相同值,则称其运行时间是常数时间
-线性时间复杂度(O(n));如果算法的执行时间与输入规模成正比,则称该算法具有线性时间复杂度 - 平方时间复杂度(O(n2)):如果算法的执行时间与输入规模的平方成正比,则称该算法的运行时间成平方时间
- 对数时间复杂度(O(logn)):如果算法的执行时间与输入规模的对数成正比,则称该算法的运行时间为对数时间
三 常用算法策略
算法策略:一个精心设计的算法应尽可能将问题划分为更小的子问题,从而最大限度优化可用资源的使用。常用的算法策略如下:
策略 | 说明 |
---|---|
分治策略 | 将规模较大的问题分解成可以相互独立解决的规模较小的子问题,然后将这些子问题产生的解合并起来,生成问题整体的解 |
动态规划策略 | 问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解 |
贪心算法策略 | 以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,不考虑最优解 |
穷举法 | 列举出它的所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的解 |
分支界限法 | 算法在具体执行时,把全部可行的解空间不断分割为越来越小的子集(称为分支),并为每个子集内的解的值计算一个下界或上界(称为定界) |
递归法 | 递归就是在过程或函数里调用自身;在使用递归策略时,必须有一个明确的递归结束条件 |