【落羽的落羽 数据结构篇】算法复杂度

在这里插入图片描述

文章目录

  • 一、数据结构和算法简介
  • 二、算法复杂度
    • 1. 时间复杂度
    • 2. 空间复杂度

一、数据结构和算法简介

数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用,所以我们要学习各种各样的数据结构,比如线性表、树、图、哈希等等。

算法,是定义良好的计算过程。简单来说,算法就是一系列的计算步骤,用来将输入数据转换成输出结果。衡量一个算法的好坏,需要从算法的复杂度来分析。

二、算法复杂度

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源,因此衡量一个算法的好坏,一般是从时间和空间两个维度来看,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢,空间复杂度主要衡量一个算法运行所需要的额外空间。

1. 时间复杂度

在计算机科学中,T(N)描述了该算法的指令执行次数,并不是计算程序的运行时间。因为一个程序的运行时间不仅关乎算法本身,还有编译器版本、机器配置新旧等等因素。
T(N)计算了程序的执行次数,假设每句指令执行时间基本一样(实际有差别但是微乎其微),那么执行次数和运行时间就成等比关系,执行次数就能代表程序运行时间效率的优劣。比如对于同一个问题,算法a的T(N)=N,算法b的T(N)=N2,那么算法a的时间效率优于算法b。

计算时间复杂度要注意:由于CPU一秒可以处理上亿条代码指令,所以变量的单次定义语句可以忽略,时间复杂度只计算循环语句。而我们计算时间复杂度只是想比较算法程序的增长量级,也就是N不断变大时T(N)的差别,而**常数项和低阶项对结果的影响很小,甚至最高项的系数也可以忽略影响,所以我们只保留最高项,并且它的系数视作1。如果T(N)中没有任何关于N的项,时间复杂度就是1。复杂度的最终表示通常使用O的渐进表示法。**
例如:
T(N)=3N2+2N+10,则时间复杂度为O(N2)
T(N)=5N3+N2+5N,则时间复杂度为O(N3)
T(N)=6,则时间复杂度为O(1)

来几个例子分析就懂了:

