数据结构(C语言) 算法和算法分析

算法和算法分析

  • 算法
    • 定义
    • 描述
    • 算法与程序
    • 特性
    • 设计要求
  • 算法分析
    • 算法效率
    • 时间复杂度
    • 空间复杂度

算法

定义

  • 算法是对特定问题求解方法和步骤的一种描述,它是指令的有序序列。期中每个指令表示一个或多个操作。
  • 简而言之,算法就是解决问题的方法和步骤

描述

  • 自然语言:英语、中文
  • 流程图:传统流程图、NS流程图
  • 伪代码:类语言(类C语言)
  • 程序代码:C语言程序、Java语言程序

算法与程序

  • 算法是解决问题的一种方法或一个过程,考虑如何将输入转化成输出,一个问题可以有多中算法。

  • 程序是用某种程序设计语言对算法的具体实现

    • 程序 = 数据结构 + 算法

      • 数据结构通过算法实现操作
      • 算法根据数据结构设计程序

特性

有穷性 : 一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。

确定性 :算法中的每一条指令必须有确切的含义,没有二义性,在任何条件下,只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出结果。
可行性 :算法是可执行的,算法描述的操作可以通过已经实现的基本操作执行有限次来实现。
输 入 :一个算法有零个或多个输入。
输 出 : 一个算法有零个或多个输出

设计要求

正确性 : 满足问题要求,能正确解决问题 。
可读性 : 方便人的阅读和交流,易于人的理解 。
健壮性
1) 指输入非法数据时,算法恰当的做出反应或进行相应处理,而不是产生莫名其妙的输出结果。
2) 处理出错的方法,不应是中断程序的执行。而应是放回一个错误或错误性质的值,以便在更高的抽象层次上进行处理 。

高效性 : 算法的执行效率尽量的高 。

算法分析

算法效率

时间效率:是指算法消耗的时间
空间效率: 是指算法执行过程中所消耗的存储空间


注意 : 时间效率和空间效率有时候是矛盾的。

时间复杂度

算法运算时间 = 每条语句频度 × 该语句执行一次所需的时间

例如:两个n×n的矩阵相乘的算法

for(i=1;i<n;i++)			//n+1次
{
    for(j=1;j<=n;j++)		//n(n+1)次
    {
        c[i][j]=0;			//n*n次
        for(k=0;k<n;k++)	//n*n*(n+1)次
        {
            c[i][j]=c[i][j]+a[i][k]*b[k][i];	//n*n*n次
        }
    }
}

对于求解矩阵相乘问题,算法耗费时间:

T(n)=2n^3 + 3n ^2+ 2n+1
n → ∞时,T(n) / n ^ 3 , 这表示n充分大时,T(n)与n3是同阶或同数量级,引入大“O”记号,则T(n)可记作:
T(n)= O( n^3 )

时间复杂度的定义
算法中基本语句重复执行的次数是问题规模n的某个函数 f (n),算法的时间度量
记作:T(n)=O(f(n))
数据结构(C语言) 算法和算法分析_第1张图片
忽略所有低次幂项和最高此幂项系数,体现出增长率的含义

分析时间复杂度的基本方法

  • 找出语句频度最大的那条语句作为基本语句
  • 计算基本语句的频度得到问题规模 n 的某个函数 f(n)
  • 取其数量级用符号" O "表示

注意:

  • 一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长.

  • 对于复杂的算法,可以将它分成几个容易估算的部分,然后利用大O加法和乘法法则,计算算法的时间复杂度:

    • a)加法规则
      T(n))= T1(n) +T2(n) = O( f (n))+ O(g(n))= O(max(f (n),g(n)))
    • b)_乘法规则
      T(n)= T1(n) × T2(n)= O(f(n)) × O(g(n))= O(f(n)x g(n))

空间复杂度

空间复杂度指的是:算法所需存储空间的度量

  • 记作:S(n)=O(f(n))

期中 n 为问题的规模(或大小)

算法要占据的空间

  • 算法本身要占据的空间,输入/输出,指令,常数,变量等。
  • 算法要使用的辅助空间

你可能感兴趣的:(数据结构,数据结构,c语言,算法)