算法的时间复杂度(C语言)

news2024/9/30 2:43:46

1.时间复杂度的定义

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了算法的运行时间。一个算法所花费的时间与其中语句的执行次数成正比列,算法中的基本操作的执行次数,为算法的时间复杂度

例1:

计算Func1中++count执行的次数

void Func1(int N)
{
    int count = 0;
    for(int i = 0; i < N; ++i)
    {
        for(int j = 0; j < N; ++j)
        {
            ++count;
        }
    }
    for(int i = 0; i < 2 * N; ++i)
    {
        ++count;
    }
    int M = 10;
    while(M--)
    {
        ++count;    
    }
    printf("%d\n", count);
}

Func1的基本操作次数:F(N) = N^2 + 2 * N + 10来分析一下是为什么?

首先可以看到这段代码有三个循环

第一个是由两个for内外嵌套组成:每次循环N次,执行了N次,即N + N + N.....=N * N = N^2

第二个循环执行了 2*N

第三个循环执行了 10

如果每个时间复杂度都要这么表示的话那太复杂了,所以我们只取最大量级来表示这段代码的时间复杂度

当N  = 10时:F(N) = 130

当N = 20时:F(N) = 10210

当N = 30时:F(N) = 1002010

当我们的N取无穷大时 2 * N + 10这两个项对结果的影响已经不大了可以忽略不计,所以说只需要取N^2来表示它的时间复杂度就可以了

所以这段代码Func1的时间复杂度为: O(N ^ 2)

2.大O的渐进表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号

推导大O阶方法:

(1).用常数1来取代运行时间中的所有加法常数

(2).在修改后的运行次数的函数中,只保留最高阶项

(3).如果最高阶存在且不是1,则去除与这个项目相乘的常数,得到的结果就是大O阶

通过上面一个例子我们可以发现大O渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数

我们来计算几道代码的时间复杂度

例1:

void Func2(int N)
{
    int count = 0;
    for(int i = 0; i < 2 * N; i++)
    {
        ++count;
    }
    int M = 10;
    while(M--)
    {
        ++count; 
    }
    printf("%d", count);
}

F(N) = 2 * N +10

去掉与最高阶相乘的常熟和10使用大O渐进法表示法该段代码的时间复杂度为:O(N)

例2:

void Func3(int M, int N)
{
    int count = 0;
    for(int i = 0; i < M; i++)
    {
        ++count;
    }
    
    for(int j = 0; j < N; j++)
    {
        ++count;
    }
    printf("%d\n", count);
}

使用大O渐进法表示法该段代码的时间复杂度为:O(N + M)

因为M和N是未知的所以不能去掉它们两个任意一个

如果N大于M,则可以去掉M,反之可以去掉N,相等可任取M和N中任何一个

例3:

void Func4(int N)
{
    int count = 0;
    for(i = 0; i < 100: i++)
    {
        ++count;
    }
    printf("%d\n", count);
}

F(N) = 100

执行了100次,但是我们用1来表示

使用大O渐进法表示法该段代码的时间复杂度为:O(1)  

注:这里的1表示代表1次,而是常数次

3.时间复杂度的最好,最坏和平均情况

另外有些算法的时间复杂度存在最好,平均,最坏情况:

最坏情况:任意输入规模的最大运行次数(上界)

平均情况:任意输入规模的期望运行次数

最好情况:任意输入规模最小运行次数(下界)

例4:

char* strchr(const char * str, int character)
{
    while(*Str)
    {
        if(*str == character)
        {
           return str;
        }
        str++;
    }
    return NULL;
}

例如:在一个长度为N的数组中找一个数据x

最好情况:1次找到

平均情况:N/2次找到

最坏情况:N次找到

在实际情况中一般关注的是算法的最坏运行情况,所以该段代码的时间复杂度为:O(N)

例5:

void BubbleSort(int *a, int n)
{
    assert(a);
    for(int end = n; end > 1; --end)
    {
        for(int i = 1; i < end; i++)
        {
            if(a[i - 1] > a[i])
            {
               int tmp = a[i];
               a[i] = a[i + 1];
               a[i + 1] = tmp;
            }
        }
    }
}

最好情况:O(N)

最坏情况将两个for循环跑满

外循环为n时,内循环循环n - 1次  然后按顺序n - 2, n-3, ....., 3, 2, 1通过判断可以知道这是一个等差数列,所以它的总和就为:n(n - 1 + 1)/2 = n^2*1/2 即最坏情况:O(N^2)

使用大O渐进法表示法去掉常数该段代码的时间复杂度为:O(N^2)  

