【数据结构】复杂度讲解

news2024/11/28 6:42:36

目录

时间复杂度与空间复杂度::

                                            1.算法效率

                                            2.时间复杂度

                                            3.空间复杂度

                                            4.常见时间复杂度以及复杂度OJ练习


时间复杂度与空间复杂度::

什么是数据结构?

数据结构中是计算机存储,组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合.

什么是算法?

算法是定义良好的计算过程,它取一个或一组的值为输入,并产生一个或一组值作为输出.简单来说
算法就是一系列的计算步骤,用来将输入数据转化成输出结果.

例如:数据结构是在内存中管理数据——增删查改
           数据库是在磁盘中管理数据——增删查改

           B树用到二分查找算法  去重要用到搜索树

1.算法效率

  算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源,因此衡量一个算法的好坏
一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度.
  时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间
在计算机发展的早期,计算机的存储容量很小,所以对空间复杂度很是在乎,但是经过计算机行业的
迅速发展,计算机的存储容量已经达到了很高的程度,所以我们如今已经不需要再特别关注一个算法的空间复杂度.
  摩尔定律:集成电路上可以容纳的晶体管数目在大约每经过18个月便会增加一倍.

2.时间复杂度

时间复杂度的概念:

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

void Func1(int N)
{
	int count = 0;
	for (int i = 0; i < N; ++i)
	{
		for (int j = 0; j < N; ++i)
		{
			++count;
		}
	}
	for (int k = 0; k < 2 * N; ++k)
	{
		++count;
	}
	int M = 10;
	while (M--)
	{
		++count;
	}
	printf("%d\n", count);
}
时间复杂度为:O(N^2)
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)
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);
}
时间复杂度为:O(M+N)
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)
void Fun4(int N)
{
	int count = 0;
	for (int k = 0; k < 100; ++k)
	{
		++count;
	}
	printf("%d\n", count);
}
时间复杂度为:O(1)

大O的渐进表示法:
大O符号是用于描述函数渐进行为的数学符号.
推导大O渐进表示法:
1.用常数1取代运行时间中的所有加法常数.
2.在修改后的运行次数函数中,只保留最高阶项.
3.如果最高阶系数存在且不是1,则去掉与这个项目相乘的常数,得到的结果就是大O阶.

算法的时间复杂度存在最好,最坏和平均情况:
最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)
例如:在一个长度为N的数组中搜索一个数据x
最好情况:1次找到
最坏情况:N次找到
平均情况:N/2次找到
在实际情况中关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)

int BinarySearch(int* a, int n, int x)
{
	assert(a);
	int begin = 0;
	int end = n - 1;
	//[begin,end] begin和end是左闭右闭区间,因此有=号
	while (begin <= end)
	{
		int mid = begin + ((end - begin) >> 1);
		if (a[mid] < x)
			begin = mid + 1;
		else if (a[mid] > x)
			end = mid - 1;
		else
			return mid;
	}
	return -1; 
}
二分查找的最好情况是O(1)
二分查找的最坏情况是找不到 时间复杂度为O(logN)
每查找一次 查找区间个数减少一半(除2)
N/2/2/2.../2 = 1
longlong Fac(size_t N)
{
	if (1 == N)
		return 1;
	return Fac(N - 1) * N;
}
时间复杂度为O(N)
longlong Fib(size_t N)
{
	if (N < 3)
		return 1;
	return Fib(N - 1) + Fib(N - 2);
}
时间复杂度为O(2^N)
longlong Fib(size_t N)
{
	if (N < 3)
		return 1;
	longlong f1 = 1, f2 = 1, f3;
	for (size_t i = 3; i <= N; ++i)
	{
		f3 = f2 + f1;
		f1 = f2;
		f2 = f3;
	}
	return f3;
}
时间复杂度为O(N)

3.空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中额外占用存储空间大小的量度.
空间复杂度不是程序占用了多少字节的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数.
空间复杂度计算规则基本跟时间复杂度类似,也使用大O的渐进表示法.
注意:函数运行时所需要的栈空间(存储参数,局部变量,一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时侯显示申请的额外空间来确定.
1G大约10亿字节  1G = 1024*1024*1024    
1M大约100万字节  1M = 1024*1024

计算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)
计算Fac的空间复杂度
longlong Fac(size_t N)
{
	if (N == 0)
		return 1;
	return Fac(N - 1) * N;
}
空间复杂度为O(N)
每个函数栈帧是常数个 有N+1个Fac栈帧
计算Fib的空间复杂度
longlong Fib(size_t N)
{
	if (N < 3)
		return 1;
	return Fib(N - 1) + Fib(N - 2);
}
空间复杂度为O(N)

4.常见时间复杂度以及复杂度OJ练习

