数据结构 ——— 常见的时间复杂度计算例题(中篇)

embedded/2024/10/20 10:35:32/

目录

例题1:

例题2:


例题1:

代码演示:

void BubbleSort(int* a, int n)
{// 断言assert(a);// 循环1for (size_t end = n; end > 0; end--){int flag = 0;// 循环2(循环1的内部循环)for (size_t i = 1; i < end; i++){if (a[i - 1] > a[i]){// 交换Swap(&a[i - 1], &a[i]);flag = 1;}}if (flag == 0)break;}
}

问:计算 BubbleSort 函数的时间复杂度?

代码解析:

例题1 代码的意思是:对整型数组 a 排序,排成升序,且根据 flag 变量判断当前的整型数组 a 是否为升序,是的话就直接跳出循环(也就是冒泡排序

像是 例题1 这种的代码,不会固定执行 N 次,而是要分情况看待,且在实际中一般情况关注的是算法的最坏运行情况,所以以最坏的情况举例(也就是当前整型数组 a 为降序的情况时):

当整型数组 a 为降序时,第一个元素就要交换 N-1 次才能到最终该停留的位置,第二个元素就要交换 N-2 次才能到最终该停留的位置…………,以此类推,可以发现各个元素交换次数的总和加起来是一个等差数列,由此得出时间复杂度函数式:

时间复杂度函数式:F(N) = N*(N-1)/2 = (N^2-N)/2 

再根据时间复杂度函数式和大O的渐进表示法的规则推导出大O的渐进表示法:只保留最高阶项(除去 F(N) 中的 N) ;如果最高阶项存在且不是1,则去除与这个项目相乘的常数(除去 F(N) 中的2 ),得出大O的渐进表示法

大O渐进表示法:O(N^2)


例题2:

代码演示:

int BinarySearch(int* a, int n, int x)
{assert(a);int left = 0;int right = n - 1;// 循环1while (left <= right){int mid = (left + right) / 2;if (a[mid] < x)left = mid + 1;else if (a[mid] > x)right = mid - 1;elsereturn mid;}return -1;
}

问:计算 BinarySearch 函数的时间复杂度?

代码解析:

例题2 代码的意思是:二分查找,找到了返回 x 元素的下标,没找到返回 -1(前提:整型数组 a 是有序的)

例题2 同样要用最坏的情况看待(也就是 left 和 right 相等的情况下才找到 x ,或者没有找到 x):

整型数组 a 的长度是 N ,每循环一次,N 就缩小一半…………,也就是 N/2/2/……/2 = 1(当 left 等于 right 的时候就停止),假设循环了 x 次,那么 N/2/2/……/2 = 1 这个式子就被替换为 N/(2^x) = 1 (等式左右两边乘上 2^x )得:N = 2^x ,再 x = logN,所以得出时间复杂度函数式:

时间复杂度函数式:F(N) = logN(注意:log是以2为底)

再由时间复杂度函数式直接得出大O的渐进表示法:

大O渐进表示法:O(logN)


http://www.ppmy.cn/embedded/118115.html

相关文章

FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频

《FFmpeg开发实战&#xff1a;从零基础到短视频上线》一书的“5.1.2 把音频流保存为PCM文件”介绍了如何把媒体文件中的音频流转存为原始的PCM音频&#xff0c;在样例代码的转存过程中&#xff0c;解码后的PCM数据未经任何加工处理&#xff0c;就直接保存到二进制文件。也就是…

伊犁-linux 硬盘添加,分区,格式化

主要是linux 下操作硬盘分区&#xff0c;格式化 这样1个sata 盘就添加成功了 &#xff01;  继续添加三块 sata1 hda sata hdb sata hdc sata hdd scsi sda 作为启动盘 进行操作系统的引导 如果scsi 往下调整 先敲enter 在用&#xff0d; 号往下 如果是往上调整敲…

python 2024-10

第七课 204. 计数质数 语法&#xff1a;while else&#xff0c;continue break 埃氏筛 数的倍数不是素数。 class Solution:def countPrimes(self, n: int) -> int:res 0for i in range(2, n):for j in range(2, i):if i % j 0:breakelse:res 1return res优化 class …

python 实现random forest regressor随机森林回归器算法

random forest regressor随机森林回归器算法介绍 随机森林回归器&#xff08;Random Forest Regressor&#xff09;是一种基于决策树的集成学习算法&#xff0c;用于回归任务。它是随机森林算法在回归问题上的应用。随机森林通过构建多个决策树并将它们的预测结果进行汇总来提…

【小沐学CAD】3ds Max常见操作汇总

文章目录 1、简介2、二次开发2.1 C 和 3ds Max C SDK2.2 NET 和 3ds Max .NET API2.3 3ds Max 中的 Python 脚本2.4 3ds Max 中的 MAXScript 脚本 3、快捷键3.1 3Dmax键快捷键命令——按字母排序3.2 3dmax快捷键命令——数字键3.3 3dmax功能键快捷键命令3.4 3Dmax常用快捷键——…

c++实现TCPUDP

做网络通信作业之前的学习 !(>。<)! 一.TCP 1.服务端流程 1.创建socket套接字 socket套接字可以理解成网络接口&#xff0c;只有通过了socket套接字才能跟对应的电脑进行通信 2.给这个socket绑定一个端口号 IP地址是指定电脑的 端口号是指定电脑上面某个软件的 3.给soc…

mxnet同步机制

mxnet同步机制 在 MXNet 中&#xff0c;多个算子和多个内核&#xff08;kernel&#xff09;的同步机制依赖于 CUDA 流&#xff08;CUDA Streams&#xff09; 和 事件&#xff08;CUDA Events&#xff09;&#xff0c;以及其内部的 执行引擎&#xff08;Execution Engine&#…

AI 赋能大模型:从 ChatGPT 到国产大模型的角逐与发展契机

在当今科技飞速发展的时代&#xff0c;大模型作为人工智能领域的关键技术&#xff0c;正引发着深刻的变革。它们在自然语言处理、计算机视觉、语音识别等众多领域展现出了惊人的潜力&#xff0c;为各行各业带来了前所未有的机遇和挑战。本文将深入剖析大模型的技术原理、市场态…