当前位置: 首页 > news >正文

【数据结构】常见复杂度习题详解 ------ 习题篇

文章目录

  • 📋前言
  • 一. ⛳️前篇回顾
  • 二. ⛳️常见时间复杂度计算举例
    • 1️⃣实例一
    • 2️⃣实例二
    • 3️⃣实例三
    • 4️⃣实例四
    • 5️⃣实例五
    • 6️⃣实例六
    • 7️⃣实例七
    • 8️⃣实例八
  • 三. ⛳️常见空间复杂度计算举例
    • 1️⃣实例一
    • 2️⃣实例二
    • 3️⃣实例三
  • 四. ⛳️总结


📋前言

🏠 个人主页:@聆风吟的个人主页

🔥系列专栏:本期文章收录在《数据结构初阶》,大家有兴趣可以浏览和关注,后面将会有更多精彩内容!

⏰寄语:少年有梦不应止于心动,更要付诸行动。
🎉欢迎大家关注🔍点赞👍收藏⭐️留言📝
🌈作者留言:本文从上篇文章《算法、时间复杂度和空间复杂度详解 》中剥离出来的,由于详解和题目放在一起篇幅过长,不利于大家更好吸收知识点,特此将其剥离出来。



一. ⛳️前篇回顾

上篇文章我们主要学习了:

  1. 算法的定义:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
  2. 算法的特性:有穷性、确定性、可行性、输入、输出。
  3. 算法的设计要求:正确性、可读性、健壮性、高效率和低存储量需求。
  4. 算法的度量方法:事后统计方法、事前分析估算方法。
  5. 推导大O阶
  6. 时间复杂度
  7. 空间复杂度

    你对以上的内容是否还能够全部回忆起来呢?如果你对某部分还有欠缺,请跳转该篇文章《算法、时间复杂度和空间复杂度详解 》进行复习,再配合着下面习题对时间复杂度和空间复杂度进行巩固。预计明天将会更新数据结构新文,大家抓紧时间在复习下前面知识。



二. ⛳️常见时间复杂度计算举例

1️⃣实例一

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

解析:实例1基本操作执行了2N+10次,根据大O阶的推导方法很容易得出:Func1的时间复杂度为O(N)


2️⃣实例二

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

解析:实例二基本操作执行了M+N次,根据大O阶的推导方法得出:

  • 如果题目没有表明 M 和 N 的大小,Func2的时间复杂度为O(M + N)
  • 如果题目明确表明 M 远大于 N ,则 N 的变化对时间复杂度的影响不大,Func2的时间复杂度为O(M)
  • 如果题目明确表明 N 远大于 M ,则 M 的变化对时间复杂度的影响不大,Func2的时间复杂度为O(N)
  • 如果题目明确表明 M 和 N 一样大,则O(M + N)等价于O(2M)或O(2N),Func2的时间复杂度为O(M)O(N)

3️⃣实例三

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

解析:实例3基本操作执行了100次,根据大O阶的推导方法很容易得出:Func3的时间复杂度为O(1)


4️⃣实例四

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

解析:首先我们先来介绍一下库函数strchr作用:在str指向的字符数组中查找是否包含字符characte。因此实例4的基本操作执行最好1次,最坏N次。根据时间复杂度一般看最坏,strchr的时间复杂度为O(N)


5️⃣实例五

// 计算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;}
}

解析:本题是冒泡排序函数,冒泡排序的思想是:假设数组中有 n 个元素,第一趟执行将会执行 n-1 次交换,将一个元素排好序。第二趟将会执行 n-2 次交换,将将一个元素排好序…依次类推。排好所有元素需要执行 n-1 次,每趟交换的次数分别为(n - 1),(n-2),(n-3),… ,(2),(1)。由此可知,实例5基本操作执行最好n-1次(即数组已经排好序,只需要执行一趟排序判断数组是否已经有序),最坏执行了( n*(n-1) )/2次(即将所有趟交换的次数相加,可以直接使用等差数列求和),通过推导大O阶方法+时间复杂度一般看最坏,BubbleSort的时间复杂度为O(N^2)


6️⃣实例六

// 计算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;elsereturn mid;}return -1;
}

解析:本题是二分查找函数,每次查找将会将范围缩放一半。因此实例6基本操作执行最好1次,最坏O(logN)次。根据时间复杂度一般看最坏,BinarySearch时间复杂度为 O(logN)
在这里插入图片描述


7️⃣实例七

// 计算阶乘递归Fac的时间复杂度?
long long Fac(size_t N)
{if (0 == N)return 1;return Fac(N - 1) * N;
}

解析:本题是一个简单的递归调用, 实例7通过计算分析发现基本操作递归了N次,时间复杂度为O(N)
在这里插入图片描述

8️⃣实例八

