数据结构入门篇:第一篇

news2024/12/24 21:01:24

数据结构入门篇:第一篇

时间复杂度

  • 数据结构入门篇:第一篇
    • 1.时间复杂度
    • 2.时间复杂度的练习
    • 总结

🤔首先,为什么要学数据结构?

数据结构的概念:在内存中对数据进行管理;
数据结构的学习能让我们在处理大量数据时提高处理效率,即让我们在不同的场景下更快的处理大量数据;
在这里插入图片描述

🤔算法和数据结构有什么关系?

算法就是处理数据的一种方法;
数据结构是为算法服务的,算法作用在特定的数据结构之上,而衡量数据结构和算法好坏的标准就是复杂度,即时间复杂度和空间复杂度;


1.时间复杂度

🤔什么是时间复杂度?

时间复杂度是衡量算法的快慢;

🤔🤔那么我们能不能把算法放到电脑上跑一跑,记录一下时间?

在这里插入图片描述
在这里插入图片描述

这样比较是很难比较出来算法的好坏,但又因为一个算法的语句执行次数与它所花费的时间成正比,所以我们把语句大概执行次数作为衡量一个算法的时间复杂度


👉算法时间复杂度的定义👈

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。


// 请计算一下Func1中++count语句总共执行了多少次?
void Func1(int N)
{
	int count = 0;
	for (int i = 0; i < N ; ++ i)
	{
 		for (int j = 0; j < N ; ++ j)
 		{
		 	++count;
 		}
	}

	for (int k = 0; k < 2 * N ; ++ k)
	{
		    ++count;
	}
	int M = 10;
	while (M--)
	{
 		    ++count;
	}
	printf("%d\n", count);
}

这里很容易算出这个数学表达式:F(N)=N2 +2*N+10;
Func1 执行的基本操作次数 :

  • N = 10 ——F(N) = 130
  • N = 100 ——F(N) = 10210
  • N = 1000 ——F(N) = 1002010

实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法

在这里插入图片描述

🤔🤔🤔什么是大O的渐进表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号;

大O的渐进表示法的规则:

  1. 如果一个算法的语句执行的次数是一个常数,那么可以表示为O(1);
  2. 如果一个算法的语句执行次数是一个高阶函数,那么只保留最高阶项;
  3. 如果最高阶项存在且不是1,则去除这个项的系数。得到的结果就是大O阶。
  4. 如果一个算法有最好,最坏,平均三种情况,那么取最坏的情况

总的来说就是要忽略对结果影响不是很大的项。
请添加图片描述


2.时间复杂度的练习

problem one:

void Func2(int N)
{
 	int count = 0;
 	for (int k = 0; k < 2 * N ; ++ k)
 	{
 		++count;
 	}
 	int M = 10;
 	while (M--)
 	{
	 	++count;
 	}
 	printf("%d\n", count);
}
  • 数学表达式:2*N+10
  • 时间复杂度(大O的渐进表示法):O(N)

problem two:

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);
}
  • 数学表达式:M+N
  • 时间复杂度(大O的渐进表示法):O(M+N),这里M和N并没确定关系,所以是M+N;

problem three:

void Func4(int N)
{
 	int count = 0;
 	for (int k = 0; k < 100; ++ k)
 	{
 		++count;
 	}
	printf("%d\n", count);
}
  • 数学表达式:100
  • 时间复杂度(大O的渐进表示法):O(1)

problem four:

void Swap(int* p,int* q)
{
	int tmp=*p;
	*p=*q;
	*q=tmp;
}
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-1
    最坏情况:逆序,(N*(N-1))/2
  • 时间复杂度:取最坏情况,O(N2);

problem five:

int BinarySearch(int* a, int target, int x)
{
 	assert(a);
 	int left = 0;
 	int right = target-1;
 	// [begin, end]:begin和end是左闭右闭区间,因此有=号
 	while (left <= right)
 	{
 		int mid = (left + right)/2;
 		if (a[mid] < x)
 			left = mid+1;
 		else if (a[mid] > x)
 			right = mid-1;
 		else
 			return mid;
 	}
 	return -1;
}

以上是二分查找的代码;

