【数据结构】:时间和空间复杂度

目录

如何衡量一个代码的好坏

时间复杂度

概念

计算方法

实例计算

【实例1】

【实例2】

【实例3】

【实例4】:冒泡排序的时间复杂度

【实例5】:二分查找的时间复杂度

【实例6】:阶乘递归的时间复杂度

【实例7】:斐波那契递归的时间复杂度

空间复杂度

概念

实例计算

【实例1】:冒泡排序的空间复杂度

【实例2】:斐波那契的空间复杂度


如何衡量一个代码的好坏

  • 算法效率分析分为两种
  1. 时间效率,称为时间复杂度,主要是用来衡量算法的运行速度
  2. 空间效率,称为空间复杂度,主要是用来衡量实现一个算法需要的额外空间

时间复杂度

概念

定义

  • 算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间
  • 一个算法所花费的时间与其语句中的执行次数成正比,算法中的基本操作的执行次数,为算法的时间复杂度

计算方法

void func1(int N){
	int count = 0;
	for (int i = 0; i < N ; i++) {    
		for (int j = 0; j < N ; j++) {       
			count++;       //————>N*N
		}   
	}
	for (int k = 0; k < 2 * N ; k++) {
		count++;           //————>N*2
	}    
	int M = 10;    
	while ((M--) > 0) {        
		count++;           //————>10
	}    
	System.out.println(count); 
}

Func1执行的基本操作次数为:

$F(N)=N^2+2*N+1$

  • N = 10        F(N) = 130
  • N = 100      F(N) = 10210
  • N = 1000    F(N) = 1002010

推导大O阶方法大O符号,用于描述函数渐进行为的数学符号

  • 用常数 1 取代运行时间中的所有加法常数
  • 在修改后的运行次数函数中,只保留最高项
  • 如果最高阶存在且不为 1,则去除与这个项相乘的常数
  • 使用大O阶渐进表示法后,func的时间复杂度为:$N^2$

实例计算

【实例1】

//计算func2的时间复杂度
void func2(int N) {    
	int count = 0;    
	for (int k = 0; k < 2 * N ; k++) {        
		count++;         //————>N*2
	}    
	int M = 10;    
	while ((M--) > 0) {        
		count++;         //————>10
	}    
	System.out.println(count); 
}
  • func2的时间复杂度为:$O(N*2+10)$ 即 $O(N)$

【实例2】

//计算func3的时间复杂度
void func3(int N, int M) {    
	int count = 0;    
	for (int k = 0; k < M; k++) {        
		count++;     //————>M
	}    
	for (int k = 0; k < N ; k++) {        
		count++;     //————>N
	}    
	System.out.println(count); 
}
  • func3的时间复杂度为:$O(M+N)$

【实例3】

// 计算func4的时间复杂度
void func4(int N) {   
	int count = 0;    
	for (int k = 0; k < 100; k++) {        
		count++;       //————>100
	}    
	System.out.println(count); 
}
  • func4的时间复杂度为:$O(1)$

【实例4】:冒泡排序的时间复杂度

// 计算bubbleSort的时间复杂度
void bubbleSort(int[] array) {    
	for (int end = array.length; end > 0; end--) {  //————>(N-1)项
		boolean sorted = true;        
		for (int i = 1; i < end; i++) {      //———>(N-1)+(N-2)+(N-3)+...+1
			if (array[i - 1] > array[i]) {   //等差数列求和,首:N-1  末:1  项数:N-1
				Swap(array, i - 1, i);                
				sorted = false;           
			}       
		}        
		if (sorted == true) {            
			break;       
		}   
	} 
}
  • 第11,12行对代码进行了优化,时间复杂度为:$O(N)$
  • 若无优化,最好和最坏的结果都是:$O(\frac{N^2-N}{2})$ 即 $O(N^2)$

【实例5】:二分查找的时间复杂度

// 计算binarySearch的时间复杂度
int binarySearch(int[] array, int value) {    
	int begin = 0;    
	int end = array.length - 1;    
	while (begin <= end) {                   
		int mid = begin + ((end-begin) / 2);        
		if (array[mid] < value)            
			begin = mid + 1;        
		else if (array[mid] > value)            
			end = mid - 1;        
		else;
			return mid;   
	}    
	return -1; 
}
  • 分一次,还剩 $\frac{n}{2}$ 个数;分两次,还剩 $\frac{n}{2^2}$ 个数......分 $x$ 次,还剩 $\frac{n}{2^x}$ 个数。
  • 在结果最坏时,当只有一个剩余的数的时候,就找到了,所以此时  $\frac{n}{2^x} = 1$  ,即 $n= 2^x$
  • binarySearch的时间复杂度为:$O(log_2n)$

