椋鸟数据结构笔记#2:复杂度

news/2024/4/27 19:49:48/文章来源:https://blog.csdn.net/StarlingLin/article/details/136725314

萌新的学习笔记,写错了恳请斧正。


目录

复杂度

时间复杂度

空间复杂度

通过复杂度衡量算法好坏


复杂度

复杂度是衡量算法好坏的一种方式。一般分为时间复杂度空间复杂度,分别用于衡量一个算法在运行时间长短和占据内存空间多少两方面的优劣。

一般我们考察复杂度就是找到相关的代数式,将常数全部忽略,将非最高次项全部忽略,在用括号括起来,前面写一个大O。这就是复杂度的大O表示法

比方说,对于代数式3N^2+2N+4,我们只取N^2;对于2N+4M+1,我们只取M+N。

(未知数的选用是随意的)

至于这个代数式如何找到,且看下方。

时间复杂度

时间复杂度的表达式就是算法执行基本语句的次数与未知量之间的代数关系(一般考虑最坏情况下的关系)

比方说下面这一个函数,不含未知数,其基本语句的运行次数是常数次,时间复杂度就是O(1)。

void function()
{for (int i = 0; i < 114514; ++i){    print("%d\n", i);}
}

而下面这个函数含有未知数,循环中的代码段要运行N次,那么时间复杂度就是O(n)。

void function(int n)
{for (int i = 0; i < n; ++i){    print("%d\n", i);}
}

而下面这个函数虽然有两个循环,但是相互独立,一个运行N次,一个运行2N次,一共是3N次,舍去常数后,时间复杂度还是O(N)。

void function(int n)
{for (int i = 0; i < n; ++i){    print("%d\n", i);}for (int i = 0; i < 2n; ++i){    print("%d\n", i);}
}

