时间复杂度与空间复杂度(上篇)

server/2024/9/23 14:35:26/

目录

  • 前言
  • 时间复杂度

前言

算法在运行的过程中要消耗时间资源和空间资源
所以衡量一个算法的好坏要看空间复杂度时间复杂度
时间复杂度衡量一个算法运行快慢
空间复杂度是一个算法运行所需要的额外的空间
一个算法中我们更关心的是时间复杂度

时间复杂度

时间复杂度计算的不是时间,是程序的运行次数
计算时间复杂度的方法是大O的渐进表示法
计算的是程序大概的运算次数
看影响最大的项,计算的都是N很大的情况
因为N很小CPU跑的很快,算法时间上没有差异

大O指的是函数渐进行为的数学符号

1.用常数1代表运算中所有加法常数 例如: O(1)代表常数次不是1次,100 --> O(1)

2.保留对结果影响最大的项,保留最高阶项

3.与最高阶相乘的系数如果是常数,就去除这个常数,保留最高阶的项

时间复杂度还有平均情况,最好情况,最坏情况找到
但我们关心的是最坏情况

例如:一个数组中搜查一个数据x,最坏的情况是找n次,找到最后一个数据才找到
在这里插入图片描述

例如:在这里插入图片描述下面举几个例子:

// 计算strchr的时间复杂度?
const char * strchr ( const char * str, int character );

strchr是在一个字符串中找一个字符
strchr的实现也比较简单
如果*str等于要找的字符就跳出来,否则++继续找

while(*str)
{if(*str == x)break;elsestr++;
}

这样时间复杂度就容易看出来了:O(n)

// 计算Func4的时间复杂度?
void Func4(int N)
{
int count = 0;
for (int k = 0; k < 100; ++ k)
{
++count;
}
printf("%d\n", count);
}

100次为常数次O(1)

// 计算Func3的时间复杂度?
void Func3(int N, int M)
{
int count = 0;
for (int k = 0; k < M; ++ k)
{
++count;
}
for (int k = 0; k < N ; ++ k)
{
++count;
}
printf("%d\n", count);
}

O(M+N) 或 O(max(M,N))
如果M远大于N,O(M)
如果N远大于M,O(N)

// 计算BubbleSort的时间复杂度?
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;
}
}

冒泡排序的时间复杂度:O(N^2)
N*(N-1) - >N^2

// 计算BinarySearch的时间复杂度?
int BinarySearch(int* a, int n, int x)
{
assert(a);
int begin = 0;
int end = n-1;
// [begin, end]:begin和end是左闭右闭区间,因此有=号
while (begin <= end)
{
int mid = begin + ((end-begin)>>1);
if (a[mid] < x)
begin = mid+1;
else if (a[mid] > x)
end = mid-1;
else
return mid;
}
return -1;
}

二分查找的时间复杂度:O(logN)
一直二分二分,二分到最后一个数据才找到(最坏情况)
在这里插入图片描述
在这里插入图片描述
二分查找又叫作区间查找
可以分为左闭右闭 [ ] , 左闭右开[ ) ,
左开右闭( ] ,左开右开(),下一篇博客详细介绍
在这里插入图片描述
二分查找的缺点:
外强中干,实际中不太使用
a.排序 (对数据进行移动)(例如快排,冒泡)
b.数组结构(不方便插入删除)
插入删除每次都要移动数据
后续我们学的二叉搜索树
红黑树,AVL树
B树系列适合求解这类问题

暴力查找:最朴素,最直接的方式求解
在N个数据中一个一个地找,最坏情况就找到最后一个数据
最后一个数据找到
或最后一个数据也找不到

在这里插入图片描述


http://www.ppmy.cn/server/39864.html

相关文章

重庆市工程技术生态环境专业职称申报条件

重庆市工程技术生态环境专业职称申报条件链接重庆市人力资源和社会保障局 重庆市生态环境局关于印发重庆市工程技术生态环境专业职称申报条件的通知_重庆市人力资源和社会保障局类别基本条件业绩成果备注工程师具备博士学位&#xff1b;或具备硕士学位或第二学士学位&#xff0…

基于springboot+mybatis+vue的项目实战之增删改查CRUD

目录结构 页面的效果大致如下&#xff1a; PeotController.java package com.example.controller;import com.example.pojo.Peot; import com.example.pojo.Result; import com.example.service.PeotService; import org.springframework.beans.factory.annotation.Autowired;…

MySQL(定义语言与操作语言)

一、数据定义语言 DDL 1 、数据库的创建 &#xff08; 1 &#xff09;创建数据库 ①查看数据库 show databases; ②创建数据库 基本格式&#xff1a; create database <数据库名>; ③如果数据库名不存在就创建数据库&#xff1a; 基本格式&#xff1a; SQL 语言不…

【Git】 Git分支操作指南

隐形的纪念躲在心里面 也许吧 也许不会再见 阴天或晴天 一天又一年 风它在对我说莫忘这一切 &#x1f3b5; 蔡淳佳《隐形纪念》 Git是一种非常强大的分布式版本控制系统&#xff0c;允许用户在开发过程中创建不同的分支&#xff08;branch&#xff09;来分…

Linux监听某个进程,自动重启

文章目录 前言一、使用 bash 脚本编写监控程序二、使用 systemd总结 前言 在 Linux 下监听某个进程&#xff0c;当进程异常退出后自动重启&#xff0c;可以使用bash脚本编写监控程序&#xff0c;也可以使用系统工具如 systemd 或 supervisor。 一、使用 bash 脚本编写监控程序…

使用 Docker 部署 TaleBook 私人书籍管理系统

1&#xff09;项目介绍 GitHub&#xff1a;https://github.com/talebook/talebook Talebook 是一个简洁但强大的私人书籍管理系统。它基于 Calibre 项目构建&#xff0c;具备书籍管理、在线阅读与推送、用户管理、SSO 登录、从百度/豆瓣拉取书籍信息等功能。 友情提醒&#x…

Vue UI 组件库

推荐使用 npm 的方式安装&#xff0c;它能更好地和 webpack 打包工具配合使用。 npm i element-ui -SCDN: 目前可以通过 unpkg.com/element-ui 获取到最新版本的资源&#xff0c;在页面上引入 js 和 css 文件即可开始使用。 <!-- 引入样式 --> <link rel"styl…

ROS机器人实用技术与常见问题解决

问题速查手册&#xff08;时实更新&#xff09;更加全面丰富的问题手册记录 1.机器人使用GPARTED挂载未分配空间 需要在图型界面下操作&#xff0c;建议使用no machine连接 安装gparted磁盘分区工具, sudo apt-get install gparted -y 启动软件 sudo gparted 点击磁盘/内存…