80.【C语言】数据结构之时间复杂度

目录

1.数据结构的定义

2.算法的定义

3.算法的效率

1.衡量一个算法的好坏的方法

例题:计算以下代码的循环次数

2.大O的渐进表示法

练习1:求下列代码的时间复杂度

练习2:求下列代码的时间复杂度

练习3:求下列代码的时间复杂度

练习4:求下列代码的时间复杂度

4.总结:计算时间复杂度的方法

5.时间复杂度的排名


1.数据结构的定义

参见63.【C语言】再议结构体(上)

也可以理解为数据在内存中的存储形式(管理数据)

比如说写通讯录可以用静态数组,动态数组和链表形式存储

2.算法的定义

简单的定义:一系列的计算步骤,用来将输入数据转化成输出结果

3.算法的效率

1.衡量一个算法的好坏的方法

两个方面衡量:时间效率(计算时间分复杂度)和空间效率(空间复杂度)

比较时间要在同一个环境下进行(为了控制变量,但在实际情况下难以控制)

-->比较运行次数(和环境无关)

运行次数举例:对于同一组数据,快速排序和冒泡排序的运行次数不同

例题:计算以下代码的循环次数

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

定义一个函数F(N),其值为循环次数

可得:F(N)=N^2+2N+10

N=10F(N)=130
N=100F(N)=10210
N=1000F(N)=1002010

但实际中计算时间复杂度时,其实并不一定要计算精确的执行次数,而只需要知道大概的执行次数,那么这里使用大O的渐进表示法

比如可以计算量级(N=10的次方),当N较大时(可理解为n \to \infty),影响F(N)的值主要为N^2,因此$F(N) \approx N^2$

对比N^2N^2+2N+10的两张图

2.大O的渐进表示法

大O符号:用于描述函数渐近行为的数学符号,可以用来衡量时间复杂度和空间复杂度

在上述函数中,Func1的时间复杂度为O(N^2),其去掉了对结果影响不大的地方

练习1:求下列代码的时间复杂度

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

运行次数n==2N+10

1.取最高阶的式子(去常数)

n \to \infty时,+10对结果影响不大,因此$2N+10 \approx 2N$

2.去系数

因为n \to \infty时,N前面的系数对结果影响也不大(\lim_{n \to \infty} 2N = \lim_{n \to \infty} N = \infty),因此时间复杂度为O(N)

练习2:求下列代码的时间复杂度

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

O(100)吗?不是,为O(1),这里的1不是次数,而是指常数次

练习3:求下列代码的时间复杂度

#include <stdio.h>
const char* strchr( const char* str, char character)
{while (*str){if (*str == character)return str;str++;}return str;
}int main()
{char character;char str[100] = { 0 };scanf("%c", &character);scanf("%s", str); // 数组名就是数组的首元素地址const char* s_str=strchr(str, character);printf("%s", s_str);
}

发现:运算次数和字符串的长度以及和要找的字符位置有关

即该题的时间复杂度存在最好,平均和最坏情况:

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

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

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

按预期管理来看,应该取最坏的情况,即O(N),N为输入字符串的长度

练习4:求下列代码的时间复杂度

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{int n = 0;int arr[100] = { 0 };int tmp = 0;//输入元素a:printf("输入数组元素个数:");scanf("%d", &n);if (n > 100 || n < 1){printf("输入的元素个数超出范围或无效!请重新输入!\n");goto a;}printf("输入数组元素:");for (int k = 0; k < n; k++){scanf("%d", &arr[k]);}//冒泡排序for (int i = 1; i <= n - 1; i++)//趟数{int flag = 1;//每趟排序时置为1for (int j = 0; j <= n - i - 1; j++)//步数{if (arr[j] > arr[j + 1]){tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = 0;//发生交换flag置0}}if (1 == flag){break;//未发生交换则退出循环}}//打印结果for (int q = 0; q < n; q++){printf("%d ", arr[q]);}return 0;
}

同样的,在冒泡排序(参见42.【C语言】冒泡排序)中,运算次数也有最好和最坏的情况

显然此代码是按升序排列

