C语言数据结构(1)复杂度(大o阶)

news2025/1/22 16:50:29

欢迎来到博主的专栏——C语言与数据结构
博主ID——代码小豪

文章目录

    • 如何判断代码的好坏
    • 时间复杂度
      • 什么是时间复杂度
      • 如何计算时间复杂度
    • 空间复杂度

如何判断代码的好坏

实现相同作用的不同代码,如何分辨这些代码的优劣之处呢?

有人说了,我写的代码10行,别人写的是20行,我的代码更加简洁。那就是好代码

在可读性方面可能会更优(简洁≠可读性高),但是一个软件的使用者是用户啊,用户不需要能够看明白你的代码,用户需要的是软件的使用体验。

因此判断一个算法的好与劣可以用运行时间来衡量。

那么如何得到一个程序的运行时间呢?最好的方法当然是运行测试一下。但是这样做的问题也就出现了。

我用一台00年的电脑,和一台24年电脑运行一段代码,当然是24年的电脑运行更快啦,甚至有可能是24年的电脑运行坏代码比00年的电脑运行好代码更快。那么难道能说运行快的代码比较好?

这种判断的方法明显受到了硬件层面的影响,程序员应该专注于程序,在程序方面来判断算法的优劣,于是时间复杂度和空间复杂的概念就出现了。

这两个概念是用来判断实现的代码的算法的优劣性的。

时间复杂度

代码的运行时间,和算法的执行次数是明显呈现正相关关系的。

比如那个写了10行的代码,但是循环了100多次。而那个写了20行的代码,只需要执行1次。那么很明显,后者的运行时间快于前者。

时间复杂度的判断也是基于此,通过计算算法的执行次数来估计程序的运行快慢

什么是时间复杂度

时间复杂度是一个数学函数,用来评估一个算法在n的输入规模下,与执行指令的次数的关系

以计算1~n的各个数之和为例。常见的算法有以下两种

int sum_of_nums(int n)
{
	int sum = 0;
	for (int i = 1; i < n; i++)
	{
		sum += i;
	}
	return sum;
}

可以发现,当n为100时,这个算法执行的指令次数为202次