一般算法常见的复杂度如下:

        5201314             O(1)           常数阶
          3n+4             O(n)           线性阶
       3n^2+4n+5             O(n^2)           平方阶
       3log(2)n+4             O(logn)            对数阶
 2n+3nlog(2)n+14             O(n*logn)           nlogn阶
 n^3+2n^2+4n+6             O(n^3)           立方阶
        2^n             O(2^n)           指数阶

复杂度的OJ练习:

消失的数字OJ链接:https://leetcode-cn.com/problems/missing-number-lcci/

int missingNumber(int* nums, int numSize)
{
	int x = 0;
	for (int i = 0; i < numSize; ++i)
	{
		x ^= nums[i];
	}
	for (int j = 0; i < numSize + 1; ++j)
	{
		x ^= j;
	}
	return x;
}
旋转数组 OJ 链接: https://leetcode-cn.com/problems/rotate-array /
void reverse(int* a, int begin, int end)
{
	while (begin < end)
	{
		int tmp = a[begin];
		a[begin] = a[end];
		a[end] = tmp;
		++begin;
		--end;
	}
}
void rotate(int* num, int numSize, int k)
{
	if (k > numSize)
		k %= numSize;
	reverse(nums, 0, numsSize - k - 1);
	reverse(nums, numSize - k, numsSize - 1);
	reverse(nums, 0, numsSize - 1);
}

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

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

相关文章

面向对象的设计模式

"万丈高楼平地起&#xff0c;7种模式打地基"&#xff0c;模式是一种规范&#xff0c;我们应该站在巨人的肩膀上越看越远&#xff0c;接下来&#xff0c;让我们去仔细了解了解面向对象的7种设计模式7种设计模式设计原则的核心思想&#xff1a;找出应用中可能需要变化之…

24考研|高等数学的基础概念定理(二)——第二章|导数与微分

文章目录一、基础概念定理部分1.1 导数的四则运算法则1.2 反函数的求导法则1.3 复合函数的求导法则1.4 费马引理1.5 罗尔定理1.6 拉格朗日中值定理1.7 导数为零的结论1.8 柯西中值定理1.9 洛必达法则1.10 泰勒中值定理&#xff08;定理1&#xff0c;定理2&#xff09;1.11 导数…

CRM系统能给企业带来什么? CRM系统推荐

什么是CRM系统&#xff1f; CRM系统&#xff08;又称客户关系管理系统&#xff09;是一个以客户为核心的管理软件&#xff0c;能有效改善企业与现有客户的关系&#xff0c;且帮助企业寻找新的潜在客户&#xff0c;并赢回以前老客户。 CRM系统能给企业带来什么&#xff1f; C…

计算机视觉框架OpenMMLab开源学习(五):目标检测实战

目标检测实战 前言&#xff1a;本篇主要偏向目标检测实战部分&#xff0c;使用MMDetection工具进行代码应用&#xff0c;最后对水果进行检测实战演示&#xff0c;本次环境和代码配置部分省略&#xff0c;具体内容建议参考前一篇文章&#xff1a;计算机视觉框架OpenMMLab开源学…

基于STM32设计的避障寻迹小车

一、前言 1.1 项目背景 根据美国玩具协会在一项研究中&#xff0c;过去几年全球玩具销售增长与GDP的世界平均水平大致相同。但全球玩具市场的内部结构已经占据了巨大的位置变化&#xff1a;传统玩具的市场份额正在下降&#xff0c;高科技电子玩具正在蓬勃发展。全球玩具市场的…

迁移至其他美国主机商时需要考虑的因素

网站的可访问性是关系业务的关键因素之一。一个稳定、快速且优化良好的主机上的网站更有可能享受不间断的流量&#xff0c;并在谷歌的SERP中获得更好的排名。因此&#xff0c;在构建企业网站时&#xff0c;选择合适的主机商相当重要。不过就以美国主机为例&#xff0c;由于每个…

three.js学习笔记(一):THREE.Materail五种基础材质的使用

MeshBasicMaterial&#xff08;网格基础材质&#xff09;&#xff1a;基础材质&#xff0c;用于给几何体赋予一种简单的颜色&#xff0c;或者显示几何体的线框。MeshDepthMaterial&#xff08;网格深度材质&#xff09;&#xff1a; 这个材质使用从摄像机到网格的距离来决定如何…

企业舆情监测多少钱,TOOM舆情监测专业服务平台

企业舆情监测的费用因公司不同而异&#xff0c;具体需要多少钱取决于您的需求和舆情监测公司的收费标准。一些因素&#xff0c;如舆情监测范围、数据收集方式、舆情分析报告等细节&#xff0c;都可能影响最终的费用。最好联系舆情监测公司询问具体收费标准。企业舆情监测多少钱…

