首页 > 其他分享 >数据结构 ——— 常见的时间复杂度计算例题(上篇)

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

时间:2024-09-20 20:20:23浏览次数:8  
标签:数据结构 int 复杂度 character 表示法 str 例题

目录

前言

例题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)

标签:数据结构,int,复杂度,character,表示法,str,例题
From: https://blog.csdn.net/weixin_55341642/article/details/142392586

相关文章

  • en造数据结构与算法C# 用Unity实现简单的群组行为算法 之 对齐
    en造数据结构与算法C#用Unity实现简单的群组行为算法之聚集-CSDN博客en造数据结构与算法C#用Unity实现简单的群组行为算法之聚集-CSDN博客演示思路1.检测自然是沿用前两节的检测范围2.对齐朝向对齐朝向就是邻居鸟的forward加起来再除总数得到平均数3.对齐速度......
  • en造数据结构与算法C# 群组行为优化 和 头鸟控制
    实现:1.给鸟类随机播放随机动画使得每一只鸟扇翅膀的频率都不尽相同2.可以自行添加权重,并在最后 sumForce=separationForce+cohesionForce+alignmentForce;分别乘上相应权重,这样鸟就能快速飞行和转向辣usingSystem.Collections.Generic;usingUnityEngine;usingS......
  • 【学习笔记】数据结构(六 ①)
    树和二叉树(一)文章目录树和二叉树(一)6.1树(Tree)的定义和基本术语6.2二叉树6.2.1二叉树的定义1、斜树2、满二叉树3、完全二叉树4、二叉排序树5、平衡二叉树(AVL树)6、红黑树6.2.2二叉树的性质6.2.3二叉树的存储结构6.3遍历二叉树和线索二叉树6.3.1遍历二叉树......
  • Python中的树与图:构建复杂数据结构的艺术
    引言随着大数据时代的到来,我们面临的数据不再是简单的线性关系,而是错综复杂的网状结构。树和图正是用于表示这类复杂关系的最佳工具。树是一种特殊的图,它具有层次结构;而图则更加灵活,能够表达任意节点之间的连接关系。掌握树与图的实现方法,不仅有助于提高算法设计能力,还能为......
  • 基于Java中的SSM框架实现数据结构课堂考勤管理平台项目【项目源码+论文说明】
    基于java中的SSM框架实现数据结构课堂考勤管理平台演示【内附项目源码+LW说明】摘要高校的不断扩张让在校学生数量不断的增加,对于教师和管理人员的需求也在不断地增强,对日常的学生考勤管理的工作量也在日益增加,传统的人工点名签到的考勤管理模式已经给无法适用于当前高校......
  • 集合框架底层使用了什么数据结构
    1.是什么        集合框架(CollectionFramework)是Java标准库的一部分,它提供了一系列接口和实现类,用于处理不同类型的集合。这些集合可以用于存储和操作对象,如列表、集合、映射等。集合框架的底层数据结构是多种多样的,具体取决于集合实现类的选择。1.List(列表)Array......
  • 【数据结构】图的概念和存储结构
    快乐的流畅:个人主页个人专栏:《C游记》《进击的C++》《Linux迷航》远方有一堆篝火,在为久候之人燃烧!文章目录引言一、图的概念二、图的存储结构2.1邻接矩阵2.1.1成员变量与默认成员函数2.1.2GetIndex2.1.3AddEdge2.1.4Print2.2邻接表2.2.1结点2.......
  • Pandas中DataFrame表格型数据结构
    目录1、DataFrame是什么2、创建一个dataframe3、获取dataframe的行、列索引4、获取dataframe的值1、DataFrame是什么series是有一组数据与一组索引(行索引)组成的数据结构,而dataframe是由一组数据与一对索引(行索引和列索引)组成的表格型数据结构。之所以叫表格型数据结......
  • 栈与队列:数据结构中的“双子星”【详解】
    栈和队列(Stack&Queue)栈(Stack)栈的定义及结构1.什么是栈?栈是一种线性数据结构,具有后进先出的特性LIFO(LastInFirstOut),指其只允许在固定的一端进行插入和删除元素的操作。进行数据插入和删除的一端称为“栈顶”,另一端称为“栈底”。栈内无元素时称为空栈,元素的插入......
  • Redis数据结构跳跃列表(skipList)与压缩列表(ziplist)
    skiplist介绍跳表是一种数据结构,它使得包含了n个元素的有序序列的查找和插入的平均时间复杂度都是O(logn),优于数组的O(n)复杂度,快速的查找是通过维护多层次的链表实现的,且与前一层(下面一层)链表的数量相比,每一层的链表元素数量更少简单来讲跳表就是基于链表实现的有序列表,通过维......