```c
int sum_of_nums(int n)
{
	int sum = 0;//1次
	for (int i = 1; i <= n; i++)//100次
	{
		sum += i;//100次
	}
	return sum;//1次
}

如果输入为n,那么这个算法执行的指令总次数为2n+2次。

高中数学学过等差数列的求和公式为

Sn=n*(a1+an)/2

而1~n的整数求和本质上也就是a1为1,an为n的等差数列求和,所以用这种算法写出来的代码如下

int sum_of_nums(int n)
{
	int sum = 0;
	sum = n * (1 + n) / 2;
	return sum;
}

这个算法无论输入N等于多少,指令的执行次数都是3次。

很明显后者的算法优于前者,并且随着n的增加,后者的优势会更加明显。

那么我们假设还有一种算法,其实现是这样的

int sum_of_nums(int n)
{
	int sum = 0;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= i; j++)
		{
			if (j == i)
				sum += j;
		}
	}
	return sum;
}

如果输入为n,这个算法执行的次数为(1+2+3+……+n)+2,即n/2+n^2/2+2.

将上述算法的指令执行次数和输入规模的关系画成一个函数关系图,图形如下:
在这里插入图片描述
(手绘图形,不会画曲线–+)

根据图形,算法一:f(N)=2N+2是一个线性函数,因此时间复杂度是O(N),也就是常说的线性阶

算法2 f(N)=3,可以看到图像是一个常数函数,因此时间复杂度为O(1),也就是常数阶。

算法3 f(N)=N/2+N^2/2+2 可以看到图像是一个指数函数,因此时间复杂度为O(N^2),即指数阶。

时间复杂度O(f(n))是用来评定算法的快慢的,大O阶实际上是一个估值。或者说是一个算法的评级,常见的复杂度有以下几种
(1)常数阶,O(1)
(2)线性阶,O(2)
(3)对数阶,O(logN) (二分查找就是典型的O(logN)的算法)
(4)指数阶,O(N^2)

看到这有人就觉得很疑惑了,比如我写的一个算法,运行指令和输入的关系函数f(n)=n,而别人的是f(n)=2n,但是为什么时间复杂度都是O(N)呢,明明我的程序更好啊,我不服。

实际上时间复杂度可以认为是一个算法的评级,比如考英语四级,我考了424,而别人考了100,虽然我的英语水平肯定高于100,但是英语的评级我们两个都是没过四级。

当然了,这种优化还是不错的,虽然没有将O(N)变成O(1),但是在运行速度当然会更快一步。

如何计算时间复杂度

时间复杂度的计算方式在上面就已经可以明显感觉到了。

即时间复杂度取决于输入与执行指令的关系函数的最高次数项。
比如f(N)=2N^2+22+3,那么这个算法的时间复杂度就是O(N^2),实际上也是很好理解的,如下图
在这里插入图片描述
对比可以发现,当n超过一定数量的时候, 只有次数高的项对指令的运行次数影响最大,其余项可以忽略不计。

计算大O阶的方法总结
(1)只保留最高次数项
(2)保留的最高次数项将系数改为1
(3)如果只有常数项,那么就是1.

空间复杂度

算法中除了运行的指令外,还有用来存储数据的内存空间也是需要考虑在内的,但是现代的计算机对于空间的需求已经不再那么抠抠索索了,甚至大部分的算法采取的思路都是“以空间换取时间”。

比如判断1~10000的水仙花数,除了使用大量的指令让其计算以外,也可以创造一个10000元素大小的数组,将已知的水仙花数对应下标的元素记为1,这样子就从计算水仙花数的问题,变为了检索数组元素的问题,时间缩减,但是空间上要多出10000个元素的空间占用。

空间复杂度的计算公式为S(n)=O(f(n)),f(n)为执行指令时,对内存占用空间的函数,比如递归的空间复杂度就是O(n),因为每次执行递归,都会在内存中多开辟一个空间。

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

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

相关文章

GPT实战系列-简单聊聊LangChain搭建本地知识库准备

GPT实战系列-简单聊聊LangChain搭建本地知识库准备 LangChain 是一个开发由语言模型驱动的应用程序的框架&#xff0c;除了和应用程序通过 API 调用&#xff0c; 还会&#xff1a; 数据感知 : 将语言模型连接到其他数据源 具有代理性质 : 允许语言模型与其环境交互 LLM大模型…

6、C语言:输入与输出

输入输出 标准输入输出getchar&putchar函数printf函数sprintf函数格式化输入——scanf函数 文件访问文件读写 错误处理&#xff1a;stderr和exit行输入和行输出常用函数字符串操作函数字符类别测试和转换函数存储管理函数数学函数随机数发生器函数其他 标准输入输出 getch…

vue文件在<template>中使用多个<el-main>报错(已解决)

目录 1.原理 2. 根据你的需求&#xff0c;自定义每个 组件的内容。你可以在 标签内部插入文本、其他组件、样式等。 3. 根据需要添加样式或其他属性到每个 组件。你可以使用 class、style 或其他属性来自定义每个组件的外观和行为。 4.一个可以运行的总代码如下 5.我的一…

VQE音频处理流程

VQE 上行VQE&#xff0c;主要针对MIC采集部分的音频增强 下行VQE&#xff0c;主要针对SPK播放部分的音频增强 附关键词解释 RES RES 模块为重采样&#xff08;Resampler&#xff09;模块。当AI上行或AO下行通路中开启VQE 各功能 模块时&#xff0c;在处理前后各存在一次重采样…

COBOL语言 :一种主要专注于解决业务问题的编程语言

译文&#xff1a; 什么是COBOL? COBOL是一种主要专注于解决业务问题的编程语言。COBOL的完整形式是面向业务的通用语言。它主要用于公司和政府的商业、金融和行政系统。这种语言也被用来解决许多数据处理问题。 它是由CODASYL(数据系统语言会议)开发的。它被用作大型机中的一…

DSL查询文档--查询结果处理

排序 elasticsearch默认是根据相关度算分&#xff08;_score&#xff09;来排序&#xff0c;但是也支持自定义方式对搜索结果排序。可以排序字段类型有&#xff1a;keyword类型、数值类型、地理坐标类型、日期类型等。 普通字段排序 keyword、数值、日期类型排序的语法基本一…

【JAVA】在 Queue 中 poll()和 remove()有什么区别

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 poll() 方法&#xff1a; remove() 方法&#xff1a; 区别总结&#xff1a; 结语 我的其他博客 前言 在Java的Queue接口中&…

初识C语言·内存函数

目录 1 memcpy的使用和模拟实现 2 memmove的使用和模拟实现 3 memset的使用和模拟实现 4 memcmp的使用和模拟实现 1 memcpy的使用和模拟实现 紧接字符串函数&#xff0c;出场的是第一个内存函数memcpy。前面讲的字符串函数是专门干关于字符串的事的&#xff0c;而这个函数…

(十二)EEPROM的补充

文章目录 EEPROM补充篇读EEPROM补充内容写EEPROM补充内容单字节写入多字节拆成单字节写入现象 EEPROM补充篇 读EEPROM补充内容 对于上一篇博文在读EEPROM的时候&#xff0c;提到的DUMMY WRITE&#xff1a; 这里怎么理解呢&#xff1a; 大家看&#xff0c;写EEPROM的逻辑除了…

c++学习笔记-STL案例-演讲比赛管理系统2

目录 功能介绍 代码结构部分 查看一下类图 1.Speaker.h 2.speechManager.h 3.speechManager.cpp 4.演讲比赛流程关系系统.cpp 功能介绍 speechManager.h函数包含演讲比赛流程的所有功能如下&#xff1a; 开始演讲比赛&#xff1a;完成整届比赛的流程&#xff0c;每…

为什么使用双token实现无感刷新用户认证?

单token机制 认证机制&#xff1a;对与单token的认证机制在我们项目中仅使用一个Access Token的访问令牌进行用户身份认证和授权的方案处理。 不足之处&#xff1a; 安全性较低&#xff08;因为只有一个token在客户端和服务器端之间进行传递&#xff0c;一旦Access Token被截…

解决ERROR 24680 --- [ main] o.a.catalina.core.AprLifecycleListener 报错:

1.报错全称&#xff1a; ERROR 24680 --- [ main] o.a.catalina.core.AprLifecycleListener : An incompatible version [1.2.32] of the Apache Tomcat Native library is installed, while Tomcat requires version [1.2.34] 2.解决方案&#xff1a; 步骤一 在…

Linux下编写zlg7290驱动(1)

大家好&#xff0c;今天给大家介绍Linux下编写zlg7290驱动(1)&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 在智能仪表中&#xff0c;经常会用到键盘、数码管等外设。因此&…

LLM之RAG理论(五)| 使用知识图谱增强RAG

知识图谱&#xff08;KG&#xff09;或任何图都包括节点和边&#xff0c;其中每个节点表示一个概念&#xff0c;每个边表示一对概念之间的关系。本文介绍一种将任何文本语料库转换为知识图谱的技术&#xff0c;本文演示的知识图谱可以替换其他专业知识图谱。 一、知识图谱 知识…

【PyTorch简介】3.Loading and normalizing datasets 加载和规范化数据集

Loading and normalizing datasets 加载和规范化数据集 文章目录 Loading and normalizing datasets 加载和规范化数据集Datasets & DataLoaders 数据集和数据加载器Loading a Dataset 加载数据集Iterating and Visualizing the Dataset 迭代和可视化数据集Creating a Cust…

深度解析Pytest插件pytest-html

在软件开发中&#xff0c;测试报告是开发者获取测试结果和问题定位的关键工具之一。然而&#xff0c;标准的控制台输出有时难以满足我们对测试报告的需求。幸运的是&#xff0c;Pytest插件 pytest-html 提供了一种简单而强大的方式&#xff0c;可以生成漂亮、可视化的HTML格式测…

Python之Matplotlib绘图调节清晰度

Python之Matplotlib绘图调节清晰度 文章目录 Python之Matplotlib绘图调节清晰度引言解决方案dpi是什么&#xff1f;效果展示总结 引言 使用python中的matplotlib.pyplot绘图的时候&#xff0c;如果将图片显示出来&#xff0c;或者另存为图片&#xff0c;常常会出现清晰度不够的…

如何开启文件共享及其他设备如何获取

1.场景分析 日常生活中&#xff0c;常常会遇到多台电脑共同办公文件却不能共享的问题&#xff0c;频繁的用移动硬盘、U盘等拷贝很是繁琐&#xff0c;鉴于此&#xff0c;可以在同一内网环境下设置共享文件夹&#xff0c;减少不必要的文件拷贝工作&#xff0c;提升工作效率。废话…

什么是信噪比

大家好&#xff0c;今天给大家介绍什么是信噪比&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 “信噪比”是电子技术中经常用到的一个词组&#xff0c;知道它的确切含义有一定意…

[含完整代码]Linux使用.sh脚本自动部署(启动|停止|状态|日志)项目[超详细]

前言&#xff1a; 个人博客&#xff1a;www.wdcdbd.com 我们在linux部署.jar项目时&#xff0c;都需要通过java -jar的形式来部署&#xff0c;每次都要手动停止&#xff0c;部署&#xff0c;这样用起来会很麻烦。所以&#xff0c;这篇文章就是自己通过.sh脚本一键启动&#xf…