迭代和递归的时间复杂度分析

2023-11-10

1.迭代

1.1 常数阶

下面算法的时间复杂度为 O ( 1 ) O(1) O(1)

void fun()
{
    int result = 100;
    result++;
    printf("%d\n", result);
}

下面算法的基本操作执行了 100 100 100 次,时间复杂度为 O ( 1 ) O(1) O(1)

void fun(int n)
{
    int count = 0;
    for (int k = 0; k < 100; k++)
    {
        ++count;
	}
	printf("%d\n", count);
}

1.2 线性阶

在下面算法中,循环体中的代码执行了 n n n 次,时间复杂度为 O ( n ) O(n) O(n)

void fun(int n)
{
    for (int i = 0; i < n; i++)
    {
        printf("%d\n", i);
    }
}

1.3 对数阶

在下面算法中,result 每次乘以 2 2 2,会越来越接近 n n n,当 result 大于等于 n n n 时,就会退出循环。

假设循环次数为 k k k,则有 2 k = n 2^k=n 2k=n,于是 k = log ⁡ 2 n k=\log_{2}{n} k=log2n,因此时间复杂度为 O ( log ⁡ n ) O(\log{n}) O(logn)

void fun(int n)
{
    int result = 1;
    while (result < n)
    {
        result = result * 2;
    }
}

1.4 平方阶

下面算法的时间复杂度为 O ( n 2 ) O(n^2) O(n2)

void fun(int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%d\n", result[i][j]);
        }
    }
}

下面算法的时间复杂度为 O ( n ∗ m ) O(n*m) O(nm)

void fun()
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            a[i][j] = 0;
        }
    }
}

下面算法的时间复杂度为 O ( n ∗ log ⁡ n ) O(n*\log{n}) O(nlogn)

void fun(int n)
{
    int count = 0;
    for (int k = 1; k <= n; k *= 2)
    {
        for (int j = 1; j <= n; j++)
        {
            count++;
        }
    }
}

在下面算法中,基本操作的执行次数为 n + ( n − 1 ) + . . . + 2 + 1 = n ( n + 1 ) 2 n+(n-1)+...+2+1 = \frac{n(n+1)}{2} n+(n1)+...+2+1=2n(n+1),时间复杂度为 O ( n 2 ) O(n^2) O(n2)

void fun(int n)
{
    int x = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = n; j >= i + 1; j--)
        {
            x++;
        }
    }
}

假设基本操作的执行次数为 k k k,则有 k 3 = n k^3 = n k3=n,即 k = n 3 k=\sqrt[3]{n} k=3n ,因此时间复杂度为 O ( n 3 ) O(\sqrt[3]{n}) O(3n )

void fun(int n)
{
    int i = 0;
    while (i * i * i <= n)
    {
        i++;
    }
}

1.5 多个复杂度的顺序组合

总的时间复杂度等于其中最大的时间复杂度,因此下面代码的时间复杂度为 O ( n 2 ) O(n^2) O(n2)

void fun(int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%d\n", a[i][j]);
        }
    }
    
    for (int i = 0; i < n; i++)
    {
        printf("%d\n", b[i]);
    }
}

1.6 多个复杂度的选择组合

总的时间复杂度等于其中最大的时间复杂度,因此下面代码的时间复杂度为 O ( n 2 ) O(n^2) O(n2)

if (flag)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; i++)
        {
            printf("%d\n", a[i][j]);
        }
    }
}
else
{
    for (int i = 0; i < n; i++)
    {
        printf("%d\n", b[i]);
    }
}

2.递归

递推方程

T ( n ) = a T ( n / b ) + f ( n ) T(n) = a T(n/b) + f(n) T(n)=aT(n/b)+f(n)

  • a a a:归约后的子问题个数

  • n / b n/b n/b:归约后子问题的规模

  • f ( n ) f(n) f(n):归约过程及组合子问题的解的工作量

主定理(master theorem)

