时间复杂度与空间复杂度(小白向)

🤖💻👨‍💻👩‍💻🌟🚀

🤖🌟 欢迎降临张有志的未来科技实验室🤖🌟

专栏:数据结构

👨‍💻👩‍💻 先赞后看,已成习惯👨‍💻👩‍💻

👨‍💻👩‍💻 创作不易,多多支持👨‍💻👩‍💻

🚀 启动创新引擎,揭秘C语言的密码🚀

目录

大O表示法

时间复杂度

打印数组

二分查找

空间复杂度

常数空间复杂度 O(1) 示例:交换两个变量的值

线性空间复杂度 O(n) 示例:数组复制

对数空间复杂度 O(log n) 示例:斐波那契数列(递归版)

优化策略


大O表示法


        大O表示法的字母O是函数的增长率,也被称为函数的阶数,即字母O代表Order(阶数)。用大O符号描述函数通常只提供函数增长率的一个上界

常见的有:O(1),O(n),O(n²) ,O(nlogn),O(logn)。

时间复杂度


        时间复杂度和空间复杂度是计算机科学中用于评估算法效率的重要指标。这两个概念可以帮助我们了解算法在时间和空间方面的需求,从而优化算法以提高其性能。

        时间复杂度:也称为时间复杂度和时间频度,是一个用于描述算法执行时间随输入规模增长而增长的量级。具体来说,时间复杂度是一个函数,它定性描述一个算法的运行时间。

计算时间复杂度的方法如下

  1. 确定算法中的基本操作。
  2. 计算基本操作执行的次数。
  3. 确定时间复杂度的表示方式。

打印数组

#include <stdio.h>

void print(int* arr, int size)
{
	for (int i = 0; i < 2*size; i++)
		printf("%d ", arr[i]);
}

int main()
{
	
	return 0;
}

  函数实现了打印数组的功能,用函数表示上述函数的运行次数就是 y = 2*x,时间复杂度O(n)。

思考:为什么运行2*size次,但时间复杂度不是O(2N)而是O(N) ?

答:目前大多数家用计算机的CPU运算速度大约为每秒50亿次计算,计算10次和20次区别不大。我们可以将 n 看做 无穷大(∞),2*n 与 n 没有区别,所以我们索性看做O(n)

二分查找

int binarySearchWithLoop(int arr[], int n, int x) {
    int left = 0;
    int right = n - 1;
    
    while (left <= right) {
        int mid = left + (right - left) / 2;
        
        // 如果x是中间元素
        if (arr[mid] == x)
            return mid;
        
        // 如果x小于中间元素,只在左半部分继续寻找
        if (arr[mid] > x)
            right = mid - 1;
        else
            // 如果x大于中间元素,只在右半部分继续寻找
            left = mid + 1;
    }
    
    // 如果x不在数组中
    return -1;
}

经典的二分查找,left right每一次循环直走一步,用函数表达就是n=2^k,k表示运行的次数,由此我们可以得到 𝑘=log2​n。时间复杂度为O(logN),这里省略底数与上文同理。

空间复杂度


当我们理解时间复杂度后,学习空间复杂度变得容易许多。

概念:用于描述执行算法所需的内存空间。空间复杂度主要取决于算法在执行过程中所使用的额外空间

常数空间复杂度 O(1) 示例:交换两个变量的值

void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

额外空间只有temp一个变量,所以空间复杂度为O(1)。

线性空间复杂度 O(n) 示例:数组复制

void copyArray(int src[], int dest[], int n) {
    for(int i = 0; i < n; i++) {
        dest[i] = src[i];
    }
}

该函数复制一个长度为n的数组到另一个数组中,需要额外的数组dest[]用于存储结果,因此其空间复杂度为O(n)。

对数空间复杂度 O(log n) 示例:斐波那契数列(递归版)

int binarySearch(int arr[], int l, int r, int x) {
    while (l <= r) {
        int m = l + (r - l) / 2;
        if (arr[m] == x)
            return m;
        if (arr[m] < x)
            l = m + 1;
        else
            r = m - 1;
    }
    return -1;
}

二分查找中,虽然没有显式的对数级的额外空间,但递归调用栈的深度为O(log n),因此在考虑递归空间时,整体的空间复杂度也是O(log n)。


优化策略

  • 时间优化:在C语言编程中,可以通过选择更高效的算法(如快速排序代替冒泡排序)、减少循环层数、利用缓存等手段来降低时间复杂度。

  • 空间优化:尽量复用内存、采用迭代而非递归(减少栈的使用)、合理设置数据结构来减少不必要的空间占用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

002-基于Sklearn的机器学习入门:回归分析(上)

本节及后续章节将介绍机器学习中的几种经典回归算法&#xff0c;所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇&#xff0c;将介绍基础的线性回归方法&#xff0c;包括线性回归、逻辑回归、多项式回归和岭回归等。 2.1 回归分析概述 回归&#xff08;Regression&…

Vue3学习(一)

创建组件实例&#xff1a;我们传入 createApp 的对象实际上是一个组件 import { createApp } from vue // 从一个单文件组件中导入根组件 import App from ./App.vueconst app createApp(App) 大多数真实的应用都是由一棵嵌套的、可重用的组件树组成的。 App (root compone…

AI大模型的崛起:第四次工业革命的前奏?

在当今这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;大模型的崛起引起了广泛的关注和讨论。有人将其视为第四次工业革命的前奏&#xff0c;然而&#xff0c;这真的可能吗&#xff1f;本文将探讨这一问题&#xff0c;并对中国AI大模型的发展进行简要分析。…

Android:移动垃圾软件

