首页 > 其他分享 >时间?空间?复杂度??

时间?空间?复杂度??

时间:2024-06-22 22:00:01浏览次数:8  
标签:count int 复杂度 ++ 算法 时间 空间

1.什么是时间复杂度和空间复杂度?

1.1算法效率

算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称为空间复杂度。
时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的水准,所以我们如今不需要再特别关注算法的空间复杂度。

1.2时间复杂度的概念

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

1.3空间复杂度的概念

空间复杂度是对一个算法运行过程中临时占用存储空间大小的量度。空间复杂度不是程序占用了多少比特位的空间,因为这个也没有太大的意义,所以空间复杂度算的是变量的个数。空间复杂度计算也采用大O渐进表示法

2.什么是大O 渐进表示法?

实际中我们计算时间复杂度时,我们其实并不一定要精确的执行次数,而只需要大概执行次数,那么这里我们使用大O渐进表示法
大O符号(Big O notation):是用来描述函数渐进行为的数学符号。
推导大O阶方法:
1.用常数1取代运行时间中所有加法常数。
2.在修改后的运行次数函数中,只保留最高阶项。
3.如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

3.如何计算常见算法的时间复杂度和空间复杂度?

3.1普通常见的时间复杂度计算

3.1.1Func1
void Func1 (int N)
{
	int count=0;
	for(int j=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 ",count);
}

在这里插入图片描述

3.1.2Func2
void Func2 (int N)
{
	int count=0;
	for(int k=0;k<2*N;++k)
	{
		++count;
	}
	int M=10;
	while(M--)
	{
		++count;
	}
	printf("%d ",count);
}

在这里插入图片描述

3.1.3Func3
void Func3 (int N,int M)
{
	int count=0;
	for(int k=0;k<N;++k)
	{
		++count;
	}
	for(int k=0;k<M;++k)
	{
		++count;
	}
	printf("%d ",count);
}

在这里插入图片描述

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

在这里插入图片描述

3.2存在时间复杂度最好、平均、最坏的情景

const char * strchr (const char * str,char character)
{
	while(*str!='\0')
	{
		if(*str==character)
		return str;
		str++;
	}
	return NULL;
}

在这里插入图片描述

3.3冒泡排序的时间复杂度计算

void Bubblesort(int *a ,int n)
{
	assert(a);
	int exchange=0;
	for(size_t end=n;end>0;--end)
	{
		for(size_t i=1;i<end; ++i)
		{
			if(a[i-1]>a[i])
			{
				int tmp=a[i-1];
				a[i-1]=a[i];
				a[i]=tmp;
				exchange=1;
			}
		}
		if (exchange==0)
		break;
	}	
}

在这里插入图片描述

3.4折半查找的时间复杂度计算

//前提数组中数据为升序
int BinarySearch(int *a,int n,int x)
{
	assert(a);
	int left=0;
	int right=n;
	while(left<right)
	{
		int mid=(left+right)/2;
		if(a[mid]<x)
		{
			left=mid;
		}
		if eles (a[mid]>x)
		{
			right=mid;
		}
		else(a[mid]==x)
		return mid;
	}
}

在这里插入图片描述

3.5计算阶乘递归的时间复杂度

long long Factorial(size_t N)
{
	return N<2?N:Factorial(N-1)*N;
}

在这里插入图片描述

4.常见的时间复杂度:

在这里插入图片描述

结论O(1)<O(log n)<O(n)<O(n log n)<O(n^2)

5.空间复杂度的计算

5.1 空间复杂度为O(1)

时间虽然是累计的,但是空间不累计,循环走了N次,但始终重复利用的是一个空间

void Bubblesort(int *a ,int n)
{
	assert(a);
	int exchange=0;
	for(size_t end=n;end>0;--end)
	{
		for(size_t i=1;i<end; ++i)
		{
			if(a[i-1]>a[i])
			{
				int tmp=a[i-1];
				a[i-1]=a[i];
				a[i]=tmp;
				exchange=1;
			}
		}
		if (exchange==0)
		break;
	}	
}

5.2空间复杂度为O(n)

5.2.1由动态内存开辟的
void factor(int *a)
{
	int * a=(int)malloc((n)*sizeof(int));
}
5.2.2函数递归类型

递归调用了N层,每次调用建立了一个栈帧,每个栈帧使用了常数个空间——》O(1)
调用时,建立栈帧
返回时,销毁
最后对未知的N 空间复杂度为O(N)

标签:count,int,复杂度,++,算法,时间,空间
From: https://blog.csdn.net/2302_81707171/article/details/139860080

相关文章

  • 芝麻清单助力提升学习&工作效率 专注时间完成有效的待办事项
    芝麻清单助力提升学习&工作效率专注时间完成有效的工作。今天我们给大家带来一个专注清单,一个更高效的学习和工作的方法!我们都知道,专注做一个事情,会有效的提升效率,让事情更高效的完成。如果是学习的话,专注去学习效果更加的明显。许多人都不容易做到专注一个事情,我们需要一个......
  • 《暗时间》第三章 打造你的核心竞争力 随笔摘要
    一怎样花两年时间去面试一个人(对我们来说应该不是相对应的读者哈哈哈哈)1学习能力简直算是行业最重要的能力了,没有之一2明白需求(大学生要考虑好毕业后的方向,做好迎合需求的准备)3这里最后作者推荐了一些关于it的书单二遇到问题为什么应该自己动手1你遇到的每个问题很大程......
  • 《暗时间》第四章 跟波利亚学解题 随笔摘要
    一启发式思维:(联想)过没有桥的河,联想到以前自己走过一颗倒在河上的树而将问题从如何过河转化为如何让树躺再河上启发式思考方法:1.时刻不忘未知量,时刻记住你到底像要求什么,问题是什么2.用特例启发思考3.反过来推导例子:    (1.100根火柴两个人轮流取,每人每次只能取1......
  • Docker文件迁移到TF卡或者U盘,最大限度减少空间占用
    简介:在docker的使用中随着下载镜像越来越多,构建镜像、运行容器越来越多,数据目录必然会逐渐增大;当所有docker镜像、容器对磁盘的使用达到上限时,就需要对数据目录进行迁移。前置工作在迁移前确认迁移的目标目录空间是否充足在迁移时需停止docker服务,务必在平台不使用时进行迁移......
  • three.js 第六节 - 纹理以及贴图【.hdr文件(hdr贴图)】- 色彩空间
    素材这是素材更多素材、案例、项目好几个G一共,加我q178373168,60大洋拿走源码源码//@ts-nocheck//引入three.jsimport*asTHREEfrom'three'//导入轨道控制器import{OrbitControls}from'three/examples/jsm/controls/OrbitControls'//导入lil.gui......
  • 【TKGQA】关于时间知识图谱问答的一篇综述阅读
    前言时间知识图谱问答(TKGQA)是KBQA中一个关注时间问题的重要子任务。时间问题包含时间约束、需要时间标记的答案,反映了现实世界事件的动态和演变性质。一、TKGQA1.1概述时间知识图谱(TKG):通常表示为G=(E,R,T,F),其中E、R、T和F分别代表实体(entities)、关系(relat......
  • kedaOJ#P2849时间涟漪
    题目kedaOJ#P2849时间涟漪思路栈代码#include<bits/stdc++.h>usingnamespacestd;intmain(){intN;cin>>N;stack<int>timeRipples;intmaxEnergy=INT_MIN;for(inti=0;i<N;++i){intinstruction;......
  • HC32L130读取SD3078时间
    一.SD3078电路图二.HC32L130IO模拟IIC 1.app_i2c_gpio.h/*****************************************************************************//**\fileapp_i2c_gpio.h****Headerfileforlcdfunctions******History:**-2024-06-21马天义微信:......
  • spring头部命名空间配置
    头部约束文件配置<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www......
  • 基于时间卷积门控循环单元融合注意力机制TCN-GRU-Attention实现负荷多变量时间序列预
    %导入数据load(‘data.mat’);%请替换为你的数据文件名%数据应该是一个矩阵,每一行代表一个时间步,每一列代表一个特征或变量%划分训练集和测试集trainRatio=0.8;%训练集比例trainSize=round(trainRatio*size(data,1));trainData=data(1:trainSize,......