a ≥ 1 , b > 1 a \geq1, b>1 a1,b>1 为常数, f ( n ) f(n) f(n) 为函数, T ( n ) T(n) T(n) 为非负整数,且 T ( n ) = a T ( n / b ) + f ( n ) T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n),则

  • f ( n ) = O ( n log ⁡ b a − ξ ) , ξ > 0 f(n)=O(n^{\log_ba-\xi}),\xi>0 f(n)=O(nlogbaξ)ξ>0,那么 T ( n ) = Θ ( n log ⁡ b a ) T(n)=\Theta(n^{\log_ba}) T(n)=Θ(nlogba)

  • f ( n ) = Θ ( n log ⁡ b a ) f(n)=\Theta(n^{\log_ba}) f(n)=Θ(nlogba),那么 T ( n ) = Θ ( n log ⁡ b a log ⁡ n ) T(n)=\Theta(n^{\log_ba} \log n) T(n)=Θ(nlogbalogn)

  • f ( n ) = Ω ( n log ⁡ b a + ξ ) , ξ > 0 f(n)=\Omega(n^{\log_ba + \xi}),\xi > 0 f(n)=Ω(nlogba+ξ)ξ>0,且对于某个常数 c < 1 c<1 c<1 和充分大的 n n n a f ( n / b ) ≤ c f ( n ) af(n/b) \leq cf(n) af(n/b)cf(n),那么 T ( n ) = Θ ( f ( n ) ) T(n)=\Theta(f(n)) T(n)=Θ(f(n))

主定理(简化快速记忆)

对于 T ( n ) = a T ( n / b ) + f ( n ) T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n)

  • f ( n ) < n log ⁡ b a f(n) < n^{\log_ba} f(n)<nlogba,则 T ( n ) = Θ ( n log ⁡ b a ) T(n)=\Theta(n^{\log_ba}) T(n)=Θ(nlogba)

  • f ( n ) = n log ⁡ b a f(n)=n^{\log_ba} f(n)=nlogba,则 T ( n ) = Θ ( n log ⁡ b a log ⁡ n ) T(n)=\Theta(n^{\log_ba} \log n) T(n)=Θ(nlogbalogn)

  • f ( n ) > n log ⁡ b a f(n) > n^{\log_ba} f(n)>nlogba,则 T ( n ) = Θ ( f ( n ) ) T(n)=\Theta(f(n)) T(n)=Θ(f(n))

常见的递推式与复杂度

在这里插入图片描述

