c语言版:数据结构(时间复杂度,空间复杂度,练习)

时间复杂度

概念

   时间复杂度是用来衡量算法执行时间的一个指标。它表示随着输入规模的增加,算法执行时间的增长率。时间复杂度通常用大O符号表示。

   在计算时间复杂度时,通常会忽略常数项、低阶项和系数项只关注随着输入规模增长而导致的主要影响。这是因为在实际应用中,常数项、低阶项和系数项的影响往往可以忽略不计。

常见的时间复杂度有以下几种:

  1. 常数时间复杂度(O(1)):无论输入规模的大小,算法的执行时间都是恒定的。

  2. 线性时间复杂度(O(n)):算法的执行时间与输入规模成正比。

  3. 对数时间复杂度(O(log n)):算法的执行时间与输入规模的对数成正比。

  4. 平方时间复杂度(O(n^2)):算法的执行时间与输入规模的平方成正比。

  5. 指数时间复杂度(O(2^n)):算法的执行时间与输入规模的指数成正比。

练习

// 请计算一下Func1基本操作执行了多少次?
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);
}

答案:O(N^2)

^是平方的意思,*是乘。


// 计算Func2的时间复杂度?
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);
}

答案:O(N)

忽略前面的2。


// 计算Func3的时间复杂度?
void Func3(int N, int M)
{int count = 0;for (int k = 0; k < M; ++ k){++count;}for (int k = 0; k < N ; ++ k){++count;}

答案:O(N+M)

未知数都可能影响结果,都需要写上去。

如果题目有给条件:N远大于M,则技术O(N)。N和M差不多大,则是O(M)或者O(N)。


// 计算Func4的时间复杂度?
void Func4(int N)
{int count = 0;for (int k = 0; k < 100; ++ k){++count;}printf("%d\n", count);
}

 答案:O(1)

k是常数项,有具体数值。就是O(1)。


// 计算strchr的时间复杂度?
const char * strchr ( const char * str, char character )
{while(*str != '\0'){if(*str == character)return str;++str;}return NULL;
}

答案: O(N)

因为最好情况是1,最坏是N,按最坏情况计算。


// 计算BubbleSort的时间复杂度?
void BubbleSort(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i-1] > a[i]){Swap(&a[i-1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}

答案: O(N^2)

冒泡排序:

第一次:N

第二次:N-1

第三次:N-2

第N次:1

实际上,这是一个等差数列,运用数学公式就是(N+1)*N/2。忽略+ /,就是O(N^2)。


// 计算BinarySearch的时间复杂度?
int BinarySearch(int* a, int n, int x)
{assert(a);int begin = 0;int end = n;while (begin < end){int mid = begin + ((end-begin)>>1);if (a[mid] < x)begin = mid+1;else if (a[mid] > x)end = mid;elsereturn mid;}return -1;
}

 答案:O(log2N),这里格式不支持,是log2的n次方。


// 计算阶乘递归Factorial的时间复杂度?
long long Factorial(size_t N)
{return N < 2 ? N : Factorial(N-1)*N;
}

答案:O(N)

函数调用了N次。


空间复杂度

概念

空间复杂度是指算法在执行过程中所需的额外空间的量度。它衡量的是算法所使用的内存空间的数量和大小,包括程序代码本身所占用的空间、输入数据所占用的空间以及算法执行过程中所使用的辅助空间。

空间复杂度的计算通常是根据算法所使用的额外空间的最大值来进行评估。它可以用大O符号(O)来表示,类似于时间复杂度。

常见的空间复杂度有以下几种:

  1. O(1) - 常数空间复杂度: 算法所使用的额外空间是固定的,与输入规模无关。常数空间复杂度的算法通常只使用固定数量的变量或常量大小的数据结构。

  2. O(n) - 线性空间复杂度: 算法所使用的额外空间与输入规模成线性关系。例如,使用一个数组来存储输入数据。

  3. O(n^2) - 平方空间复杂度: 算法所使用的额外空间与输入规模的平方成正比。例如,使用一个二维数组来存储输入数据。

  4. O(log n) - 对数空间复杂度: 算法所使用的额外空间与输入规模的对数成正比。例如,使用递归调用栈所占用的空间。

  5. O(nlog n) - 线性对数空间复杂度: 算法所使用的额外空间与输入规模的对数乘以线性关系。例如,使用归并排序等分治算法时所占用的空间。

     在进行空间复杂度分析时,通常会忽略常数因子和低阶项,只关注随着输入规模增长而增长的部分。

练习

// 计算BubbleSort的空间复杂度?
void BubbleSort(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i-1] > a[i]){Swap(&a[i-1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}

答案:O(1)

时间是累积的,空间是不累积的(用完就丢)。


// 计算Fibonacci的空间复杂度?
long long* Fibonacci(size_t n)
{if(n==0)return NULL;long long * fibArray = (long long *)malloc((n+1) * sizeof(long long));fibArray[0] = 0;fibArray[1] = 1;for (int i = 2; i <= n ; ++i){fibArray[i ] = fibArray[ i - 1] + fibArray [i - 2];}return fibArray ;
}

答案:O(N)

malloc了一个n+1大小的空间,就是N,如果是常数,就是O(1)。


// 计算阶乘递归Factorial的空间复杂度?
long long Factorial(size_t N)
{return N < 2 ? N : Factorial(N-1)*N;
}

答案:O(N),

最多的时候,开辟了N个栈帧。

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

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

相关文章

量化简介和模式

1.量化简介 量化主要是一种加速推理的技术&#xff0c;量化运算符仅支持前向传递。量化是指使用精度较低的数据进行计算和内存访问的技术&#xff0c;与浮点实现相比&#xff0c;通常是 int8。这可以在几个重要领 (1).域实现性能提升&#xff1a; (2).模型尺寸缩小 4 倍&#…

代码随想录算法训练营第57天|● 647. 回文子串 ● 516.最长回文子序列 ● 动态规划总结篇

647. 回文子串 中等 相关标签 相关企业 提示 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&#xff0c;即使…

【Python百宝箱】边缘计算Python库大揭秘:构建高效、智能的IoT系统

连接与计算&#xff1a;深度解析Python库在边缘计算中的角色 前言 随着边缘计算在物联网和分布式系统中的广泛应用&#xff0c;寻找适用于边缘设备的Python库变得愈发重要。本文将探索多个Python库&#xff0c;涵盖了边缘计算的各个方面&#xff0c;从设备管理、分布式计算到…

网络名称解读 -入门5

WAN: Wide Area Network(跨区域&#xff09;&#xff0c;LAN&#xff1a; Local Area NetworkWAN MAC&#xff0c; 用来连接上级网络&#xff0c; LAN MAC&#xff0c; 用于内部网路。 LAN & WAN 3.1&#xff0c;LAN表示子网&#xff0c;通过掩码来筛选子网内主机数量&…

【C++】类和对象详解(类的使用,this指针)

文章目录 前言面向过程和面向对象的初步认识类的引入类的定义类的访问限定符和封装性访问限定符封装性 类的作用域类的实例化类对象模型如何计算类对象的大小类对象的存储方式猜测结构体内存对齐规则 this指针this指针的引出this指针的特性 总结 前言 提示&#xff1a;这里可以…

计算机毕业设计选题分享-SSM律师事务所业务管理系统01664(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

SSM律师事务所业务管理系统 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;律师事务所业务管理系统当然也不能排除在外。律师事务所业务管理系统是以实际运用为开发背景…

静态网页设计——电影推荐网(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1NK411x7oK/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS&#xff08;…

【亚马逊云科技】使用Helm 3为Amazon EKS部署Prometheus+Grafana监控平台

文章目录 1. 创建Kubernetes命名空间2. 添加Prometheus社区helm chart3. 安装prometheus4. 检查Prometheus Pod运行状况5. 检查Prometheus Service部署情况6. 修改服务访问端口类型7. 访问Prometheus数据收集情况8. 访问Grafana9. 设置数据源10. 查看Kubernetes各类性能可视化参…

c/c++运算符优先级【一文搞懂】【大白讲解】

C运算符优先级教程 我们知道&#xff0c;在数学运算中&#xff0c;有 “先乘除后加减” 的运算规则&#xff0c;在我们程序语言中一样有运算符的优先级问题&#xff0c;来决定我们运算的顺序问题&#xff0c;这就是运算符的优先级。 即所谓运算符的优先级&#xff0c;指的是在…

【linux笔记】top、ps

【linux笔记】top命令 top&#xff08;Table of process&#xff09;是动态变化的。而ps是静态的。 PID — 进程id USER — 进程所有者 PR — 进程优先级 NI — nice值。负值表示高优先级&#xff0c;正值表示低优先级 VIRT — 进程使用的虚拟内存总量&#xff0c;单位kb。VI…

2023年全国职业院校技能大赛软件测试—测试计划模板参考文档

ERP(资源协同)管理平台测试计划 目录 ERP(资源协同)管理平台测试计划 1. 概述

DevOps|产研运协作工具链上的皇冠-项目管理工具

项目管理工具可以说是产研运工具链上最耀眼的明星&#xff0c;也是产研工作最重要的一环&#xff08;没有之一&#xff09;。为什么这样说&#xff1f;对于我们每个角色&#xff08;产品、研发、测试、运维、运营、客服等&#xff09;我们都可以有各自的专业工具来支撑&#xf…

C语言实例_string.h库函数功能及其用法详解

一、前言 在计算机编程中&#xff0c;字符串处理是一项常见而重要的任务。C语言的string.h头文件提供了一系列函数和工具&#xff0c;用于对字符串进行操作和处理。这些函数包括字符串复制、连接、比较、查找等功能&#xff0c;为开发人员提供了强大的字符串处理能力。本文将对…

Python实现大数据量对比

Python实现大数据量对比有以下几种方法&#xff1a; 并行计算&#xff1a;利用多线程或多进程并行处理数据&#xff0c;加快对比速度。Python中可以使用multiprocessing模块实现多进程&#xff0c;并发地对数据进行处理。 分布式计算&#xff1a;将数据分布到多台机器上进行计…

计算机中的数据运算

放上计算机中的数据的表示方法 计算机中的数据表示方法-CSDN博客 补码的运算&#xff1a; 连同符号位一起相加&#xff0c;符号位产生的进位自然丢掉&#xff0c;这里要特别注意机器数的位数&#xff0c;计算数的位数决定了可以存放的数据的大小&#xff0c;加减产生的数据的…

电商数据api接口商品详情API接口及代码展示案例

电商平台API接口中的商品详情API接口在电商平台中扮演着非常重要的角色。其主要作用及重要性包括以下几点&#xff1a; 实现商品信息的动态更新&#xff1a;通过商品详情API&#xff0c;电商平台上的商品信息可以实现实时的更新。这样能够保证用户看到的信息是准确的&#xff…

Spring boot封装rocket mq 教程

1、rocket mq版本 5.1.3 2、pom引入rocket mq依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client-java</artifactId><version>5.0.4</version></dependency> 3、发送MQ消息工具类 impor…

1002 写出这个数

读入一个正整数 n&#xff0c;计算其各位数字之和&#xff0c;用汉语拼音写出和的每一位数字。 输入格式&#xff1a; 每个测试输入包含 1 个测试用例&#xff0c;即给出自然数 n 的值。这里保证 n 小于 10100。 输出格式&#xff1a; 在一行内输出 n 的各位数字之和的每一…

ATTCK视角下的信息收集:主机发现

目录 1、利用协议主动探测主机存活 利用ICMP发现主机 利用ARP发现主机 利用NetBIOS协议发现主机 利用TCP/UDP发现主机 利用DNS协议发现主机 利用PRC协议发现主机程序 2、被动主机存活检测 利用Browser主机探测存活主机 利用ip段探测主机存活 利用net命令探测主机存活…

【软件测试】学习笔记-测试覆盖率

测试覆盖率通常被用来衡量测试的充分性和完整性&#xff0c;从广义的角度来讲&#xff0c;测试覆盖率主要分为两大类&#xff0c;一类是面向项目的需求覆盖率&#xff0c;另一类是更偏向技术的代码覆盖率。 需求覆盖率 需求覆盖率是指测试对需求的覆盖程度&#xff0c;通常的做…