但是要注意两个未知数一样时才能合并,不然就还是要写成两个未知数的代数式。比方说下面这一段的时间复杂度为O(M+N)。(如果说明M远大于N则可以省略N;如果MN存在代数关系则需要计算

void function(int a, int b)
{for (int i = 0; i < 3a; ++i){    print("%d\n", i);}for (int i = 0; i < 4b; ++i){    print("%d\n", i);}
}

而下面这一段函数的时间复杂度为O(M^2+N),因为两个未知数是独立的,舍去非最高次项时不能舍弃含有其他未知数的项。

void function(int a, int b)
{for (int i = 0; i < 3a; ++i){for (int j = 0; j < 5a; ++j)    {print("%d\n", i);}}for (int i = 0; i < 4b; ++i){    print("%d\n", i);}
}

再复杂一点,我们看看冒泡排序的时间复杂度,其结果为O(n^2):

void bubbleSort(int p[], int n) //冒泡排序,并打印比较次数和移动次数
{_Bool flag = false;int cnt1 = 0;int cnt2 = 0;int swi = 0;do{flag = false;for (int i = 0; i < n - 1; i++){if (p[i], p[i + 1]){swi = p[i + 1];p[i + 1] = p[i];p[i] = swi;flag = true;cnt2++;}cnt1++;}} while (flag);printf("%d %d ", cnt1, cnt2);
}

表达式也有可能含有其他数学运算,比方说二分搜素的时间复杂度就是O(logN)(注意对数的底数省略不写)

int bin_search(int arr[], int left, int right, int key)
{int i;int j = 1;do{i = (right + left) / 2;if (key > arr[i])left = i;elseright = i;} while (arr[i] != key);return i;
}

甚至更复杂的,有些表达式想要求出来需要较复杂的数列运算,包括但不限于使用等比数列求和公式、差比数列求和公式、裂项相消、配项......

空间复杂度

空间复杂度的表达式描述的是使用某算法所需要的“额外”空间开销与未知数的关系(同样是一般考虑最坏情况)。

首先,我们要注意这里的空间开销是算法额外产生的而不包括原本就开辟的空间

比方说,下面这个函数用于将一个数组的数据复制到另一个数组,那么本身就存在的数组的空间当然不能算在算法的空间开销中,其额外开辟的空间只有变量i,则空间复杂度为O(1)。

void copyArr(int* arr1, int* arr2, int n)
{for (int i = 0; i < n; ++i){arr2[i] = arr1[i];}
}

而如果我们写成这样,空间复杂度就变成O(N)了:

void copyArr(int* arr1, int* arr2, int n)
{int* arrTmp = (int*)malloc(n * sizeof(int));for (int i = 0; i < n; ++i){arrTmp[i] = arr1[i];arr2[i] = arrTmp[i];}
}

空间复杂度也可以变的较为复杂,比方说求斐波那契数列的空间复杂度:

int Feb(int n)
{if (1 == n || 2 == n)return 1;elsereturn Feb(n - 1) + Feb(n - 2);
}

想要算明白这个,需要对递归和函数栈帧(详见函数栈帧相关博客)有更深刻的理解。

由于递归不是一层一层进行的,所以其空间复杂度并不是总共开辟的栈帧空间的数量

递归是一条路走到底再返回走其他路的,所以空间复杂度等于其路径深度,也就是O(N)。

(这里学过深度优先搜素dfs就清楚了)

通过复杂度衡量算法好坏

一般我们认为,对于一个算法而言,其优劣可以通过未知数趋于无穷时的复杂度体现。而一般我们可以通过下面的不等式链比较复杂度:

O(n^n)>O(n!)>O(2^n)>O(n^3)>O(n^2)>O(nlogn)>O(n)>O(logn)>O(1)


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

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

相关文章

elasticsearch 6.8.x 索引别名、动态索引扩展、滚动索引

文章目录 引言索引别名&#xff08;alias&#xff09;创建索引别名查询索引别名删除索引别名重命名索引别名 动态索引&#xff08;index template&#xff0c;动态匹配生成索引&#xff09;新建索引模板新建索引并插入数据索引sys-log-202402索引sys-log-202403索引sys-log-202…

C语言例4-3:复合语句,输出a,b的值

代码如下&#xff1a; //复合语句&#xff0c;输出a,b的值 #include<stdio.h> int main(void) {int a 10;printf("a %d\n",a);{int b20; //复合语句printf("b %d\n",b); //复合语句中的数据定义语句放在其他语句的前面}return …

uniapp实现单选组件覆盖选中样式

uniapp实现单选组件覆盖选中样式 完整代码&#xff1a; <!-- 是否选择组件: trueOfFalseChooseBtn --> <template><view class"is-true-body"><view class"btn-con" :class"isTrue ? btn-con-active : " click"clic…

42 ajax 下载文件未配置 responseType blob 导致的文件异常

前言 这是一个最近的关于文件下载碰到的一个问题 主要的情况是, 基于 xhr 发送请求, 获取下载的文件 然后 之后 xhr 这边拿到 字节序列之后, 封装 blob 来进行下载 然后 最开始我们这边没有配置 responseType 为 blob, arraybuffer, 然后 导致下载出来的 文件大小超过了…

前端Web移动端学习day05

移动 Web 第五天 响应式布局方案 媒体查询Bootstrap框架 响应式网页指的是一套代码适配多端&#xff0c;一套代码适配各种大小的屏幕。 共有两种方案可以实现响应式网页&#xff0c;一种是媒体查询&#xff0c;另一种是使用bootstrap框架。 01-媒体查询 基本写法 max-wid…

如何优化财务管理?中小型外贸企业实用指南

在当今全球化的商业环境中&#xff0c;越来越多的中小企业涉足外贸领域&#xff0c;以寻求更广阔的市场和发展空间。在这一过程中&#xff0c;财务管理的重要性尤为凸显&#xff0c;需关注外汇风险、税务合规性、现金流等多个方面的问题。 一、中小企业外贸财务管理难题 币种核…

Python入门练习 - 学生管理系统

Python 实现读书管理系统 """ 实现一个命令行版的读书管理系统 """ import os.path import sys# 使用这个全局变量&#xff0c;来管理所有的学生信息 # 这个列表的每个元素都是一个‘字典’&#xff0c;每 个 字典就分别表示了一个同学students …

argocd cli工具使用

一、前言 ragocd除了使用web界面操作之外&#xff0c;也可以通过argocd cli工具进行操作&#xff0c;关于集群创建、gitlab仓库创建、app创建都是可以通过yaml 文件去操作&#xff0c;使用web界面创建的操作也需要使用argocd cli工具进行备份 二、使用 在argocd部署的章节已经…

阿里云4核16G服务器优惠价格26元1个月、149元半年

阿里云4核16G服务器优惠价格26.52元1个月、79.56元3个月、149.00元半年。2024年腾讯云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也…

MySQL数据库高级语句

文章目录 MySQL高级语句older by 排序区间判断查询或与且&#xff08;or 与and&#xff09;嵌套查询&#xff08;多条件&#xff09;查询不重复记录distinctcount 计数限制结果条目limit别名as常用通配符嵌套查询&#xff08;子查询&#xff09;同表不同表嵌套查询还能用于删除…

Python基础教程:基本数据类型

基本数据类型 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组) 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合) Numbers(数字) 数字数据类型用于存储数值。 他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对…