讲解政策相关,最近升级AI扫荡系统和证书防高风险,回复按留言时间来排,请耐心等待 移动垃圾软件 官方政策公告行为透明、信息披露清晰保护用户数据不要损害移动体验软件准则反垃圾软件政策Google API 服务用户数据政策官方政策公告 ​ 在 Google,我们相信,如果我们关注用户…

DIY智能音箱:基于STM32的低成本解决方案 (附详细教程)

摘要: 本文详细介绍了基于STM32的智能音箱的设计与实现过程&#xff0c;包括硬件设计、软件架构、语音识别、音乐播放等关键技术。通过图文并茂的方式&#xff0c;结合Mermaid流程图和代码示例&#xff0c;帮助读者深入理解智能音箱的工作原理&#xff0c;并提供实际操作指导。…

[图解]分析模式高阶+课程讲解03物品模式

1 00:00:00,280 --> 00:00:03,440 下一个要探讨的模式是物品模式 2 00:00:04,310 --> 00:00:08,300 说是物品模式&#xff0c;实际上更多的说物品规格 3 00:00:09,210 --> 00:00:12,560 首先&#xff0c;我们要区分一下物品和物品规格的定义 4 00:00:14,440 -->…

【C++】C++ 网店销售库存管理系统(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

抖音直播自动点赞脚本:让点赞变得简单

抖音直播自动点赞脚本&#xff1a;让点赞变得简单 简介 点赞是社交媒体上表达喜爱的一种方式&#xff0c;尤其在抖音这样的平台上&#xff0c;点赞不仅能够增加主播的人气&#xff0c;还能鼓励他们创作更多优质内容。然而&#xff0c;手动点赞往往既耗时又费力。为了解决这个…

算法与数据结构面试宝典——常见的数据结构都有哪些?详细示例(C#,C++)

文章目录 一、逻辑结构&#xff1a;线性与非线性线性数据结构非线性数据结构访问方式 二、数组&#xff08;Array&#xff09;三、链表&#xff08;LinkedList&#xff09;四、栈&#xff08;Stack&#xff09;五、队列&#xff08;Queue&#xff09;六、树&#xff08;Tree&am…

Android高级面试_6_性能优化

Android 高级面试-7&#xff1a;网络相关的三方库和网络协议等 1、网络框架 问题&#xff1a;HttpUrlConnection, HttpClient, Volley 和 OkHttp 的区别&#xff1f; HttpUrlConnection 的基本使用方式如下&#xff1a; URL url new URL("http://www.baidu.com")…

pytest测试框架pytest-random-order插件随机执行用例顺序

Pytest提供了丰富的插件来扩展其功能&#xff0c;本章介绍下pytest-random-order插件&#xff0c;随机设置pytest测试用例的运行顺序&#xff0c;并对随机性进行一些控制。 官方文档&#xff1a; https://pytest-cov.readthedocs.io/en/latest/index.html 适配版本说明&#x…

AI智能客服项目拆解(1) 产品大纲

本文作为拆解AI智能客服项目的首篇&#xff0c;以介绍产品大纲为主。后续以某AI智能客服产品为例&#xff0c;拆解相关技术细节。 AI智能客服是一种基于人工智能技术的客户服务解决方案&#xff0c;旨在提高客户满意度和优化企业运营。利用人工智能和自然语言处理技术&#xff…

如何为数据库中的位图添加动态水印

许多数据库存储了以blob或文件形式保存的位图&#xff0c;其中包括照片、文档扫描、医学图像等。当这些位图被各种数据库客户端和应用程序检索时&#xff0c;为了日后的识别和追踪&#xff0c;有时需要在检索时为它们添加唯一的水印。在某些情况下&#xff0c;人们甚至希望这些…

数字图像处理之【高斯金字塔】与【拉普拉斯金字塔】

数字图像处理之【高斯金字塔】与【拉普拉斯金字塔】 1.1 什么是高斯金字塔&#xff1f; 高斯金字塔&#xff08;Gaussian Pyramid&#xff09;是一种多分辨率图像表示方法&#xff0c;用于图像处理和计算机视觉领域。它通过对原始图像进行一系列的高斯平滑和下采样操作&#x…

istitle()方法——判断首字母是否大写其他字母小写

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 istitle()方法用于判断字符串中所有的单词首字母是否为大写而其他字母为小写。istitle()方法的语法格式如下&#xff1a; str.istitle() …

Java并发编程基础知识点

目录 Java并发编程基础知识点1、线程&#xff0c;进程概念及二者的关系进程相关概念线程相关概念进程与线程的关系补充小知识点&#xff1a; 2、线程的状态Java线程的状态&#xff1a;Java线程不同状态之间的切换图示 3、Java程序中如何创建线程&#xff1f;①、继承Thread类②…

【python】python知名品牌调查问卷数据分析可视化(源码+调查数据表)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

某度,网盘免费加速,复活!

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 有小伙伴反馈之前如下夸克网盘脚本的加速方法失效&#xff0c;小武今天测试&#xff0c;依旧正常使用&#xff01; 百度/迅雷/夸克&#xff0c;网盘免费加速&#xff0c;已破&#xf…

Vite: 高阶特性 Pure ESM

概述 ESM 已经逐步得到各大浏览器厂商以及 Node.js 的原生支持&#xff0c;正在成为主流前端模块化方案。 而 Vite 本身就是借助浏览器原生的 ESM 解析能力( type“module” )实现了开发阶段的 no-bundle &#xff0c;即不用打包也可以构建 Web 应用。不过我们对于原生 ESM 的…

线性表与顺序存储结构(下)

前言 接上文&#xff08;线性表与顺序存储结构&#xff08;上&#xff09;&#xff09;。 这些顺序存储结构的方法在顺序表上下卷中已经提到过&#xff0c;但是有些许不同&#xff0c;可以为理解顺序表提供更丰富的视角。&#xff08;不过最主要的区别在于顺序表上下卷中的顺…