在这里插入图片描述

  • 数学表达式:
    最好的情况下,在中间找到,即1
    最坏的情况是一直找找到只剩一个数,即N/2/2/2/2/2/…/2=1;

  • 时间复杂度运算过程:设x为大概的执行次数,即2x=N,那么解出x=logN,即时间复杂度是O(logN),:logN在算法分析中表示是底数为2,对数为N。


problem six:

long long Fac(size_t N)
{
 	if(0 == N)
 		return 1;
 	return Fac(N-1)*N;
}

在这里插入图片描述

  • 数学表达式:N+1
  • 时间复杂度:O(N)

problem seven:

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

 	return Fib(N-1) + Fib(N-2);
}

在这里插入图片描述

  • 数学表达式:2n-1-x
  • 时间复杂度:O(2N)

总结

以上就是本篇的所有内容了,今天主要学习了时间复杂度的计算,如果喜欢本篇不妨留个❤️;
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/448487.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#生成单色bmp图片,转为单色bmp图片 任意语言完全用字节拼一张单色图,LCD取模 其它格式图片转为单色图

最终效果&#xff1a; V1.8.2 20230419 文字生成单色BMP图片4.exe 默认1280*720 如果显示不全&#xff0c;请把宽和高加大 字体加大。 首先&#xff0c;用windows画板生成一张1*1白色单色图作为标准&#xff0c;数据如下&#xff1a; 数据解析参考&#xff1a;BMP图像文件完…

【K8S系列】深入解析StatefulSet(二)

序言 那些看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持的意义。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 Kubernetes (k8s) 是一个容器编排平…

用梯度下降的方式来拟合曲线

文章目录 1. 简述2. 理论原理以二次函数为例整体的梯度下降步骤&#xff1a; 3. 编码实现初始化权重矩阵计算损失和梯度更新权重 4. 结果首先对上一篇文章中的真实数据拟合。测试拟合高次曲线方程数据是2阶的&#xff0c;拟合方程是2阶的数据是4阶的&#xff0c;拟合方程也是4阶…

3年自动化测试(心路历程),从月薪10k到30k我经历了什么?

前言 2018年的时候&#xff0c;由于项目的原因&#xff0c;开始使用Robot Framework测试框架&#xff0c;正因为有Python的基础所以很快就理解了Robot Framework框架的工作原理&#xff0c;并可以根据项目的需要开发系统关键字。2019年随着移动App越来越流行&#xff0c;乘着换…

HTML5超链接和图片基础用法

一、HTML5 超链接&#xff08;链接&#xff09; 超链接可以是一个文本&#xff0c;也可以是一幅图像&#xff0c;您可以点击这些内容来跳转到新的页面或新的文档或者当前文档中的某个部分。 当您把鼠标指针移动到网页中的某个链接上时&#xff0c;箭头会变为一只小手。 1.我…

MATLAB | MATLAB配色不够用,近2000款配色来啦

MATLAB绘图配色不够多&#xff1f;很多python\R语言绘图包都会带着好几套配色方案&#xff0c;比如很常见的ggsci绘图包就自带45套离散配色&#xff0c;于是本工具收集了常见55个绘图包中的离散配色&#xff0c;制作出了这个包含了1967套配色的离散配色包slanCL。 基本使用 以…

机器学习(二):线性回归之梯度下降法

文章目录 专栏导读1、梯度下降法原理2、梯度下降法原理代码实现3、sklearn内置模块实现专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。 ✍ 本文录入于《机器学习案例》,本专栏精选了经典的机器学习算法进行讲解,针对大学生、初级数据分…

CleanMyMac4.13最新免费mac电脑系统优化软件

CleanMyMac免费mac下载版是一款简单实用的PC清洁管理工具&#xff0c;电脑刚装完系统的时候运行速度超级快&#xff0c;随着时间的推移&#xff0c;你会发现越来越慢&#xff0c;经常会反应卡顿&#xff0c;越来越多的垃圾文件占用了你的磁盘空间&#xff0c;各种过时的日志&am…

数组题目总结 -- 前缀和数组