【正点原子FreeRTOS学习笔记】————(12)信号量

这里写目录标题 一、信号量的简介&#xff08;了解&#xff09;二、二值信号量&#xff08;熟悉&#xff09;三、二值信号量实验&#xff08;掌握&#xff09;四、计数型信号量&#xff08;熟悉&#xff09;五、计数型信号量实验&#xff08;掌握&#xff09;六、优先级翻转简介…

腾讯云GPU云服务器_GPU云计算_异构计算_弹性计算

腾讯云GPU服务器是提供GPU算力的弹性计算服务&#xff0c;腾讯云GPU服务器具有超强的并行计算能力&#xff0c;可用于深度学习训练、科学计算、图形图像处理、视频编解码等场景&#xff0c;腾讯云百科txybk.com整理腾讯云GPU服务器租用价格表、GPU实例优势、GPU解决方案、GPU软…

LinkedIn 互联网架构扩展简史

LinkedIn成立于 2003 年&#xff0c;其目标是连接到您的网络以获得更好的工作机会。第一周只有 2,700 名会员。时间快进了很多年&#xff0c;LinkedIn 的产品组合、会员基础和服务器负载都取得了巨大的增长。 如今&#xff0c;LinkedIn 在全球运营&#xff0c;拥有超过 3.5 亿会…

R使用netmeta程序包实现生存数据的频率学网状meta分析

之前的推文系统的介绍了使用netmeta包实现对二分类变量、连续型变量和罕见事件的网状meta分析。今天的文章介绍如何使用netmeta程序包实现生存数据的频率学网状meta分析&#xff0c;用来评估6种免疫疗法&#xff08; Camrelizumab、Tislelzumab、Toripalimab、Sintilimab、Pemb…

(二)windows配置JDK环境

1、安装包下载地址&#xff0c;官网&#xff1a;Java Archive | Oracle 长期稳定支持版本8、11、17、21 选择一个需要下载的连接点进去&#xff1a; 在下载列表中根据操作系统选择不同的下载包&#xff1a; 注意&#xff1a;部分版本下载需要先登录后才可以下载。 安装包附件…

Canal解决Redis缓存与Mysql数据库的一致性问题

1、什么是Canal&#xff1f; 如何解决Redis缓存与Mysql数据库的一致性问题&#xff1f;我们常用数据双删缓存超时设置去解决。这样最差的情况&#xff0c;就是在超时时间内&#xff0c;数据存在不一致。 canal&#xff0c;译为管道&#xff0c;主要用途是基于 MySQL 数据库增…

(1) 易经与命运_学习笔记

个人笔记&#xff0c;斟酌阅读 占卦的原理 三个铜板&#xff0c;正面是3&#xff0c;反面2&#xff0c;三个一起转&#xff0c;得出6,7,8,9 数字象6老阴7少阳8少阴9老阳 生数和成数 生数和成数应该说出自《河图》。其中一二三四五为生数&#xff0c;六七八九十为成数。 生…

基于k6和python进行自动化性能测试

摘要&#xff1a;在性能测试中&#xff0c;达到相应的性能指标对于一个软件来说十分重要&#xff0c;在本文中&#xff0c;将介绍一种现代化性能测试工具k6。 import http from k6/http; import { sleep } from k6; export default function () { http.get(https://test-api…

正式发布:VitePress 1.0 现代化静态站点生成器!

大家好&#xff0c;我是奇兵&#xff0c;今天介绍一下现代化静态站点生成器!&#xff0c;希望能帮到大家。 3 月 21 日&#xff0c; 由 Vue 团队出品的现代化静态站点生成器 VitePress 正式发布 1.0 版本&#xff01;它专为构建快速、以内容为中心的网站而生&#xff0c;能够轻…