最好:给的数组就是按升序排列的(如0 1 2 3 4 5 6 7 8 9)

尽管j的for循环中的if判断的交换没有执行(相当于空转),但由于flag一直为0,因此到j为8时才能退出循环

因此运行次数n==N-1-->舍去常数后-->N

因此最好:O(N)

最坏:给的数组就是按降序排列的(如9 8 7 6 5 4 3 2 1 0)

因此因此运行次数n==(N-1)+(N-2)+(N-3)+...+(1)==(1+N-1)*(N-1)/2==(N^2-N)/2

取最高阶的式子0.5N^2,去掉最高阶式子前的系数-->N^2

因此最坏:O(N^2)

4.总结:计算时间复杂度的方法

若次数为常数,时间复杂度为O(1)

若次数为N的表达式

1.取最高阶的式子(去常数) 2.去掉最高阶式子前的系数

若存在最好,最坏情况,取最坏的情况作为时间复杂度

5.时间复杂度的排名

O(1)<O(logN)<O(N)<O(N*logN)<O(N^3)<O(2^N)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—1115. 交替打印 FooBar【中等】(多线程)

2024每日刷题&#xff08;180&#xff09; Leetcode—1115. 交替打印 FooBar C实现代码 class FooBar { private:int n;sem_t fooSem;sem_t barSem;public:FooBar(int n) {this->n n;sem_init(&fooSem, 0, 1);sem_init(&barSem, 0, 0);}~FooBar() {sem_destroy(&…

mac安装brew时踩坑解决方案

安装包 mac上如果按照git等工具可能会使用brew&#xff0c;例如使用&#xff1a;$ brew install git命令&#xff0c;如果电脑没有按照brew&#xff0c;则会提示&#xff1a;zsh: command not found: brew 解决方案 需要我们打开brew的官网https://brew.sh/&#xff0c;复制…

机器学习|Pytorch实现天气预测

机器学习|Pytorch实现天气预测 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 电脑系统&#xff1a;Windows11 显卡型号&#xff1a;NVIDIA Quadro P620 语言环境&#xff1a;python 3.9.7 编译器&#x…

得物App3D创新应用引关注,世界设计之都大会启幕

近日&#xff0c;2024世界设计之都大会&#xff08;WDCC&#xff09;在上海盛大启幕。此次大会以“设计无界 新质生长”为主题&#xff0c;汇聚了全球设计领域的精英与前沿成果&#xff0c;展现了设计作为新质生产力的巨大潜力。主场展览占据了整整3个楼面&#xff0c;总面积达…

进程间关系与守护进程

一、进程组 1.1、什么是进程组 提到进程的概念&#xff0c; 其实每一个进程除了有一个进程 ID(PID)之外 还属于一 个进程组。进程组是一个或者多个进程的集合&#xff0c; 一个进程组可以包含多个进程。 每一 个进程组也有一个唯一的进程组 ID(PGID)&#xff0c; 并且这个 PG…

SCI英文文献阅读工具【全文翻译】【逐句翻译】

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 SCI英文文献阅读工具【全文翻译】【逐句翻译】 1. 全文翻译【DeepL】 适用于泛读网址&#xff1a;https://www.deepl.com/zh/translator/files 1.1 前提 文档大小&#xff1a;pdf文档不超过5M&#xff08;可先…

设计模式05-创建型模式(建造者/原型/单例模式/Java)

3.4 建造者模式 3.4.1 建造者模式的定义 动机&#xff1a;方便创建复杂对象&#xff08;一个对象中包含多个成员变量&#xff09; 定义&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂…

计算机视觉中的最小二乘法:寻找完美交点和直线拟合

Hello&#xff0c;小伙伴们&#xff01;今天我们要聊的是计算机视觉中的一个小技巧——使用最小二乘法来进行交点计算和直线拟合。你有没有想过&#xff0c;如何从一堆杂乱无章的数据点中找到那条最佳拟合直线&#xff1f;或者&#xff0c;如何确定几条直线相交的确切位置&…

OpenCV物体跟踪:使用CSRT算法实现实时跟踪