Linux_用户和权限

一、认识root用户 --超级管理员 root用户拥有最大的系统操作权限&#xff0c;而普通用户在许多地方都是受限的 普通用户的权限&#xff0c;一般在其home目录内是不受限的 一旦出了home目录&#xff0c;大多数地方普通用户仅有只读和执行权限&#xff0c;无修改权限 1、su和…

linux配置密码过期的安全策略(/etc/login.defs的解读)

长期不更换密码很容易导致密码被破解&#xff0c;而linux的密码过期安全策略主要在/etc/login.defs中配置。一、/etc/login.defs文件的参数解读1、/etc/login.defs文件的内容示例[rootlocalhost ~]# cat /etc/login.defs # # Please note that the parameters in this configur…

10.jQuery中请求预处理 $.ajaxPrefilter()

在使用jQuery发起请求的时候($.get(),$.post().$ajax()都可以)会默认在请求前调用$.ajaxPrefilter()这个函数&#xff0c;我们可以利用这个来做一些事情 目录 1 定义API根路径 2 添加请求头 3 添加请求结束的回调函数 1 定义API根路径 这样后面每次请求就不用再写根路…

什么样的帮助文档才能帮助用户?

尼尔森十大交互原则的最后一个原则——“人性化帮助原则”提出&#xff0c;我们应该给系统提供一份帮助文档&#xff0c;让用户能够尽快了解系统&#xff0c;熟悉操作。 互联网时代&#xff0c;很多软件都把用户习惯培养起来了&#xff0c;对于大部分软件都有一种无师自通的感…

MySQL安装配置(Windows和 Linux )

MySQL安装配置&#xff08;Windows和 Linux &#xff09; 文章目录MySQL安装配置&#xff08;Windows和 Linux &#xff09;一、MySQL 下载1. 1 点击 **DOWNLOADS**1.2 点击 **MySQL Community (GPL) Downloads **1.3 点击 **MySQL Community Server**1.4 此时跳转到最新版本的…

2023年Q1业绩增长背后,迪士尼亟待扭转流媒体亏损困局

重新执掌迪士尼后&#xff0c;鲍勃伊格尔交出了一份表现尚可的“答卷”。 图源:迪士尼 美东时间2023年2月8日&#xff0c;迪士尼披露了2023财年Q1财报&#xff0c;营收为235.1亿美元&#xff0c;同比增长8%&#xff1b;持续经营净利润13亿美元&#xff0c;同比增长11%。受此利…

红米9a手动root方法

简介 已知红米6A/6/9/9A/9C/10A机器都可以快速解锁BL&#xff0c;无任何变砖风险 并且秒解锁BL后和官方解锁一样&#xff0c;无任何其他不良影响。推荐大家使用官网解锁&#xff0c;需要等待7天。 ​ BootLoader BootLoader是在操作系统内核运行之前运行的一段小程序。其实…

【虚拟仿真】Unity3D实现从浏览器拉起本地exe程序并传参数

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 最近有项目需求&#xff0c;从浏览器调起来本地的exe程序&…

常见HTTP请求错误码大全

响应码由三位十进制数字组成&#xff0c;它们出现在由HTTP服务器发送的响应的第一行。 响应码分五种类型&#xff0c;由它们的第一位数字表示&#xff1a; 1xx&#xff1a;信息&#xff0c;请求收到&#xff0c;继续处理 2xx&#xff1a;成功&#xff0c;行为被成功地接受、…

【Nacos】Nacos配置中心服务端源码分析

上文说了Nacos配置中心客户端的源码流程&#xff0c;这篇介绍下Nacos配置中心服务端的源码。 服务端的启动 先来看服务启动时干了啥&#xff1f; init()方法上面有PostConstruct&#xff0c;该方法会在ExternalDumpService实例化后执行。 com.alibaba.nacos.config.server.s…

第三方电容笔怎么样?开学适合买的电容笔

随着科学技术的进步&#xff0c;很多新型的电子产品和数码设备都出现了。比如手机&#xff0c;IPAD&#xff0c;蓝牙耳机&#xff0c;电容笔等等。实际上&#xff0c;如果你想要更好的使用ipad&#xff0c;那么你就需要一支电容笔。比如ipad&#xff0c;我们用ipad来做笔记&…

面向战场的cesium基础到进阶的案例展示(我相信VIP总是有原因的)

cesium 前置说明(友情提示,关注重点代码,其他影响复现的都可以删除或者替换数值解决) 这里面用到了cesium的模型加载、图片加载、着色器、实时改变模型状态、模型删除等知识点,这需要你自己去观摩下述会包含所有相关代码,他们的联系其实在代码中能看到(比如飞机操作类会…