C/C++数据结构之时间复杂度和空间复杂度详细解析以及力扣刷题

news2024/9/20 17:52:05

个人主页:点我进入主页

专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶

C语言刷题       数据结构初阶

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂。

目录

 1.前言

2.算法的效率

2.1时间复杂度 

2.1.1时间复杂度的定义

2.1.2时间复杂度的表示方法 

2.1.3程序的时间复杂度的例子 

2.2空间复杂度

3.练习 

3.1

3.2


 1.前言

        在前面我们学过了C语言的初阶和进阶的内容,其中有很多有意思的东西,接下俩我们开始上强度,进入我们的数据结构环节,今天主要讲解的是时间复杂度和空间复杂度,我们主要通过定义的解析,实际例子的解析来讲解,最后还会讲解一些力扣的题目。

2.算法的效率

        算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。
时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。(简单来说我们现在主要关注算法的时间复杂度,经常出现用空间换时间)。

2.1时间复杂度 

2.1.1时间复杂度的定义

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。
即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。

2.1.2时间复杂度的表示方法 

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。
推导大O阶方法:
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶
(简单来说就是我们用o(x)的形式进行表示,x是保留程序运行次数的最高阶项,且将高阶项的系数化成1,我们常出现的时间复杂度为o(1),o(n),o(logn),o(n^2)) ;

2.1.3程序的时间复杂度的例子 

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);
}

        在程序中我们运行了2N+10次,我们用大o表示法,需要去掉10和系数2,因此可以得到Func2函数的时间复杂度为O(N);

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;
}
printf("%d\n", count);
}

        在Func3函数中,我们运行了M+N次,我们用大O表示法表示,由于M和N是未知的,我们就可以直接写为O(M+N)

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

         在这个程序中,我们运行了100次,100是个常数,故我们可以表示为O(1);

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;
}
}

        我们可以看到第一次需要运行n-1次,第二次需要运行n-2次,第n次运行0次,我们可以看到这是一个等差数列,我们根据等差数列的求和公式可以得到一共运行(n-1)*n/2次,我们根据大O表示法可以得到它的最高次为n^2故时间复杂度为O(n^2);特别注意我们写时间复杂度时不是几次循环就是n的几次方,这需要我们得到程序运行了几次,然后根据大O表示法得到程序的时间复杂度。

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

 

        我们假设运行了k次,对于最坏的情况,也就是没有找到,我们需要不断二分,直到左等于右,我们每一次二分就会少一半的数据,我们就可以得到n/2^k=1,化简后可以得到log n=k,由于我们的时间复杂度中一般都是log以2为底,所以我们可以直接写为O(log n)

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

        我们可以看到,程序第一次运行时 需要F(n-1),依次这样,第n-1次时需要F(0),这时候程序的每个值就都有了,根据大O表示法我们可以得到程序的时间复杂度为O(n);

long long Fib(size_t N)
{
if(N < 3)
return 1;
return Fib(N-1) + Fib(N-2);
}

 

        在这里我们可以近似看成等比数列,它每一次都需要2倍,故我们可以得到程序的时间复杂度为O(2^n)

2.2空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。(如果开辟常数个变量就是o(1));

 int** fun(int n) {
    int ** s = (int **)malloc(n * sizeof(int *));
    while(n--)
      s[n] = (int *)malloc(n * sizeof(int));
    return s;
  }

         我们先看**s,这里对s开辟了n个空间,再看循环里,对每个s开辟了n个空间,相当于建立了一个二维数组,故空间复杂度为O(n^2);

3.练习 

3.1

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

int removeElement(int* nums, int numsSize, int val){
    int i,j=0;
    for(i=0;i<numsSize;i++)
    {
        if(nums[i]!=val)
        {
            nums[j++]=nums[i];
        }
    }
    return j;
}

        我们每次对数据进行判断,如果数组的值和val不相等就进行赋值,相等则只有i++,这样j就是数组中元素的个数。

3.2

 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