// 计算斐波那契递归Fib的时间复杂度?
long long Fib(size_t N)
{if (N < 3)return 1;return Fib(N - 1) + Fib(N - 2);
}

解析:本题是一个双递归。实例8通过计算分析发现基本操作递归了2n,Fib的时间复杂度为O(2^n)
在这里插入图片描述



三. ⛳️常见空间复杂度计算举例

1️⃣实例一

// 计算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;}
}

解析: 实例1使用了常数个额外空间,分别是[ end,exchange,i ]。根据大O阶的推导方法很容易得出,BubbleSort空间复杂度为 O(1)


2️⃣实例二

// 计算Fibonacci的空间复杂度?
// 返回斐波那契数列的前n项
long long* Fibonacci(size_t n)
{if (n == 0)return NULL;long long* fibArray = (long long*)malloc((n + 1) * sizeof(long long));fibArray[0] = 0;fibArray[1] = 1;for (int i = 2; i <= n; ++i){fibArray[i] = fibArray[i - 1] + fibArray[i - 2];}return fibArray;
}

解析:实例2动态开辟了N+1个空间,根据大O阶的推导方法很容易得出,Fibonacci空间复杂度为 O(N)


3️⃣实例三

// 计算阶乘递归Fac的空间复杂度?
long long Fac(size_t N)
{if (N == 0)return 1;return Fac(N - 1) * N;
}

解析:实例3递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)
在这里插入图片描述



四. ⛳️总结

     本文通过大量实例讲解常见时间复杂和空间复杂度计算,希望通过这些例子的讲解能够帮助你在以后的学习中能够更加灵活、精确的计算出一个程序的复杂度,方便我们更快的寻找解决一个问题的最优的算法。

     今天的内容就到这里了,你对今天的内容是否有所掌握?如果还有疑问的话请在评论区里多多提问,大家可以一起帮你解决,让我们共同进步。创作不易,如果对你有用的的话点个赞支持下作者,你们的支持是作者创作最大的动力。关注我不迷路,让我们下期不见不散✋✋。

相关文章:

【数据结构】常见复杂度习题详解 ------ 习题篇

文章目录 &#x1f4cb;前言一. ⛳️前篇回顾二. ⛳️常见时间复杂度计算举例1️⃣实例一2️⃣实例二3️⃣实例三4️⃣实例四5️⃣实例五6️⃣实例六7️⃣实例七8️⃣实例八 三. ⛳️常见空间复杂度计算举例1️⃣实例一2️⃣实例二3️⃣实例三 四. ⛳️总结 &#x1f4cb;前言 …...

一、vue介绍

一、介绍 vue式前端框架&#xff0c;是一套用于构建用户界面的渐进式框架 1、安装vue 安装node.js&#xff08;配置环境变量&#xff09; https://nodejs.org/en/download/ 更换镜像 npm config set registry https://registry.npm.taobao.org 查看镜像 npm config get regi…...

Linux ARMv8 异常向量表

http://blog.chinaunix.net/uid-69947851-id-5830546.html 本章接着《Linux内核启动》部分讲解&#xff0c;我们知道了在进入start_kernel之前&#xff0c;通过指令adr_l x8, vectors&#xff1b;msr vbar_el1, x8设置了异常向量表&#xff0c;那么异常向量表的结构是怎么样…...

C++基类和派生类的内存分配,多态的实现

目录 基类和派生类的内存分配基类和派生类的成员归属多态的实现 基类和派生类的内存分配 类包括成员变量&#xff08;data member&#xff09;和成员函数&#xff08;member function&#xff09;。 成员变量分为静态数据&#xff08;static data&#xff09;和非静态数据&…...

C/C++基础

C 二进制 问题&#xff1a;二进制怎么表示整数、小数、正数、负数&#xff0c;如何存储&#xff1f;加减乘除怎么运算&#xff08;见文章《计算机加减乘除本质》&#xff09;&#xff1f; 变量 c定义一个变量的时候&#xff0c;需要事先定义变量大小和变量类型。 //有符号…...

MySQL基础练习题

数据表介绍 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course(CId,Cname,TId) --CId 课程编号,Cname 课程名称,TId 教师编号 --3.教师表 Teacher(TId,Tname) --TId 教师编号,Tname 教师姓名 --4.成绩…...

【C语言学习笔记 --- 动态内存管理】

C语言程序设计笔记---029 C语言之动态内存管理1、介绍动态内存管理2、动态内存函数的介绍2.1、malloc和free函数2.2、calloc函数2.3、realloc函数 3、动态内存管理过程中&#xff0c;一些常见的错误3.1、对NULL指针的解引用操作3.2、对动态内存开辟的空间的越界访问3.3、对非动…...

Nougat来了,能否成为pdf格式转换的新神器?