目录 一. 区域和检索 - 数组不可变1. 思路和代码I. 博主的做法&#xff1a;II. 东哥的做法&#xff1a; 2. 总结 二. 二维区域和检索 - 矩阵不可变1. 思路和代码I. 博主的做法&#xff1a;II. 东哥的做法&#xff1a; 2. 总结 一. 区域和检索 - 数组不可变 题目链接&#xff1…

【方法一:二分+字符串哈希 优化】【dp——取不取问题-背包】最长公共子串【上海交通大学考研机试题】

最长公共子串 二分方法字符串哈希的复习字符串哈希 如何理解 二分代码 dp方法字符串str1中以第i个字符为结尾的子串 与字符串str2中以第i个字符为结尾的子串的连续公共子串 二维一维优化 二分方法 由于这个题是要求求子串&#xff0c;而子串是连续的一段&#xff0c;所以用二分…

在微信小程序中怎么使用vant框架?

目录标题 首先介绍什么是vant一、第一步&#xff0c;打开我们小程序项目目录&#xff0c;找到所在的位置&#xff0c;打开终端二、对项目进行初始化三、进行安装依赖1、通过npm安装vant/weapp2、安装miniprogram 四、修改app.json五、修改project.config.json六、然后构建npm 需…

使用Word的一些技巧记录

本文主要用于记录书写毕业论文时&#xff0c;遇到的Word的使用技巧。 设置样式及多级列表 每个学校必然会对论文中的字体、字号、行间距提出要求&#xff0c;设置Word中样式解决此问题。 例如&#xff0c;本校的格式要求为&#xff1a; 正文中的一级标题&#xff08;章目&a…

【C#】GridControl动态更换DataSource,查询数据异常处理

系列文章 【C#】单号生成器&#xff08;编号规则、固定字符、流水号、产生业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…

适应大、中、小型医院的手术麻醉临床信息管理系统源码

手术麻醉管理系统是一款专门用于医院手术麻醉管理的软件系统&#xff0c;它可以帮助医院和医生更好地管理手术麻醉过程&#xff0c;提高手术麻醉的质量和安全性。本文将介绍手术麻醉管理系统的实现、功能概述、主要功能、系统设置、麻醉管理、术中记录、苏醒室记录、PCA实施及管…

【微服务笔记20】微服务组件之Nacos配置中心基础环境搭建、配置持久化、动态刷新配置

这篇文章&#xff0c;主要介绍微服务组件之Nacos配置中心基础环境搭建、配置持久化、动态刷新配置。 目录 一、搭建Nacos配置中心环境 1.1、Nacos配置中心介绍 1.2、搭建Nacos配置中心客户端 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;添加配置信息 &…

图书管理系统的开发与设计(论文+源码)_kaic

摘 要 随着科学技术的快速发展&#xff0c;尤其是计算机技术的突飞猛进&#xff0c;计算机技术普及到日常生活、学习生活的方方面面。由此想到学校的相对于传统的图书管理系统&#xff0c;帮助到学校的读者和学校的图书管理员的系统。提升图书管工作人员的效率&#xff0c;满足…

【C++类和对象】类和对象(中):构造函数 {六个默认成员函数;构造函数的概念及特性;编译器自动生成的构造函数;默认构造函数}

一、类的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器…

Pytorch深度学习笔记(六)用pytorch实现线性回归

目录 1.数据准备 2.设计模型 3.构造损失函数和优化器 4.训练周期&#xff08;前馈—>反馈—>更新&#xff09; 课程推荐&#xff1a;05.用PyTorch实现线性回归_哔哩哔哩_bilibili 线性通常是指变量之间保持等比例的关系&#xff0c;从图形上来看&#xff0c;变量之间…

为什么要学习微服务?

文章目录 1.认识微服务1.1微服务由来1.2为什么需要微服务&#xff1f; 2.两种架构2.1.单体架构2.2.分布式架构 3.微服务的特点4.SpringCloud5.总结最后说一句 1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为…

类和对象(上篇)

类和对象----上篇 &#x1f506;面向过程和面向对象的初步认识&#x1f506;类的引入&#x1f506;类的定义&#x1f506;类的访问限定符及封装访问限定符封装 &#x1f506;类的作用域&#x1f506;类的实例化&#x1f506;类的对象大小的计算如何计算一个类的大小结构体内存对…