3.习题

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.答案

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迭代和递归的时间复杂度分析 的相关文章

  • std::list 中 size() 的时间复杂度

    很奇怪的 xff0c 或者说是一个不应成为问题的问题 std list 的 size 方法时间复杂度是多少 xff1f 第一感觉应该是 O 1 没错吧 xff0c 多一个变量用于储存链表长度应该是很轻易的事情 于是有了下面这段代码 xff1
  • 时间复杂度

    1 时间复杂度 在进行算法分析时 xff0c 语句总的执行次数T n xff09 是关于问题规模n的函数 xff0c 然后分析T n xff09 随n的变化 这样用大写的O来标记算法的时间复杂度 xff0c 称之为大O Order的简写 x
  • onlstm时间复杂度_CNN-LSTM | 一种融合卫星-雨量站降水数据的时空深度融合模型

    1 xff0c 不同模型的降水融合性能 表2 2001 2005年全国796个气象站不同降水校正模型的RMSE RB MAE和CC 如表2所示 xff0c 将4种模型结果与原TRMM数据进行了定量比较 xff0c RMSE和MAE值越小表明
  • 【北大MOOC】时间复杂度的计算

    文章目录 1 函数渐近的界 2 函数渐近的界的定理 3 几类重要的函数 4 序列求和的方法 4 1 等差 等比数列与调和级数 4 2 估计和式上界的放大法 4 3 用积分估计和式渐近的界 5 迭代法求解递推方程 5 1 迭代法 5 2 换元
  • 《算法二》选择排序算法及它的时间复杂度

    1 选择排序算法 选择排序算法的时间复杂度为O N 2 选择排序算法规则 1 指定位置的数和后面的数比较 2 如果指定位置的数大 则两个数交换位置 3 向后移动一个位置 和指定位置的数进行比较 假设数组大小 n 第一轮比较n 1次 最小的数
  • 插入排序算法笔记

    插入排序 1 最简单的排序算法 2 在增量排序中有很高的效率 比如已经存在成绩排序 要插入一个新的成绩并且排序 3 不需要额外的存储空间 属于内部排序 4 时间复杂度为O n 2 首先 定义数组的形式为 num MAX 1 MAX是已经定义
  • 时间复杂度-线性对数时间nlogn的一些研究

    文章目录 排序算法的时间复杂度 二叉树与 n l o g 2 n
  • 十分钟搞定时间复杂度(算法的时间复杂度)

    目录 1 什么是时间复杂度 2 时间复杂度的计算 1 单个循环体的推导法则 2 多重循环体的推导法则 3 多个时间复杂度的推导法则 4 条件语句的推导法则 3 习题练习 1 基础题 2 进阶题 3 再次进阶 1 什么是时间复杂度 算法复杂度
  • 剑指offer总结

    时间复杂度一般比空间复杂度更重要 因为改进时间对算法的要求更高 是空间换时间 还是时间换空间 一般要看具体的应用 对于普通的应用 一般是空间换时间 因为普通用户更关心速度 而且一般有足够的存储空间允许这样操作 对于嵌入式的软件 一般我们会用
  • 枚举子集复杂度 O(n^3) 证明

    困扰多年的问题 居然在学习离散数学后的一分钟内得到解决 形式化问题为 求满足 A B S A sube B sube S A B S 的有序对
  • 迭代和递归的时间复杂度分析

    文章目录 1 迭代 1 1 常数阶 1 2 线性阶 1 3 对数阶 1 4 平方阶 1 5 多个复杂度的顺序组合 1 6 多个复杂度的选择组合 2 递归 3 习题 4 答案 1 迭代 1 1 常数阶 下面算法的时间复杂度为 O 1 O 1
  • 计算时间复杂度--(简单版)

    步骤 1 找到执行次数最多的语句 2 语句执行语句的数量级 3 用O表示结果 计算时间复杂度的3个出发点 掌握这三个出发点 那么一向搞不懂的时间复杂度就可以迎刃而解啦 然后 1 用常数1取代运行时间中的所有加法常数 2 在修改后的运行次数函
  • 数据结构与算法目录

    前言 数据结构与算法系列先看这里 有助于你更好地获取内容 首先明白一个问题 为什么要研究数据结构 这是因为所有的程序本质上是对数据进行处理 如何高效的处理数据 这依赖于数据本身的结构 如类型 整型 浮点型等 维数 是否为复杂类型 结构体类型
  • 初级1 题目一 时间复杂度及示例

    1 什么是时间复杂度 常数时间的操作 一个操作如果和数据量没有关系 每次都是固定时间内完成的操作 叫做常数操作 一个算法流程中 常数操作数量的指标 就是常数操作在算法里总共有多少次 称为时间复杂度 常用O 读作big O 来表示 具体来说
  • 常见排序算法的时间复杂度、空间复杂度、稳定性比较

    常见排序算法的时间空间复杂度 稳定性比较 一 排序算法比较 注 1 归并排序可以通过手摇算法将空间复杂度降到O 1 但是时间复杂度会提高 2 基数排序时间复杂度为O N M 其中N为数据个数 M为数据位数 二 辅助记忆 1 时间复杂度记忆
  • 算法的时间复杂度、空间复杂度

    文章目录 数据结构 算法 数据结构与算法的关系 时间复杂度 O 1 O n O 1 O n O n O n 2 O log2 n 空间复杂度 O 1 O n O n 2 常用算法的时间 空间复杂度 数据结构 数据结构是计算机存储 组织数据的
  • 数据结构与算法之美

    当我们要去做一件事的时候 必须要问自己三个问题 是什么 什么是数据结构与算法 数据结构 就是一组数组的存储结构 算法 就是操作数据的一组方法 数据结构是为算法服务的 算法要作用于特定的数据结构之上 为什么需要数据结构与算法 来谈谈应用层面的
  • 数据结构学习(一)数据结构基础

    文章目录 算法与数据结构学习 一 数据结构基础 1 数据结构 1 1 什么是数据结构 1 2 学习数据结构的必要性 2 算法 2 1 怎么衡量算法的好坏 2 1 1 时间复杂度 2 1 2 空间复杂度 2 2 时间复杂度的计算 2 3 常见
  • 排序算法——比较类排序算法讲解以及c++实现

    首先我先抛一个老哥的博客 我是看着他的博客来学习理解 地址 https www cnblogs com onepixel p 7674659 html 首先说一下排序算法分为2类 一类是比较类排序算法 另一类是非比较类排序 这里主要讲常用的
  • 判断一个大于2的正整数n是否为素数的方法有多种,给出两种算法,说明其中一种算法更好的理由

    判断一个大于2的正整数n是否为素数的方法有多种 给出两种算法 说明其中一种算法更好的理由 问题解答 include

随机推荐