算法概述

359 阅读2分钟

算法是程序为了解决问题的一种方法,程序是对算法的实现。 它是对特定问题求解过程的描述,是指令的有限序列。

我们设计算法的时候,需要考虑到算法的特性:

通用性 
有效性(有意义的指令和步骤)
确定性(下一步必须明确,条件判断无二义性)
有穷性(有限步结束)

因此操作系统不是算法。

基本算法可以分为:

  • 穷举法
  • 回溯,搜索
  • 递归分治
  • 贪心法
  • 动态规划

但是实际应用中,我们往往需要考虑到算法的时空限制,分析算法的效率。 我们一般采用大O表示法来进行算法的渐进分析。 简单来说就是,f(n) = O(g(n)),当且仅当存在两个参数c>0,n0>0,对于所有的n≥n0,都有f(n)≤cg(n)。

大O表示法有两种运算法则:

  • 加法规则 f1(n) + f2(n) = O(max(f1(n),f2(n))) 对应于顺序结构,if,switch

  • 乘法规则 f1(n)*f2(n) = O(f1(n)*f2(n)) 对应for,while,do-while结构

比如两层for循环的算法复杂度是O(n2)

当然实际中,对于同一问题给出不同的边界值,算法存在最好情况,最差情况和平均情况,需要根据实际需要选取合适的算法。

算法也存在时间和空间的权衡,一般来说消耗更多的内存可以节约一部分时间,反之亦然,需要从软件工程的角度考虑代价和效益。

那么如何做数据结构和算法的选择呢?

一般我们需要先分析求解问题的数据类型和数据之间的逻辑关系,进行问题抽象和数据抽象。

然后考虑到数据结构的可拓展性,选取适合的数据结构。

最后根据数据结构和问题,设计合理的算法。