算法复杂度,咕咕咕

1.数据结构与算法

数据结构是计算机存储,组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。可以理解为形状不同的容器。

算法是定义好的计算过程,取输入值,经过一系列计算方法变成输出值。

(推荐《数据结构》c或c++版,《算法导论》托马斯,《大话数据结构》程杰)

2.算法效率

复杂度:算法在编写成可执行程序后,运行时要耗费时间与空间资源,即时间复杂度,空间复杂度

时间复杂度主要衡量一个算法的运行快慢,空间复杂度主要衡量算法运行所需的额外空间。

但是在现在计算机的存储容量不断变大,空间复杂度不需要重度关注

3.时间复杂度

描述算法的运行时间,衡量程序的时间效率。(函数式T(N))

(为什么不去计算程序的运行时间?程序运行时间与编译环境与配置都有关系,不单单是算法。

并且这样的话时间只能再程序写好后测试,而不能在写完前理论计算评估)

T(N)计算了程序的执行次数。算法程序在被编译后生成二进制指令,程序运行就是CPU执行这些编译好的指令。每句指令执行时间基本一样,那么执行次数和运行时间就正相关,脱离具体的编译运行环境,可以代表程序时间效率的优劣。

void func1(int n)
{
int count=0;
for(int i=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;
}
}T(N)=N^2+2*N+10,对结果影响最大的是n^2,O(n^2)

我们实际计算时间复杂度时,计算的也不是程序精确的执行次数,只是计算增长量级,用O的渐进表示法

3.O的渐进表示法

T(N)只保留最高阶项,去掉低阶项。如果最高项存在且不是1,则去掉项的常数系数。如果没有N相关的项目,只有常数项,用1取代加法常熟。

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);
}
T(N)=2N+10;
O(N)
void func3(int n)
{
int count=0;
for(int k=0;k<n;k++)
{
++count;
}
for(int k=0;k<n;k++)
{
++count;
}
printf("%d",count);
}
T(N)=N+M;
O(N)
void func4(int n)
{
int count=0;
for(int k=0;k<100;k++)
{
++count;
}
printf("%d",count);
}
T(N)=100;
O(1)
const char* strchr(const char* str,int character)
{
const char* p_begin=s;
while(*p_begin!=character)
{
if(*p_begin=='\0')
return NULL;
p_begin++;
}
return p_begin;
}
如果要找的字符在字符串第一个位置,T(N)=1
在最后一个位置,T(N)=N
在中间T(N)=N/2
最好情况O(1),最坏情况O(N),平均情况O(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;
}
}
}如果数组有序,T(N)=N
有序且为降序,T(N)=N*(N+1)/2
取上界,O(N^2)
void func5(int n)
{
int cnt=1;
while(cnt<n)
{
cnt*=2;
}
}
执行次数x,2^x=n
x=logn
O(logn)
long long Fac(size_t n)
{
if(0==n) return 1;
return Fac(n-1)*n;
}
调用一次Fac函数的时间复杂度O(1),总共调用n次递归函数,O(n)

4.空间复杂度

是一个算法在运行过程中需要额外临时开辟的空间,不是程序要占用多少bytes的空间,算的是变量的个数,用O渐进表示法,函数运行时所需要的栈空间(存储参数,局部变量,一些寄存器信息)在编译期间已经确定,空间复杂度主要通过函数运行时显式申请的额外空间确定

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;
}
}
}
bubblesort额外申请的空间有exchange等有限个局部变量,使用了常数个额外空间,O(1)
long long Fac(size_t n)
{
if(n==0)
return 1;
return Fac(n-1)*n;
}
Fac递归调用了n次,额外开辟了n个函数栈帧,每个栈帧使用了常数个空间,O(n)

5.常见复杂度对比

6.例题

给定一个整形数组nums,把数组中元素向右轮转k个位置,k为非负数