例6:

在数组有序的情况下:可以使用二分法(折半查找)

int binarysearch(int *a,int n, int x)
{
    int begin = 0;
    int end = n - 1;
    while(begin <= end)
    {
          int mid = begin + ((end - begin)>>1);
          if(a[mid] > x)
          {
             end = a[mid] - 1;
          }
          else if(a[mid] < x)
          {
             begin = a[mid] + 1;
          }
          else
          {
             return mid;
          }
    }
    return -1;
}

最好情况:O(1)

最坏情况:区间缩放到一个值,要么找到,要么找不到,假设N为数组个数,x是最坏查找次数N每次除2就等于查找一次,折半查找多少次就除多少个2

N/2/2/2..../2 = 1, 因为n为int所以最小二分到1,2^x = N 即:x = logN(log在时间复杂度中表示以2为底)所以最坏情况:O(logN)

例7:

long long fac(size_t N)
{
    if(N == 0)
    return 1;
    else
    return fac(N - 1) * N;
}

使用大O渐进法表示法该段代码的时间复杂度为:O(N)

例8:

long long Fib(int n)
{
    if(n < 3)
    {
        return 1;
    }
    else
    {
        return Fib(n - 1) + Fib(n - 2);
    }
}

最好情况:O(1)

可以观察到该递归的方式为等差数列我们用求和公式可以得出:2^(N-1)-1

最坏情况用大O渐进表示法:O(2^N)

总结以上时间复杂度:O(1)>O(logN)>O(N)>O(N^2)>O(N^3)>O(2*N)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1913401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Midjourney 如何使用参考图像来提升图像的准确性和相似度?

&#x1f9d9;&#x1f3fc;图像提示 &#x1f9d9;&#x1f3fc;‍♂️ 您可以使用图像作为提示的一部分来影响作业的构图、样式和颜色。图像提示可以单独使用&#xff0c;也可以与文本提示一起使用 - 尝试组合具有不同样式的图像以获得最令人兴奋的结果。 &#x1f6e0;️实…

合合信息大模型加速器重磅上线,释放智能文档全新可能

目录 0 写在前面1 高速文档解析引擎&#xff1a;拓宽大模型认知边界2 文本嵌入模型acge&#xff1a;克服大模型感知缺陷3 行业赋能&#xff1a;以百川智能为例总结 0 写在前面 随着人工智能技术的飞速发展&#xff0c;大模型以强大的数字处理能力和深度学习能力&#xff0c;不…

XTuner 微调 LLM:1.8B, 部署

扫码立刻参与白嫖A100&#xff0c;书生大模型微调部署学习活动。亲测有效 内容来源&#xff1a;Tutorial/xtuner/personal_assistant_document.md at camp2 InternLM/Tutorial GitHubLLM Tutorial. Contribute to InternLM/Tutorial development by creating an account on G…

帕金森病患者应该如何确定自己每天适宜的饮水量?

帕金森病患者确定每天适宜的饮水量时&#xff0c;应该考虑到药物副作用、运动障碍和便秘等问题。建议的饮水量通常是每天6至8杯水&#xff0c;相当于约2000毫升左右。这个量可以根据个人的体重、气候条件、活动水平以及是否有其他健康问题进行适当调整。 为了科学合理地安排饮水…

【CVPR 2024】GART: Gaussian Articulated Template Models

【CVPR 2024】GART: Gaussian Articulated Template Models 一、前言Abstract1. Introduction2. Related Work3. Method3.1. Template Prior3.2. Shape Appearance Representation with GMM3.3. Motion Representation with Forward Skinning3.4. Reconstruct GART from Monocu…

【笔记】Android V 应用SDK升级适配和问题

说明 随着Google释放的Android版本,系统升级SDK到35,应用也需要升级上去,不然会报错。 Android Studio Jellyfish | 2023.3.1 | Android Developers Android Studio 预览版中的新功能 | Android Developers 当前版本的Android Studio

在超算平台或高性能集群上运行并行程序使用命令mpirun -np ,出现“no active ports detected”

问题&#xff1a; 在超算平台或高性能集群上运行并行程序使用命令mpirun -np &#xff0c;出现“no active ports detected” 具体使用的命令如下&#xff1a; Participant2"Solid" Solver2"linear_elasticity" nprocS4 # jie notes:24# Runecho "…

PCI PTS 硬件安全模块(HSM)模块化安全要求 v5.0