目录 简介 CSRT算法简介 实现步骤 1. 初始化摄像头和跟踪器 2. 读取视频帧和初始化跟踪 3. 实时跟踪和显示结果 4. 显示和退出 5、结果展示 总结 简介 在计算机视觉和视频处理领域&#xff0c;物体跟踪是一项核心技术&#xff0c;它在监控、人机交互、运动分析等方面…

CSS布局/简单应用

思考下面四个图片如何布局 test1 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

双十一有啥好用的物品可以推荐购买?2024不可错过的必囤好物清单!

双十一购物狂欢节即将拉开帷幕&#xff0c;许多朋友们可能还在犹豫不决&#xff0c;不知道应该选购哪些商品。别担心&#xff0c;今天我特意为大家精心准备了一份包含五款必囤好物的清单&#xff0c;希望能够帮助大家在双十一期间抢购到心仪的商品&#xff0c;享受购物的乐趣&a…

《米小圈动画成语》|在趣味中学习,在快乐中掌握成语知识!

作为一名家长&#xff0c;我一直希望孩子能够在学习的过程中既感受到乐趣&#xff0c;又能获得真正的知识。成语作为中华文化的精华&#xff0c;虽然意义深远、简洁凝练&#xff0c;但对于一个小学生来说&#xff0c;学习和理解这些言简意赅的成语无疑是一个挑战。尤其是有些成…

将本地文件上传到GIT上

上传文件时&#xff0c;先新建一个空文件&#xff0c;进行本地库初始化&#xff0c;再进行远程库克隆&#xff0c;将要上传的文件放到克隆下来的文件夹里边&#xff0c;再进行后续操作 1.在本地创建文件夹&#xff0c;将要上传的文件放在该文件下 2.在该文件页面中打开Git Bas…

ai字幕用什么软件制作?6款视频加字幕工具分享!

在视频制作和后期处理中&#xff0c;字幕的添加是一个重要的环节。随着AI技术的发展&#xff0c;越来越多的软件开始支持AI自动加字幕功能&#xff0c;使得字幕的制作变得更加简单和高效。本文将为大家介绍几款常用的AI字幕制作软件&#xff0c;并详细讲解如何使用AI自动加字幕…

TDD(测试驱动开发)是否已死?

Rails 大神、创始人 David Heinemeier Hansson 曾发文抨击TDD。 TDD is dead. Long live testing. (DHH) 此后, Kent Beck、Martin Fowler、David Hansson 三人就这个观点还举行了系列对话&#xff08;辩论&#xff09; Is TDD Dead? 笔者作为一个多年在软件测试领域摸索的人&…

Linux——动态卷的管理

确保已经设置了对应的动态卷的驱动&#xff08;provisioner 制备器&#xff09;基于动态驱动创建对应的存储类创建PVC &#xff08;PVC 将会自动根据大小、访问模式等创建PV&#xff09;Pod的spec 中通过volumes 和 volumemounts 来完成pvc 的绑定和pvc对应pv的挂载删除pod 不…

Java基于微信小程序的公考学习平台的设计与实现,附源码+文档

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

新魔百和cm311-5 ZG 4+16g 卡刷语音固件教程

新魔百和cm311-5_国科6323_蓝牙版刷 准备工具&#xff1a;U盘、短接工具、 固件包&#xff1a;CM311-5-zg链接 https://pan.baidu.com/s/1f5NxmCGCO0F84RQRBrSMRg 提取码: b7f1 操作步骤&#xff1a; 1、用不大于8G U盘&#xff0c;先做FAT32&#xff0c;2048块单分区格式化后…

Yoga Pro 13s 2021款Intel处理器ITL版(82HJ)原厂Win10系统镜像下载

lenovo联想Yoga-PRO-13S笔记本电脑恢复开箱状态预装OEM系统Windows10安装包 链接&#xff1a;https://pan.baidu.com/s/1YjGCXe_Zxkwcgum3TWZx5g?pwdshqu 提取码&#xff1a;shqu 联想原装系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、O…

桂林旅游一点通:SpringBoot平台应用

3系统分析 3.1可行性分析 通过对本桂林旅游景点导游平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本桂林旅游景点导游平台采用SSM框架&#xff0c;JAVA作…