时间复杂度O(n^2)
void rotate(int *num,int numsize,int k)
{
while(k--)
{
int end=num[numsize-1];
for(int i=numsize-1;i>0;i++)
{
num[i]=num[i-1];
}
num[0]=end;
}
}
循环k次把数组所有元素向后移动一位
空间复杂度O(n)
申请新数组,把后k个数据放进新数组,再把剩下的设局挪到数组中
void rotate(int* num,int numsize,int k)
{
int newarr[numsize];
for(int i=0;i<numsize;++i)
{
newarr[(i+k)%numsize]=num[i];
}
for(int i=0;i<numsize;++i)
{
num[i]=newarr[i];
}
}
空间复杂度O(1)
前n-k个逆置
后k个逆置
整个逆置
void reverse(int* num,int begin,int end)
{
while(begin<end)
{
int tmp=num[begin];
num[begin]=num[end];
num[end]=tmp;
begin++;
end--;
}
}
void rotate(int* num,int numsize,int k)
{
k=k%numsize;
reverse(num,0,numsize-k-1);
reverse(num,numsize-k,numsize-1);
reverse(num,0,numsize-1);
}/*
void rotate(vector<int>& nums, int k) {k%=nums.size();reverse(nums.begin(),nums.begin()+nums.size()-k);reverse(nums.begin()+nums.size()-k,nums.end());reverse(nums.begin(),nums.end());}
*/

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

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

相关文章

【Linux】 Linux 进程控制

参考博客&#xff1a;https://blog.csdn.net/sjsjnsjnn/article/details/125581083 一、进程创建 1.1 fork()函数 在linux中fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。进程调用fork&#xff0c;当…

【大模型】MCP是啥?它和点菜、做菜、端菜有啥关系?

什么是 Model Context Protocol (MCP)? Model Context Protocol(模型上下文协议),通俗来说,就是一套用来管理、传递和维护对话或交互中上下文信息的规则和格式标准。 换句话说,MCP定义了模型在处理用户输入和生成回答时,如何理解、保留和传递上下文信息的协议,确保对…

机器学习的数学基础:决策树

决策树 文章目录 决策树决策树的基本思想划分选择信息增益增益率基尼指数 减枝处理回归问题对连续值的处理对缺失值的处理 决策树的基本思想 决策树是基于树结构来进行决策的&#xff0c;通过对问题的判断与决策&#xff0c;得到最终决策。 一般的&#xff0c;决策树包括一个…

基于若依前后分离版-用户密码错误锁定

sys_config配置参数 user.password.maxRetryCount&#xff1a;最大错误次数 user.password.lockTime&#xff1a;锁定时长 //SysLoginController//登录 PostMapping("/login") public AjaxResult login(RequestBody LoginBody loginBody) {AjaxResult ajax AjaxR…

Java线程安全集合类

Java线程安全集合类全面解析 目录 并发集合概述List线程安全实现Set线程安全实现Map线程安全实现Queue线程安全实现总结 并发集合概述 Java提供了多种线程安全的集合类&#xff0c;主要分为两大类&#xff1a; 传统同步集合&#xff1a;通过synchronized关键字实现线程安全…

汇川变频器MD600S-4T-5R5为什么要搭配GRJ9000S-10-T滤波器?

一、变频器的工作原理与电磁干扰 汇川MD600S-4T-5R5变频器是一款紧凑型高性能变频器&#xff0c;适用于三相380V-480V电网&#xff0c;额定电流5.5A&#xff0c;支持矢量控制和多种编码器接口&#xff0c;适用于需要高精度速度和转矩控制的场景&#xff0c;如机器人、电梯、纺…

数学运算在 OpenCV 中的核心作用与视觉效果演示

在计算机视觉中&#xff0c;图像不仅仅是我们肉眼所见的内容&#xff0c;它其实是由数值矩阵组成的“数据”。而在 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;中&#xff0c;正是数学运算赋予了图像处理无限的可能——从基本的滤波、增强到复杂的特征…

【快速预览经典深度学习模型:CNN、RNN、LSTM、Transformer、ViT全解析!】

&#x1f680;快速预览经典深度学习模型&#xff1a;CNN、RNN、LSTM、Transformer、ViT全解析&#xff01; &#x1f4cc;你是否还在被深度学习模型名词搞混&#xff1f;本文带你用最短时间掌握五大经典模型的核心概念和应用场景&#xff0c;助你打通NLP与CV的任督二脉&#xf…

springboot mysql/mariadb迁移成oceanbase

前言&#xff1a;项目架构为 springbootmybatis-plusmysql 1.部署oceanbase服务 2.springboot项目引入oceanbase依赖&#xff08;即ob驱动&#xff09; ps&#xff1a;删除原有的mysql/mariadb依赖 <dependency> <groupId>com.oceanbase</groupId> …

电网“逆流”怎么办?如何实现分布式光伏发电全部自发自用?