int removeDuplicates(int* nums, int numsSize){
   
    int *p=nums,*q=nums,i,count=1;
    if(numsSize>=2)
    {
        q++;
        for(i=1;i<numsSize;i++,q++)
        {
            if(*p!=*q)
            {
                p++;
                *p=*q;
                count++;
            }
        }
    }
    return count;
}

         在这里我们用到了一个二级指针,如果数组的长度大于等于2我们进行判断,如果两个指针的内容相等只有q++,如果不相等让p++然后让q指向的数据覆盖到p指向的内容,count++进行循环,最后得到的count就是数组的元素个数。

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

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

相关文章

中国各城市土地利用类型(城市功能)矢量数据集(shp)

中国各城市土地利用类型(城市功能)数据集 时间:2018年 全国范围的城市用地类型数据(居住/商业/交通用地等共计11类) 分类:居住用地、商业用地、工业用地、医疗设施用地、体育文化设施用地、交通场站用地、绿地等用地类型 含城市编码、一级分类5个、二级分类11个 数据按…

SQL SERVER 表分区

1. 概要说明 SQL SERVER的表分区功能是为了将一个大表&#xff08;表中含有非常多条数据&#xff09;的数据根据某条件&#xff08;仅限该表的主键&#xff09;拆分成多个文件存放&#xff0c;以提高查询数据时的效率。创建表分区的主要步骤是 1、确定需要以哪一个字段作为分…

语雀P0级时间爆发,留给运维的时间不多了?

事件背景 打工人的焦虑&#xff0c;已经延伸到在线文档了。近日&#xff0c;语雀P0级故障想必大家都有所体会&#xff0c;宕机近8小时&#xff0c;笔记、离线同步完全不可用。作为用户尤其担心我的文档资料是否会因此消失。 这泼天的8小时&#xff0c;放眼互联网界也是相当炸裂…

重生奇迹MU的三大知名宝石

一、祝福宝石 祝福宝石也是重生奇迹中的一种知名宝石&#xff0c;它的体积要比玛雅宝石大一些&#xff0c;颜色是一种粉色&#xff0c;呈菱形的一个多面体&#xff0c;掉在地上或是鼠标移上去&#xff0c;你就能看到“祝福宝石”这几个字样。 如果你打到祝福宝石的话&#xf…

记录微调chatglm3

用于记录chatglm3的过程&#xff0c;防止忘记 需要注意的 可以使用xtuner -h查看有哪些功能可以使用。 [2023-10-31 11:40:18,643] [INFO] [real_accelerator.py:158:get_accelerator] Setting ds_accelerator to cuda (auto detect) 10/31 11:40:22 - mmengine - INFO - Ar…

在Windows上安装Elasticsearch-8.x.x

前言 Elasticsearch 是一种流行的开源搜索和分析引擎&#xff0c;它提供了强大的全文搜索和实时数据分析功能&#xff0c;被广泛应用于各种领域&#xff0c;包括大数据分析、日志处理、企业搜索等。 一、下载 Elasticsearch 官方网站&#xff08;https://www.elastic.co/dow…

R语言在生态环境领域中的实践技术应用

R语言作为新兴的统计软件&#xff0c;以开源、自由、免费等特点风靡全球。生态环境领域研究内容广泛&#xff0c;数据常多样而复杂。利用R语言进行多元统计分析&#xff0c;从复杂的现象中发现规律、探索机制正是R的优势。为此&#xff0c;以鱼类、昆虫、水文、地形等多样化的生…

Django开发实例总结(入门级、4.2.6、详细)

目录 概述 Django的核心组件包括 Django的项目结构 创建工程&#xff08;4.2.6&#xff09; 实例一&#xff1a;Hello world 实例二&#xff1a;访问一个自定义主页 实例三&#xff1a;通过登录跳转到主页 实例四&#xff1a;主页添加静态文件&#xff0c;包含js、css、…

学习Python,为什么可以轻松应对工作大小事?

Python&#xff0c;大名鼎鼎&#xff0c;它在工作中到底能发挥什么样的作用&#xff1f;在现代职场&#xff0c;Python如同一把瑰丽的多功能钥匙&#xff0c;能打开各行各业的大门。无论你是行政助手、财务分析师、电商经营者&#xff0c;还是数据研究员&#xff0c;Python都能…

