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

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

目录

前言

例题1:

例题2:

例题3:

例题4:


前言

在上一章讲解了时间复杂度的概念,以及用 大O的渐进表示法 表示 时间复杂度

数据结构 ——— 算法的时间复杂度-CSDN博客

接下来利用C语言代码的例题,更深一步的掌握用 大O的渐进表示法 表示 代码的时间复杂度


例题1:

代码演示:

void Func1(int N)
{
	int count = 0;

    // 循环1
	for (int k = 0; k < 2 * N; k++)
	{
		count++;
	}
	
	// 循环2
    int M = 10;
	while (M--)
	{
		count = count + 1;
	}
}

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

代码解析:

循环1 执行了 2*N 次,循环2 执行了 10 次 

时间复杂度函数式:F(N) =  2*N + 10

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

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


例题2:

代码演示:

void Func2(int N, int M)
{
	int count = 0;

	// 循环1
	for (int k = 0; k < N; k++)
	{
		count++;
	}

	// 循环2
	for (int k = 0; k < M; k++)
	{
		count++;
	}
}

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

代码解析:

循环1 执行了 N 次,循环2 执行了 M 次

时间复杂度函数式:F(N) =  N + M

根据大O的渐进表示法的规则:N 和 M 都是平阶,且不是常数,所以都要保留下来,得出大O的渐进表示法

大O的渐进表示法:O(N + M)


例题3:

代码演示:

void Func3(int N)
{
	int count = 0;

	// 循环1
	for (int k = 0; k < 100; k++)
	{
		count++;
	}
}

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

代码解析:

循环1 执行了 100 次

时间复杂度函数式:F(N) = 100

根据大O的渐进表示法的规则:用常数1取代运行时间中的所有加法常数( F(N) 中的 100 取代为1),得出大O的渐进表示法

大O的渐进表示法:O(1)

注意:O(1) 并不是代表代码只执行了 1 次,而是代表代码执行了常数次


例题4:

代码演示:

const char* Find_Str_Element(const char* str, int character)
{
	while (*str != '\0')
	{
		if (*str == character)
			return str;
		else
			str++;
	}

    return NULL;
}

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

代码解析:

例题4 代码的意思是:在 str 字符串中找出和 character 相同的元素,如果找到了就返回 character 位置的指针,如果 str 字符串遍历完了都没有找到就返回 NULL

但是 例题4 代码的运行次数并不是像 例题1、2 一样,固定执行 N 次 或者 N + M 次,而是要分情况看待:

最好情况:character 元素是 str 字符串首元素,程序执行 1 次 

中间情况:character 元素是 str 字符串中间元素,程序执行 N/2 次

最坏情况:character 元素是 str 字符串尾元素 或者 str 中没有 character ,程序执行 N 次

注意:在实际中一般情况关注的是算法的最坏运行情况(底线思维,做最坏的打算)

所以 str 字符串查找 character 元素的时间复杂度为:O(N)


http://www.kler.cn/news/312360.html

相关文章:

  • 使用Spring Boot和Spring WebFlux实现响应式打字效果
  • 使用 Python 高分解决 reCAPTCHA v3 的指南
  • orangepi部署web环境
  • 基于SpringBoot的考研资讯平台设计与实现
  • 李宏毅2022深度学习作业代码记录(hw1)—— COVID19
  • 进程状态的优先级
  • k8s-API 访问控制
  • rocky Linux 9.4系统配置zabbix监控MySQL主从复制状态与配置钉钉告警
  • 从0开始学ARM
  • 通过shell脚本一键修改Linux主机名和IP地址脚本
  • Linux:Bash中的文件描述符
  • vs code 搜索 jar 中的类
  • JAVA同城生活新引擎外卖跑腿团购到店服务多合一高效系统小程序源码
  • QT打开摄像头采集
  • Unity 高亮插件Highlight Plus快速入门
  • linux下的分布式Minio部署实践
  • redis集群模式连接
  • 探索AutoIt:自动化任务的Python魔法棒!
  • Spring Boot- 数据库相关问题
  • docker部署个人网页导航
  • 影视会员充值api?接口对接需要做哪些准备工作?
  • SAP B1 流程实操 - 营销单据销售部分(下)
  • 电脑视频编辑常用软件:12个在线视频剪辑方法,这份免费攻略真实在!
  • LabVIEW机械产品几何精度质检系统
  • 金属3D打印经济效益高吗?
  • 分布式事务一致性:本地消息表设计与实践
  • Jenkins自动化部署后端项目看这篇就够了
  • ubuntu安装emqx
  • Vue(13)——router-link
  • MATLAB基本语句