【实例6】:阶乘递归的时间复杂度

// 计算阶乘递归factorial的时间复杂度
long factorial(int N) { 
	return N < 2 ? N : factorial(N-1) * N; 
}
  • 递归的复杂度 = 递归的次数 * 每次递归后代码的执行次数
  • 递归的次数为N;每次递归回来执行三目运算,它的时间复杂度为 $O(1)$
  • 阶乘递归的时间复杂度为:$O(N*1) = O(N)$

【实例7】:斐波那契递归的时间复杂度

// 计算斐波那契递归fibonacci的时间复杂度
int fibonacci(int N) { 
	return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2); 
}

  • 第 n 层节点个数为:$2^{n-1}$ ,则总递归次数为:
  • $2^0+2^1+2^2+...+2^{n-1}=\frac{1*(1-2^{n-1})}{1-2}=2^n-1$
  • 每次递归后代码执行三目运算,时间复杂度为:$O(1)$
  • 斐波那契递归的时间复杂度为:$O(2^n*1)=O(2^n)$

空间复杂度

概念

  • 空间复杂度是对一个算法在运行过程中,临时占用存储空间大小的量度。
  • 计算规则基本上与时间复杂度一样,也使用大O渐进法表示

实例计算

【实例1】:冒泡排序的空间复杂度

// 计算bubbleSort的空间复杂度
void bubbleSort(int[] array) {    
	for (int end = array.length; end > 0; end--) {        
		boolean sorted = true;        
		for (int i = 1; i < end; i++) {            
			if (array[i - 1] > array[i]) {                
				Swap(array, i - 1, i);                
				sorted = false;           
			}       
		}        
		if (sorted == true) {            
			break;       
		}
	}
}
  • 空间复杂度为:$O(1)$

【实例2】:斐波那契的空间复杂度

// 计算fibonacci的空间复杂度
int[] fibonacci(int n) {    
	long[] fibArray = new long[n + 1];    
	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)$

【实例3】:阶乘递归的空间复杂度

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

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

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

相关文章

如何通过SSH协议使用WinSCP实现Windows与Linux之间的远程公网文件传输

目录 ⛳️推荐 前言 1. Windows传输文件至Linux 2. WinSCP使用公网TCP地址连接 3. WinSCP使用固定公网TCP地址访问服务器 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 前…

算法力扣刷题记录 四十八【513.找树左下角的值】

前言 二叉树篇继续。 记录 四十八【513.找树左下角的值】 一、题目阅读 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,nul…

云计算数据中心(二)

目录 三、绿色节能技术&#xff08;一&#xff09;配电系统节能技术&#xff08;二&#xff09;空调系统节能技术&#xff08;三&#xff09;集装箱数据中心节能技术&#xff08;四&#xff09;数据中心节能策略和算法研究&#xff08;五&#xff09;新能源的应用&#xff08;六…

下一代AI芯片的演进趋势

下一代AI芯片&#xff0c;拼什么&#xff1f; AI&#xff0c;这个无尽的财富&#xff0c;无人愿意错过。尽管摩尔定律的极限临近&#xff0c;芯片性能提升愈发艰难。然而&#xff0c;各大厂商仍以瞩目速度推出新一代产品。在最近的台北国际电脑展上&#xff0c;英伟达、AMD和英…

每日一练@

目录 题目1.关于AOP错误的是&#xff1f;2.关于以下代码的说明&#xff0c;正确的是&#xff08; &#xff09;3.以下类型为Final类型的为&#xff08;&#xff09;4.以下说法哪个是正确的&#xff08;&#xff09; 题目 选自牛客网 1.关于AOP错误的是&#xff1f; A.AOP将散…

位运算问题

1. 只出现一次的数字 III 题目描述&#xff1a; 算法原理&#xff1a; 因为两个相同的数经过异或就等于0&#xff0c;所以首先将数组中的每个数字异或到一起&#xff0c;这样就得到了两个出现一次的元素的异或值。假设得到的异或值为n&#xff0c;那么我们去求异或值的最低位…

python自动化之validator验证数据【代码示例】

思路&#xff1a; 首先定义验证规则schema&#xff0c;包含name&#xff0c;age和email三个字段&#xff1b; 然后创建验证器对象validator&#xff0c;并将schema作为参数传递给它&#xff1b; 最后定义要验证的数据data&#xff0c;使用validator的validate方法进行验证&a…

【Stable Diffusion】(基础篇三)—— 图生图基础

图生图基础 本系列笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 本文主要讲解如何使用S…