Nougat来了&#xff0c;能否成为pdf格式转换的新神器&#xff1f; 论文链接&#xff1a;https://arxiv.org/pdf/2308.13418v1.pdf 项目地址&#xff1a;https://github.com/facebookresearch/nougat What happened&#xff1f;&#x1f928; 科学知识主要存储在书籍和科学期…...

C++文件和流

到目前为止&#xff0c;我们已经使用了 iostream 标准库&#xff0c;它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。 本教程介绍如何从文件读取流和向文件写入流。这就需要用到 C 中另一个标准库 fstream&#xff0c;它定义了三个新的数据类型&#x…...

代码随想录算法训练营第23期day31|贪心算法理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和

目录 一、贪心算法理论基础 二、&#xff08;leetcode 455&#xff09;分发饼干 三、&#xff08;leetcode 376&#xff09;摆动序列 四、&#xff08;leetcode 53&#xff09;最大子序和 一、贪心算法理论基础 1.什么是贪心 贪心的本质是选择每一阶段的局部最优&#xf…...

mdadm命令详解及实验过程

mdadm命令详解及实验过程 ⼀.概念 mdadm是multiple devices admin的简称&#xff0c;它是Linux下的⼀款标准的软件 RAID 管理⼯具&#xff0c;作者是Neil Brown ⼆.特点 mdadm能够诊断、监控和收集详细的阵列信息 mdadm是⼀个单独集成化的程序⽽不是⼀些分散程序的集合&#…...

推荐几个程序员必逛的个人技术博客网站

1、美团技术团队 地 址: 美团技术团队简 介&#xff1a;美团技术团队的博客&#xff0c;干货满满。推荐指数&#xff1a;⭐⭐⭐⭐⭐ ​ 2、阮一峰的网络日志 地 址: 阮一峰的个人网站 - Ruan YiFengs Personal Website简 介&#xff1a;大神阮一峰&#xff0c;博客风格真正…...

Python桌面应用之XX学院水卡报表查询系统(Tkinter+cx_Oracle)

一、功能样式 Python桌面应用之XX学院水卡报表查询系统功能&#xff1a; 连接Oracle数据库&#xff0c;查询XX学院水卡操作总明细报表&#xff0c;汇总数据报表&#xff0c;个人明细报表&#xff0c;进行预览并且支持导出报表 1.总明细报表样式 2.汇总明细样式 3.个人明细…...

ubuntu 中使用Qt连接MMSQl,报错libqsqlodbc.so: undefined symbol: SQLAllocHandle

Qt4.8.7的源码编译出来的libqsqlodbc.so&#xff0c;在使用时报错libqsqlodbc.so: undefined symbol: SQLAllocHandle&#xff0c;需要在编译libqsqlodbc.so 的项目pro文件加上LIBS -L/usr/local/lib -lodbc。 这里的路径根据自己的实际情况填写。 编辑&#xff1a; 使用uni…...

笔试,猴子吃香蕉,多线程写法

package demo;import java.util.concurrent.CountDownLatch;/*** description: 猴子吃香蕉* author: wxm* create: 2023-10-23 14:01**/ public class Main {public static void main(String[] args) throws InterruptedException {Monkey[] m new Monkey[3];Resource r new …...

安装docker ,更换docker版本

docker dockerd & containerd Dockerd&#xff08;Docker 守护进程&#xff09;在其底层使用 Containerd 来管理容器。Containerd 是一个开源的容器运行时管理器&#xff0c;由 Docker 公司于2017年开发并开源&#xff0c;它负责实际的容器生命周期管理。 以下是 Docker 守…...

英语小作文写作模板及步骤(1)

...

编写hello驱动程序

hello的驱动编写 编写驱动程序的步骤 1.确定主设备号&#xff0c;也可以让内核分配 2.定义自己的 file_operations 结构体 3.实现对应的 drv_open/drv_read/drv_write 等函数&#xff0c;填入 file_operations 结构 体 4.把 file_operations 结构体告诉内核&#xff1a;regist…...

ZYNQ中断例程

GPIO 中断系统初始化流程&#xff1a; 第一步:初始化 cpu 的异常处理功能 第二步&#xff1a;初始化中断控制器 第三步&#xff1a;向 CPU 注册异常处理回调函数&#xff1b; 第四步&#xff1a;将中断控制器中的对应中断 ID 的中断与中断控制器相连接 第五步&#xff1a;设置 …...

常用linux命令 linux_cmd_sheet

查看文件大小 ls -al 显示每个文件的kb大小 查看系统日志 dmesg -T | tail 在 top 命令中&#xff0c;RES 和 VIRT&#xff08;或者 total-vm&#xff09;是用来表示进程内存使用的两个不同指标&#xff0c;它们之间有以下区别&#xff1a; RES&#xff08;Resident Set Size…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...