符合条件的 PCI SSC 利益相关者在 30 天的意见征询 (RFC) 期间审查 PCI PTS 硬件安全模块 (HSM) 模块化安全要求 v5.0 草案并提供反馈。 PCI PTS 硬件安全模块(HSM)模块化安全要求 v5.0图 从 7 月 8 日到 8 月 8 日&#xff0c;邀请符合条件的 PCI SSC 利益相关者在 30 天的意见…

Riscv 架构的合规测试

为啥直接关注riscv-arch-test&#xff0c;是因为RISCOF 测试框架使用的是riscv-arch-test 1. The architectural test 架构测试是一个单一的测试&#xff0c;代表了可编译和运行的最小测试代码。它是用汇编代码编写的&#xff0c;其产品是test signature。一个架构测试可能由…

BUG解决:postman可以请求成功,但Python requests请求报403

目录 问题背景 问题定位 问题解决 问题背景 使用Python的requests库对接物联数据的接口之前一直正常运行&#xff0c;昨天突然请求不通了&#xff0c;通过进一步验证发现凡是使用代码调用接口就不通&#xff0c;而使用postman就能调通&#xff0c;请求参数啥的都没变。 接口…

【机器学习】主成分分析(PCA):数据降维的艺术

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 主成分分析&#xff08;PCA&#xff09;&#xff1a;数据降维的艺术引言PCA的基…

ssm华天计算机面试刷题系统-计算机毕业设计源码22543

摘 要 华天计算机面试刷题系统是一款基于SSM&#xff08;Spring、Spring MVC、MyBatis&#xff09;框架、利用Java编程语言和MySQL数据库&#xff0c;开发的在线学习和测试平台。系统利用SSM框架及前端开发技术&#xff0c;实现了模块化开发和管理&#xff0c;前后端交互以及数…

【数据结构和算法的概念等】

目录 一、数据结构1、数据结构的基本概念2、数据结构的三要素2.1 数据的逻辑结构2.2 数据的存储&#xff08;物理&#xff09;结构2.3 数据的运算 二、算法1、算法概念2、算法的特性及特点3、算法分析 一、数据结构 1、数据结构的基本概念 数据&#xff1a; 是所有能输入到计…

利用SpringBoot+rabbitmq 实现邮件异步发送,保证100%投递成功

在之前的文章中&#xff0c;我们详细介绍了 SpringBoot 整合 mail 实现各类邮件的自动推送服务。 但是这类服务通常不稳定&#xff0c;当出现网络异常的时候&#xff0c;会导致邮件推送失败。 本篇文章将介绍另一种高可靠的服务架构&#xff0c;实现邮件 100% 被投递成功。类…

基于Java中的SSM框架实现水稻朔源信息系统项目【项目源码】

基于Java中的SSM框架实现水稻朔源信息系统演示 SSM框架 SSM框架是基于Spring、SpringMVC以及Mybatis实现的针对JAVA WEB端应用的开发框架&#xff0c;通过SSM框架结构可以实现以上三种框架的优点集合&#xff0c;从而实现更加高效便捷的系统开发和呈现。该框架结构通过Spring框…

红日靶场----(二)2.信息收集

上期我们已经猜解到了MySQL的账号密码。 这期我们开始目录枚举&#xff0c;我们知道目录枚举能不能获得有用的信息&#xff0c;需要强大的字典。 只有字典强大才能精准的爆破到目录及文件&#xff0c;下面我会介绍一个强大的字典文件。 目录枚举之SecLists字典&#xff1a; …

面试题 22:解释 Python 中的成员运算符?

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

如何恢复永久删除的婚礼照片

我们的生活就像一本记忆剪贴簿&#xff0c;充满了褪色和模糊的快照。尽管我们想记住事情并留住快乐的回忆&#xff0c;但随着时间的流逝&#xff0c;它们会被冲走。为了避免这种情况并记住这些记忆&#xff0c;我们以照片的形式捕捉瞬间。这有助于缓解和分享那些快乐的时刻。但…

SpringIOC原理

SpringIOC原理 1.概念 Spring通过一个配置文件描述Bean及Bean之间的依赖关系&#xff0c;利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。Spring的IOC容器在完成这些底层工作的基础上&#xff0c;还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、…

手机回收站视频过期怎么恢复?跟随这2个方法解锁新技能

各位看官&#xff0c;是不是有时候一不留神&#xff0c;手机里的珍贵视频就不翼而飞了&#xff1f;然后你疯狂地寻找&#xff0c;心里五味杂陈&#xff0c;就像热锅上的蚂蚁一样团团转。视频过期怎么恢复&#xff0c;到底怎样才能找回来呢&#xff1f;别担心&#xff0c;今天小…