pychram中cmd已导入docx库仍报错ModuleNotFoundError: No module named ‘docx‘

已经在cmd里pip install python-docx了&#xff0c;但是执行py文件时依然报错&#xff0c;解决方式是在File-Setting-Python Interpreter中点击号&#xff0c;搜索python-docx点击install package等待安装成功再执行文件就不会报错了。

SkyWalking官方文档-1-概述

概述 SkyWalking是一个开源的可观测平台&#xff0c;用于收集&#xff0c;分析&#xff0c;聚合&#xff0c;以及可视化处理来自服务和云原生框架的数据。SkyWalking提供了一种简单的方法来维护分布式系统的清晰视图&#xff0c;即使是跨云。 它是一种现代APM&#xff0c;专门…

手机app爬虫配置(模拟机)

近期在做某个项目,涉及到需要对手机app的进行数据爬取。 下面将讲述具体配置步骤 1、安装手机模拟器 在百度上搜索手机模拟器就可以啦,这里以夜神模拟器夜神安卓模拟器-安卓模拟器电脑版下载_安卓手游模拟器_手机模拟器_官网为例子。 下载后,直接点击安装即可。 2、安装…

多模态对比语言图像预训练CLIP:打破语言与视觉的界限

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

美国人工智能政策公布

美国总统拜登 30 号上午发布了一项关于人工智能&#xff08;AI&#xff09;的行政命令&#xff08;EO&#xff09;。该行政命令最初以白宫情况说明书的形式向公众提供&#xff0c;“为人工智能安全和安保制定了新标准&#xff0c;保护美国人的隐私&#xff0c;促进公平和公民权…

【C++指针】类的指针

/*** file * author jUicE_g2R(qq:3406291309) * brief 类的指针* copyright 2023.10* COPYRIGHT 原创学习笔记&#xff1a;转载需获得博主本人同意&#xff0c;且需标明转载源* language C*/1 类 类 类 需要在 . h 文件 .h文件 .h文件 先声明 //…

MyBatis批量插入数据优化,新增参数大幅提升操作效率

项目中进行接口压测&#xff0c;发现批量插入的速度有点超出预期&#xff0c;感觉很奇怪&#xff0c;经过定位后发现mybatise-plus批量保存的处理十分缓慢&#xff0c;使用的是saveBatch方法&#xff0c;这点有点想不通。于是就进行了相关内容分析。 根据mybatise-plus中saveB…

ecplise中导入或更新项目之后出现的jsp文件一直显示红叉

解决办法&#xff1a;右键---build path或者properties中找java build path 先检查项目本身的jre版本是不是不与你本身的加热版本相同&#xff0c;如果不相同&#xff0c;则选中这个jre Systemlibrary -----右边有一个remove删除点。。。 &#xff08;2&#xff09;重新添加一…

(自适应手机端)厨师招聘信息发布类网站模板

(自适应手机端)厨师招聘信息发布类网站模板 PbootCMS内核开发的网站模板&#xff0c;该模板适用于信息发布网站等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b; 自适应手机端&#xff0c;同一个后台&#xff0c;数据即时同…

chatgpt中文翻译英文

chatgpt中文翻译英文 chatgpt很适合用于将翻译英文&#xff0c;在英文论文写作上&#xff0c;日常翻译任务都有很大帮助。 使用方法 给出下面这段话&#xff1a; 下面我让你来充当翻译家&#xff0c;你的目标是把中文翻译成英文&#xff0c;请翻译时不要带翻译腔&#xff0c…

灯串上亚马逊加拿大合规标准CSA认证如何办理?

灯串 灯串和配件都是插头连接的便携式、临时性商品&#xff0c;最大额定输入电压为 120 伏。 本政策适用于季节性照明、装饰性灯具以及灯串。 亚马逊灯串政策 根据亚马逊的要求&#xff0c;所有季节性和装饰性灯串均应经过检测&#xff0c;并且遵守下列法规、标准和要求&…