void Func1(int N) 
{ int count = 0;   //忽略for (int i = 0; i < N ; ++i) { for (int j = 0; j < N ; ++j) { ++count; //N^2次} } for(int k = 0; k < 2*N ; ++k) { ++count; //2N次} int M = 10; //忽略while(M--) { ++count; //10次}
}
//T(N)=N^2+2N+10  时间复杂度为O(N^2)
void Func2(int N)
{int count = 0;for(int k=0; k<100; k++){++count;    //100次} printf("%d",count);
}
//T(N)=100  时间复杂度为O(1)
void func3(int n)
{int cnt = 1;while(cnt < n)cnt *= 2;
}
//n=2时,执行次数为1。n=4时,执行次数为2。n=16时,执行次数为4 ......
//假设执行次数为x,则2^x=n。x=log n,时间复杂度为O(logN)
//(对数的底数对结果的影响也可以忽略,因此不管底数是多少都可以省略不写,都表示为log n)
long long func4(size_t N)
{if(N==0)return 1;return func4(N-1)*N;
}
//递归也是一种循环,递归算法的时间复杂度是单次递归的时间复杂度乘递归次数
//时间复杂度为O(1)×N = O(N)
void func5(int N, int M)
{int count = 0;for(int k = 0; k<N; k++)count++;    //N次for(int k = 0; k<M; k++)count++;    //M次printf("%d", count);
}
//T(N)=N+M
//若N=M,则时间复杂度为O(N)。若M远大于N,则为O(M)。若N远大于M,则为O(N)

除此之外,有些算法的时间复杂度还存在最好、平均、最坏情况。最好情况是任意输入规模的最小运行次数(下界),最坏情况是任意输入规模的最大运行次数(上界)。一般情况下,我们都关注算法的最坏运行情况。比如冒泡排序算法,就存在这样的情况:
最好情况是数组已经有序,时间复杂度就是O(N);最坏情况是数组完全逆序,时间复杂度是O(N2),因此冒泡排序的时间复杂度取最差情况O(N2)
在这里插入图片描述

2. 空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中需要额外临时开辟的空间。空间复杂度并不是程序运行所占用的内存大小,计算的是变量的个数。大多数算法使用的是有限个变量,所以空间复杂度为O(1)。但对于递归算法,递归的空间复杂度等于单词递归的空间复杂度乘以递归次数,即O(1)×N=O(N)
在实际算法题目中,我们尤其关注时间复杂度,空间复杂度就不是特别重要了。

在这里插入图片描述

本篇完,感谢阅读

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

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

相关文章

VsCode安装文档

一、下载 进入VS Code官网&#xff1a;Visual Studio Code - Code Editing. Redefined&#xff0c;点击 DownLoad for Windows下载windows版本 当然也可以点击旁边的箭头&#xff0c;下载Windows版本 或 Mac OS 版本 备注&#xff1a; Stable&#xff1a;稳定版Insiders&#…

32、【OS】【Nuttx】OSTest分析(1):stdio测试(二)

背景 接上篇wiki 31、【OS】【Nuttx】OSTest分析&#xff08;1&#xff09;&#xff1a;stdio测试&#xff08;一&#xff09; 继续stdio测试的分析&#xff0c;上篇讲到标准IO端口初始化&#xff0c;单从测试内容来说其实很简单&#xff0c;没啥可分析的&#xff0c;但这几篇…

机器学习-核函数(Kernel Function)

核函数&#xff08;Kernel Function&#xff09;是一种数学函数&#xff0c;主要用于将数据映射到一个更高维的特征空间&#xff0c;以便于在这个新特征空间中更容易找到数据的结构或模式。核函数的主要作用是在不需要显式计算高维特征空间的情况下&#xff0c;通过内积操作来实…

计算机网络 (60)蜂窝移动通信网

一、定义与原理 蜂窝移动通信网是指将一个服务区分为若干蜂窝状相邻小区并采用频率空间复用技术的移动通信网。其原理在于&#xff0c;将移动通信服务区划分成许多以正六边形为基本几何图形的覆盖区域&#xff0c;称为蜂窝小区。每个小区设置一个基站&#xff0c;负责本小区内移…

每日一题 419. 棋盘上的战舰

419. 棋盘上的战舰 简单 class Solution { public:int countBattleships(vector<vector<char>>& board) {int ans 0;for(int i0;i<board.size();i){for(int j0;j<board[0].size();j){if(board[i][j] X){dfs(board,i,j);ans;}}}return ans;}void dfs(…

win32汇编环境,函数的编写与调用、传值或返回值等

;运行效果 ;win32汇编环境,函数的编写与调用、传值或返回值等 ;函数在被调用的时候&#xff0c;如果此函数实体在前面&#xff0c;可以不用声明。如果实体在后面&#xff0c;则需要先声明。类似于下面的DlgProc函数&#xff0c;因为它的实体在后面&#xff0c;所以需要在调用之…

web前端3--css

注意&#xff08;本文一切代码一律是在vscode中书写&#xff09; 1、书写位置 1、行内样式 //<标签名 style"样式声明"> <p style"color: red;">666</p> 2、内嵌样式 1、style标签 里面写css代码 css与html之间分离 2、css属性:值…

Oracle 创建用户和表空间

Oracle 创建用户和表空间 使用sys 账户登录 建立临时表空间 --建立临时表空间 CREATE TEMPORARY TABLESPACE TEMP_POS --创建名为TEMP_POS的临时表空间 TEMPFILE /oracle/oradata/POS/TEMP_POS.DBF -- 临时文件 SIZE 50M -- 其初始大小为50M AUTOEXTEND ON -- 支持…

Java 大视界 -- Java 大数据中的异常检测技术与应用(61)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

利用大语言模型(LLM)增强软件测试自动化的最佳实践

在当今迅速变化的科技时代&#xff0c;软件测试行业面临着越来越高的效率和质量要求。作为测试专家&#xff0c;我们都知道&#xff0c;传统的测试方法往往无法满足快速迭代和高效交付的需求。在这种背景下&#xff0c;自动化测试逐渐成为解决方案的一部分。而大语言模型&#…

Anonymous,Github 匿名化工具

一.Github 匿名化工具 Anonymous&#xff0c;会为 github 自动生成一个匿名化的URL&#xff0c;保护隐私和双盲评审 待添加...

Linux(Centos、Ubuntu) 系统安装jenkins服务

该文章手把手演示在Linux系统下如何安装jenkins服务、并自定义jenkins数据文件位置、以及jenkins如何设置国内镜像源加速&#xff0c;解决插件下载失败问题 安装方式&#xff1a;war包安装 阿里云提供的war下载源地址&#xff1a;https://mirrors.aliyun.com/jenkins/war/?s…

不只是mini-react第二节:实现最简fiber

省流|总结 首先&#xff0c;我们编写JSX文件&#xff0c;并通过Babel等转换工具将其转化为createElement()函数的调用&#xff0c;最终生成虚拟 DOM&#xff08;Vdom&#xff09;格式。举个例子&#xff1a; // 原始 JSX const App <div>hi-mini-react</div>;//…

MATLAB中alphanumericsPattern函数用法

目录 语法 说明 示例 从文本中提取字母和数字 匹配所设置数目的字母和数字 匹配不同大小的字母和数字集合 alphanumericsPattern函数的功能是匹配字母和数字字符。 语法 pat alphanumericsPattern pat alphanumericsPattern(N) pat alphanumericsPattern(minCharact…

【数据结构】树的基本:结点、度、高度与计算

树是数据结构中一种重要的非线性结构&#xff0c;广泛应用于计算机科学的各个领域&#xff0c;例如文件系统、数据库索引、编译器等。理解树的各种性质&#xff0c;如结点数、度、高度等&#xff0c;对于解决实际问题至关重要。 本文将会探讨树的基本概念&#xff0c;以及给出几…

Flutter调用HarmonyOS NEXT原生相机拍摄相册选择照片视频

目录 1.项目背景 2.遇到的问题 3.开发准备 4.开发过程 首先创建注册调用鸿蒙原生的渠道 创建并初始化插件 绑定通道完成插件中的功能 5.具体步骤 根据传值判断是相册选取还是打开相机 相册选取照片或视频 相机拍摄照片或视频 调用picker拍摄接口获取拍摄的结果 视频…

MongoDB实训:电子商务日志存储任务

一、实验目的 1. 理解如何通过Java API连接MongoDB数据库。 2. 学习在Java中使用MongoDB进行数据库操作&#xff0c;包括插入数据、查询数据以及数据统计等。 3. 掌握电子商务日志数据在MongoDB中的存储和操作方法。 二、实验环境准备 1. JAVA环境准备&#xff1a;确保…

计算机网络 (59)无线个人区域网WPAN

前言 无线个人区域网&#xff08;WPAN&#xff0c;Wireless Personal Area Network&#xff09;是一种以个人为中心&#xff0c;采用无线连接方式的个人局域网。 一、定义与特点 定义&#xff1a;WPAN是以个人为中心&#xff0c;实现活动半径小、业务类型丰富、面向特定群体的无…

从spec到iso的koji使用

了解一下Linux发行版流程&#xff1a;:从spec到iso的koji使用 for Fedora 41。 Fedora 41有24235个包&#xff0c;我们选择 minimal 的几十个源码包&#xff0c;百多个rpm包构建。 配3台服务器 40C64G 44C64G 80C128G&#xff0c;有点大材小用&#xff0c;一台就够了 &#xf…

【无标题】mysql python 连接

coding:utf8 import os import pymysql import yaml from common.log import logger class Mysql: # 处理.sql备份文件为SQL语句 def __read_sql_file(self,file_path): # 打开SQL文件到f sql_list = [] with open(file_path, ‘r’, encoding=‘utf8’) as f: # 逐行读取和…