2024年10月9日&#xff0c;国家能源局综合司发布了《分布式光伏发电开发建设管理办法&#xff08;征求意见稿&#xff09;》&#xff0c;意见稿规定了户用分布式光伏、一般工商业分布式光伏以及大型工商业分布式光伏的发电上网模式&#xff0c;当选择全部自发自用模式时&#x…

C语言之编译器集合

C语言有多种不同的编译器&#xff0c;以下是常见的编译工具及其特点&#xff1a; 一、主流C语言编译器 GCC&#xff08;GNU Compiler Collection&#xff09; 特点&#xff1a;开源、跨平台&#xff0c;支持多种语言&#xff08;C、C、Fortran 等&#xff09;。 使用场景&…

负载均衡将https请求转发后端http服务报错:The plain HTTP request was sent to HTTPS port

https请求报错&#xff1a;The plain HTTP request was sent to HTTPS port 示例背景描述&#xff1a; www.test.com:11001服务需要对互联网使用https提供服务后端java服务不支持https请求&#xff0c;且后端程序无法修改&#xff0c;仅支持http请求 问题描述&#xff1a; 因…

(3)Playwright自动化-3-离线搭建playwright环境

1.简介 如果是在公司局域网办公&#xff0c;或者公司为了安全对网络管控比较严格这种情况下如何搭建环境&#xff0c;我们简单来看看 &#xff08;第一种情况及解决办法&#xff1a;带要搭建环境的电脑到有网的地方在线安装即可。 &#xff08;第二种情况及解决办法&#xf…

【Fiddler抓取手机数据包】

Fiddler抓取手机数据包的配置方法 确保电脑和手机在同一局域网 电脑和手机需连接同一Wi-Fi网络。可通过电脑命令行输入ipconfig查看电脑的本地IP地址&#xff08;IPv4地址&#xff09;&#xff0c;手机需能ping通该IP。 配置Fiddler允许远程连接 打开Fiddler&#xff0c;进入…

PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的区别

python容易编辑&#xff0c;因此用pyrx代替rxjava3做演示会比较快捷。 pyrx安装命令&#xff1a; pip install rx 一、Subject&#xff08;相当于 RxJava 的 PublishSubject&#xff09; PublishSubject PublishSubject 将对观察者发送订阅后产生的元素&#xff0c;而在订阅前…

BLE中心与外围设备MTU协商过程详解

一、MTU基础概念​​ 1. ​​MTU定义​​ ​​最大传输单元&#xff08;MTU&#xff09;​​ 指单次数据传输中允许的最大字节数&#xff0c;包含协议头部&#xff08;3字节&#xff09;和有效载荷&#xff08;最多517字节&#xff09;。BLE默认MTU为​​23字节​​&a…

【华为云Astro-服务编排】服务编排使用全攻略

目录 概述 为什么使用服务编排 服务编排基本能力 拖拉拽式编排流程 逻辑处理 对象处理 服务单元组合脚本、原生服务、BO、第三方服务 服务编排与模块间调用关系 脚本 对象 标准页面 BPM API接口 BO 连接器 如何创建服务编排 创建服务编排 如何开发服务编排 服…

centos实现SSH远程登录

1. 生成SSH密钥对 首先&#xff0c;你需要在客户端机器上生成一个SSH密钥对。打开终端&#xff0c;执行以下命令 ssh-keygen 或ssh-keygen -t rsa -b 2048&#xff08;效果相同&#xff09; 按照提示操作&#xff0c;可以按回车键接受默认的文件名&#xff08;通常是~/.ssh/id_…

定制开发开源AI智能名片S2B2C商城小程序在无界零售中的应用与行业智能升级示范研究

摘要&#xff1a;本文聚焦无界零售背景下京东从零售产品提供者向零售基础设施提供者的转变&#xff0c;探讨定制开发开源AI智能名片S2B2C商城小程序在这一转变中的应用。通过分析该小程序在商业运营成本降低、效率提升、用户体验优化等方面的作用&#xff0c;以及其与京东AI和冯…

ZooKeeper 安装教程(Windows + Linux 双平台)

ZooKeeper 安装教程(Windows + Linux 双平台) Zookeeper 和 Kafka 版本与 JDK 要求 一、安装前准备 系统要求 Java 环境(JDK17+)开放端口:2181(客户端),2888(集群通信),3888(选举)安装 Java Linux(Ubuntu/CentOS) # Ubuntu