【考研或自学数据结构1.2】——算法(算法的基本概念,算法效率的度量【时间复杂度,空间复杂度】)

注:请结合具体的书籍学习;推荐《数据结构与算法》、《王道数据结构》,《天勤数据结构》等

离线笔记:https://download.csdn.net/download/qq_38454176/12352560

1. 算法的基本概念

知识结构总览
在这里插入图片描述

1.1 什么是算法

程序 = 数据结构 + 算法
数据结构 :如何把现实世界的问题信息化, 将信息存进计算机。同时还要 实现对数据结构的基本操作

算法:如何处理这些信息,以 解决实际问题

实例: 带小孩的顾客优先就餐问题分析:
在这里插入图片描述

1.2 算法的5个特性

算法的特性:算法必须具备 的特性

  1. 有穷性:一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成。
    注: 算法必须是有穷的(用有限步骤解决某 个特定的问题),而程序可以是无穷的(排队系统就是一 个程序,可以永不停歇)

  2. 确定性:算法中每条指令必须有确切的含义,对于相同的输入只能得出相同的输出

  3. 可行性:算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。

  4. 输入:一个算法有零个或多个输入(如hello world就是无输入),这些输入取自于某个特定的对象的集合。

  5. 输出:一个算法有一个或多个输出,这些输出是与输入有着某种特定关系的量。

1.3 “好”算法的特质

设计算法时要尽 量追求的目标

  1. 正确性:算法应能够正确地解决求解问题。

  2. 可读性:算法应具有良好的可读性,以帮助人们理解.
    注: 算法可以用伪代码描述,甚至用文字描述, 重要的是要“无歧义”地描述出解决问题的步骤

  3. 健壮性:输入非法数据时,算法能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。

  4. 高效率低存储量需求 :执行速度快。 时间复杂度低;不费内存。 空间复杂度低

2. 算法效率的度量

2.1 时间复杂度

结构总览
在这里插入图片描述注: 算法的性能问题只有在n很大时才会暴露出来

2.1.1 如何评估算法时间开销

  1. 让算法先运行,事后统计运行时间?
    存在什么问题?
  • 和机器性能有关,如:超级计算机v.s.单片机
  • 和编程语言有关,越高级的语言执行效率越低
  • 和编译程序产生的机器指令质量有关
  • 有些算法是不能事后再统计的,如:导弹控制算法

2.1.2 算法的时间复杂度

算法的时间复杂:事前预估算法时间开销T(n)与问题规模n的关系(T表示 “time”)

实例:用算法表白——复联4中爱你N遍
在这里插入图片描述两个问题将会在下面进行展开讨论与分析

2.1.3 问题1:是否可以忽略表达式某些部分?

分析与结论:
在这里插入图片描述

  • 结论1:可以只考虑阶数高的部分
  • 结论2:问题规模足够大时, 常数项系数也可以忽略

2.1.4 算法的时间复杂度的运算规则

  1. 加法规则 T(n) = T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(max(f(n), g(n)))
    多项相加,只保留最高阶的项,且系数变为1

  2. 乘法规则 T(n) = T1(n)×T2(n) = O(f(n))×O(g(n)) = O(f(n)×g(n))
    Eg:T3(n)=n^3 +n^2 log2n =O(n^3)+O(n^2 log2n) =???
    多项相乘,都保留

时间复杂度大小排列
在这里插入图片描述列如:两个算法的时间复杂度分别如下,哪个的阶数更高(时间复杂度更高)?
在这里插入图片描述

2.1.5 问题2:如果有好几千行代码, 按这种方法需要一行一行数?

分析与结论:

在这里插入图片描述

2.1.6 几种不同算法表白的分析与结论

  1. 嵌套循环型:
    在这里插入图片描述
  2. 指数递增型
void loveYou(int n) {
    
     //n 为问题规模
       int i = 1;  // 爱你程度
       while (i <= n) {
    
       //外层循环执行n次
              i*2;  // 每次翻倍
             printf("I Love You %d", i);
              }
        printf("I Love You More Than %d", n);
   }

计算上述算法的时间复杂度T(n): 设最深层循环的语句频度(总共循环的次数)为x,则 由循环条件可知,循环结束时刚好满足 2^x>n
x=log2n+1
T(n)=O(x)=O(log2n)

  1. 搜索数字型
void loveYou(int flag[], int n) {
    
     //n 为问题规模
		 printf("I anm Iron Man %d");
       int i = 1;  // 爱你程度
       for(int i=0;i<n;i++{
    
     //从第一个元素开始查找
       		if(flag[i] == n) {
    
     //找到元素n
       			printf("I Love You %d", n);
       			break; //找到后立即跳出循环
       		}
       	}
   }


int flag[n] = {
    
    1...n};

计算上述算法的时间复杂度T(n)
最好情况:元素n在第一个位置 ——最好时间复杂度T(n)=O(1)
最坏情况:元素n在最后一个位置 ——最坏时间复杂度T(n)=O(n)
平均情况:假设元素n在任意一个位置的概率相同为1/n ——平均时间复杂度T(n)=O(n)

2.1.7 最好,最坏,平均时间复杂度

最坏时间复杂度:最坏情况下算法的时间复杂度
平均时间复杂度:所有输入示例等概率出现的情况下,算法的期望运行时间
最好时间复杂度:最好情况下算法的时间复杂度

2.2 空间复杂度

知识架构:
在这里插入图片描述

2.2.1 程序运行时的内存需求(空间复杂度)

案列分析1:
在这里插入图片描述
案列分析2:
在这里插入图片描述
案列分析3:
在这里插入图片描述

2.2.2 函数递归调用带来的内存开销

案例分析1:
在这里插入图片描述
案例分析2:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38454176/article/details/105679307
今日推荐