蓝桥杯备赛笔记(一)——基础算法篇

目录

  • 蓝桥杯备赛笔记(一)——基础算法篇:算法时间复杂度和空间复杂度分析
    • 一、基础算法篇
      • 1.算法时间复杂度和空间复杂度分析
        • 1.1算法的定义及特性
        • 1.2评价算法优劣的基本标准
        • 1.3算法的时间复杂度
          • 1.3.1问题规模和语句频度
          • 1.3.2算法的时间复杂度定义
          • 1.3.3算法的时间复杂度分析举例
          • 1.3.4最好、最坏和平均时间复杂度
        • 1.4算法的空间复杂度
      • 2.枚举算法
      • 文章持续更新中,如果您觉得对您有帮助,点个赞再走吧!

蓝桥杯备赛笔记(一)——基础算法篇:算法时间复杂度和空间复杂度分析

一、基础算法篇

1.算法时间复杂度和空间复杂度分析

程序=数据结构+算法,数据结构与算法之间存在着本质联系。

1.1算法的定义及特性

算法( Algorithm )是为了解决某类问题而规定的一个有限长的操作序列。
一个算法必须满足以下5个重要特性。
(1)有穷性。一个算法必须总是在执行有穷步后结束,且每一步都必须在有穷时间内完成。
(2)确定性。对于每种情况下所应执行的操作,在算法中都有确切的规定,不会产生二义性,算法的执行者或阅读者都能明确其含义及如何执行。
(3)可行性。算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现。

(4)输入。一个算法有0个或多个输入。当用函数描述算法时,输人往往是通过形参表示的,在它们被调用时,从主调函数获得输入值。
(5)输出。一个算法有一个或多个输出,它们是算法进行信息加工后得到的结果,无输出的算法没有任何意义。当用函数描述算法时,输出多用返回值或引用类型的形参表示。

1.2评价算法优劣的基本标准

(1)正确性。在合理的数据输入下,能够在有限的运行时间内得到正确的结果。
(2)可读性。一个好的算法,首先应便于人们理解和相互交流,其次才是机器可执行性。可读性强的算法有助于人们对算法的理解,而难懂的算法容易隐藏错误,且难于调试和修改。

(3)健壮性。当输人的数据非法时,好的算法能适当地做出正确反应或进行相应处理,而不会产生一些莫名其妙的输出结果。
(4)高效性。高效性包括时间和空间两个方面。时间高效是指算法设计合理,执行效率高,可以用时间复杂度来度量;空间高效是指算法占用存储容量合理,可以用空间复杂度来度量。时间复杂度和空间复杂度是衡量算法的两个主要指标。

1.3算法的时间复杂度

衡量算法效率的方法主要有两类:事后统计法和事前分析估算法。事后统计法需要把算法转换成可执行的程序,时空开销的测算结果依赖于计算机的软硬件等环境因素,这容易掩盖算法本身的优劣。所以我们通常采用事前分析估算法,通过计算算法的渐近复杂度来衡量算法的效率。

1.3.1问题规模和语句频度

不考虑计算机的软硬件等环境因素,影响算法时间代价的最主要因索是问题规模n。问题规模 n 对不同的问题含义不同,例如,在排序运算中 n 为参加排序的记录数,在矩阵运算中 n 为矩阵的阶数,在多项式运算中 n 为多项式的项数,在集合运算中 n 为集合中元素的个数,在树的有关运算中 n 为树的结点个数,在图的有关运算中 n 为图的顶点数或边数。显然, n 越大算法的执行时间越长。
算法的执行时间大致上等于其所有语句执行时间的总和,而语句的执行时间则为该条语句的重复执行次数和执行一次所需时间的乘积
一条语句的重复执行次数称作语句频度( Frequency Count )。
由于语句的执行要由源程序经编译程序翻译成目标代码,目标代码经装配再执行,因此语句执行一次实际所需的具体时间是与机器的软、硬件环境(如机器速度、编译程序质量等)密切相关的。所以,所谓的算法分析并非精确统计算实际的执行所需时间,而是针对算法语句的执行次数做出估计。从中得出算法执行时间的信息。

设每条语句式执行一次所需的时间均是单位时间,则一个算法的执行时间可用该算法中所有语句频度之和来度量。

1.3.2算法的时间复杂度定义

对于稍微复杂些的算法,计算所有语句的频度则通常是比较困难的。因此,为了客观地反映一个算法的执行时间,可以只用算法中的”基本语句“次数来度量算法的工作量。所谓"基本语句"指它算法运行时间的贡献最大。我们只考虑n充分大时,算法中基本语句的执行次数渐进的阶。
算法时间复杂度的定义:
一般情况下,算法中基本语句重复执行的次数是问题规模 n 的某个函数 f( n )、算法的 时间 度记作:
T ( n ) = O ( f ( n ) ) T ( n )=O(f(n)) T(n)=O(f(n))
用" O “来表示数量级。(1)表示随着问题规模 n 的增大,算法执行时间的增长率和f( n )的增长率相同,称作算法近时间复杂度,简称时间复杂度(Time Complexity )。
数学符号” O "的严格定义为:
若 T (n)和f(n)是定义在正整数集合上的两个函数,则 T (n)和O(f(n))表示存在正的常数 C 和 n ,使得当 n ≥ n0时都满足0≤ T (n)≤ Cf(n)。该定义说明了函数T (n)和f(n))具有相同的增长趋势,并且T (n)的增长至多趋向于函数f(n)的增长。符号" O "用来描述增长率的上限,它表示当问题规模 n > n0 。时,算法的执行时间不会超过f(n) 。

1.3.3算法的时间复杂度分析举例

分析算法时间复杂度的基本方法为:找出所有语句中语句频度最大的那条语句作为基句,计算基本语句的频度得到问题规模 n 的某个函数 f(n),取其数量级用符号" O "表示即可,具体计算数量级时遵循以下定理:若
f ( n ) = a m n m + a m − 1 n m − 1 + . . . + a 1 n + a 0 f(n) = a_mn^m+a_{m-1}n^{m-1}+...+a_1n+a_0 f(n)=a

你可能感兴趣的:(蓝桥杯备赛笔记,蓝桥杯,笔记,算法)