数据结构(5.0)——树的定义和基本术语

树的基本概念 树是n(n>0)个结点的有限集合&#xff0c;n0时&#xff0c;称为空树&#xff0c;这是一种特殊情况。在任意一颗非空树中应该满足: 有且仅有一个特定的称为根的结点。 当n>1时&#xff0c;其余结点可分为m(m>0)个互不相交的有限集合T1、T2、.......&…

C++第七弹 -- C/C++内存管理

目录 前言一. C/C内存分布二. C语言中动态内存管理方式三. C中动态内存管理四. operator new与operator delete函数五. new和delete的实现原理1.内置类型2. 自定义类型 六. 定位new表达式(placement-new)七. 常见面试题总结 前言 在C/C编程中&#xff0c;内存管理是至关重要的…

领夹麦克风品牌排行榜前十名,录短视频用什么麦克风好?

随着自媒体行业的迅猛发展&#xff0c;对高品质音频设备的需求日益增长&#xff0c;尤其是无线领夹麦克风因其便携性和实用性受到了广泛欢迎。这种麦克风不仅适用于新闻采访和节目录制&#xff0c;也成为了网络直播和Vlog创作者的得力助手。它们能够提供清晰的录音效果&#xf…

最新版康泰克完整版- Kontakt v7.10.5 for Win和Mac,支持m芯片和intel,有入库工具

一。世界最受欢迎的采样器的新篇章 Native Instruments Kontakt是采样器领域的标准&#xff0c;您将获得高质量的滤波器&#xff0c;在这里您将找到经典的模拟电路和最现代的滤波器。每一个都可以根据您的口味进行定制&#xff0c;并且由于它&#xff0c;您可以获得前所未有的声…

AIGC笔记--基于Stable Diffusion实现图片的inpainting

1--完整代码 SD_Inpainting 2--简单代码 import PIL import torch import numpy as np from PIL import Image from tqdm import tqdm import torchvision from diffusers import AutoencoderKL, UNet2DConditionModel, DDIMScheduler from transformers import CLIPTextMod…

源码安装zabbix5.0.36完整版

源码安装zabbix5.0.36完整版 环境&#xff1a;CentOS Linux release 7.9&#xff0c;cpu:16&#xff0c;mem:32G软件包如下&#xff1a; zabbix-5.0.36.tar.gz mysql-8.0.28-linux-glibc2.17-x86_64-minimal.tar.xz nginx-1.6.2.tar.gz 1. 配置前准备 systemctl stop firewa…

K8s集群初始化遇到的问题

kubectl describe pod coredns-545d6fc579-s9g5s -n kube-system 找到原因1&#xff1a;CoreDNS Pod 处于 Pending 状态的原因是集群中的节点都带有 node.kubernetes.io/not-ready 污点 journalctl -u kubelet -f 14:57:59.178592 3553 remote_image.go:114] "PullIma…

集群节点状态异常的解决方式

文章目录 集群节点状态异常的解决方式问题概述解决方式1.关闭所有服务2.对所有集群删除Hadoop相关文件2.1 删除Hadoop系统运行时创建的临时数据和文件2.2 删除Hadoop的数据文件 3.重新对Hadoop节点进行初始化和启用4.重启服务&#xff0c;检查节点状态 集群节点状态异常的解决方…

Parallels Desktop 19 for Mac(PD19虚拟机)详细图文安装教程分享

Parallels Desktop 19是一款功能丰富、性能强大且易于使用的虚拟机软件&#xff0c;它可以让您在Mac上同时运行多个操作系统&#xff0c;为您提供更大的灵活性和兼容性。 Parallels Desktop 19 for Mac(PD19虚拟机)下载安装包 Parallels Desktop 19 for Mac(PD19虚拟机)详细图…

护眼台灯的功能作用有哪些?深挖台灯护眼是真的吗

随着现代生活方式的改变&#xff0c;孩子们面临着越来越多的视力挑战。在近视学生中&#xff0c;近10%为高度近视&#xff0c;且占比随年级升高而增长。幼儿园6岁儿童中有1.5%为高度近视&#xff0c;而高中阶段则达到了17.6%。为了守护孩子们的视力健康&#xff0c;在科技飞速发…

查看apk版本号

获取未安装的apk版本号 1. 使用aapt命令 使用cmd cd到aapt工具的位置。位于‌Android SDK的build-tools目录下。 使用aapt命令&#xff0c;指向apk所在绝对路径 aapt dump badging your_apk_file.apk &#xff08;win7按住shift键&#xff0c;右键apk文件选择“复制为路径”…