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

【数据结构】初识数据结构与复杂度总结

前言

C语言这块算是总结完了,那从本篇开始就是步入一个新的大章——数据结构,这篇我们先来认识一下数据结构有关知识,以及复杂度的相关知识

个人主页:小张同学zkf

若有问题 评论区见

感兴趣就关注一下吧

目录

 1.什么是数据结构

 2.什么是算法?

3.算法的复杂度

3.1时间复杂度

 3.2三种情况

3.3空间复杂度


 1.什么是数据结构

数据结构是计算机存储,组织数据的方式,指的是相互之间存在一种或多种特定关系的数据元素的集合


 2.什么是算法?

数据结构离不开算法,那算法是什么东西那,简单来说是一个定义好的计算过程。就是取一个或一组值输入,并产生出一个或一组值作为输出,当中产生的的计算步骤,用来将输入数据转化成输出结果


3.算法的复杂度

算法在编写成可执行程序后,运行时需要耗费时间资源和空间资源,因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度空间复杂度

时间复杂度主要衡量一个算法的快慢,而空间复杂度主要衡量一个算法运行的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎,但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度,所以我们如今已经不需要在特别关注一个算法的空间复杂度。

3.1时间复杂度

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数(注:这里的函数是数学上的函数,不是c语言的函数!!!),它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序跑起来,才能知道,但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方法。一个算法所花费的的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度

即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。 

//请计算一下Func1中++count语句总共执行了多少次?
void Funcl(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);
}

 上面的时间复杂度是多少

我们用数学函数来表示,来看第一个函数,两个for循环,那执行次数是不是就是N的平方次,再看第二个函数执行2N次,最后一个函数执行10次

那就是F(N)=N^2+2*N+10

               精算值                      估算值

N=10      F(N)=130                   100

N=100    F(N)=10210               10000

N=1000  F(N)=1002010           1000000

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

那么要求大概值,哪个表达式对次数影响最大呢,是不是N^2 最大,我么可以这样想一下,如果N越来越大,后面俩表达式2*N和10是不是对时间复杂度影响越来越小,我们取极限,那后面俩就没影响,只有N^2对次数影响特别大,所以只保留这一项,我们也可以从这里看出来,若为多项式,我们只取次数高的那一项

那么这个函数的时间复杂度为O(N^2)     这也就是大O的渐进表示法

那我们再来看一个例子,巩固一下

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

 我们还是先用函数表示  F(N)=N+M

这下就有疑问了,那这个用大O怎么表示

我们可以看一下,这里没有明确说明N远大于M还是M远大于N,都没有明确说明,那就是对执行次数影响是同等的,谁都不能舍去,所以结果为O(N)=N+M

我们再来看一个

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

这个时间复杂度又是多少呢

我们乍一看这次执行次数可以直接看出来,一共执行了100次 

那大O怎么表示那,其实在大O里常数全部用1来表示,所以结果为O(N)=1

一定要注意这里,这里的结果1不是执行了一次,而是代表常数次,就是我们可以看出来的次数,执行次数不是未知数的话,那运行时间就是固定的,所以它们的时间复杂度都是O(N)=1!!!!!!!

 综上,我们可得出推导大O的方法

1.用常数1取代运行时间中的所有加法常数

2.在修改后的运行次数函数中,只保留最高阶项,如果最高阶项存在且不是1,则去除与这个项目相乘的常数(也就是把系数去掉)

3.O(1)不是代表1次,是代表常数次

 3.2三种情况

有些算法的时间复杂度存在最好、平均最坏情况:
最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)

例如:在一个长度为N数组中搜索一个数据x
最好情况:1次找到
最坏情况:N次找到
平均情况:N/2次找到
在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)

我们来看一下这个函数,是不是有点眼熟,没错我们之前总结过的冒泡排序,那它的时间复杂度该怎么求那,我们要求它的最坏情况,我们先想一想,冒泡排序是怎么排序的,是不是第一个数先进行挨个比较,然后是第二个数字,以此类推,那我们第一个数字是不是要比较N-1次,第二个数字就是N-2次……直到最后比较一次,那把这些都加起来是不是就是我们的时间复杂度了,那就是求等差数列的和,函数为N*(N-1)/2,大O表示法取最高项结果为O(N^2)

我们继续看一个

这个是不是也是有点眼熟,对我之前总结的猜数字游戏里的二分查找,那它的时间复杂度是多少那,我们先来想一想这个函数怎么实现的,是每次查找缩小一半范围,相当于除2,查找一次除一次2,那N次就是除N个2,那时间复杂度不就是除2的次数嘛,那不就是log2N嘛,用大O表示就是O(N)=log2N

我们再来看一个

还记得这个吧,没错这个也是我之前总结的递归问题中的青蛙跳台阶——斐波那契数列,这个时间复杂度又是什么那

我们看一下这个函数,是不是递归一次执行一次,但它一个函数内递归了两次,那它接下来是不是像树状线一样,一个函数分两个函数,如图所示,我们来找一下规律,是不是从2^0到2^(n-2)

那把这些都加起来,就是时间复杂度了

我们可以根据错位相减法得到2^(n-1)-1,用大O表示就是O(N)=2^N 

3.3空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时额外占用存储空间大小的量度。
空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。
注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定


 

 

 这个空间复杂度是多少

我们来看一下,这个函数开辟了一个数组空间,以及一些变量的空间,都是常数个,所以用大O表示是O(N)=1

继续看一个

这个空间复杂度是多少

这里函数运行时额外开了一个n+1的空间,这个空间就是它的空间复杂度用大O表示就是O(N)

再看一个递归

这个空间复杂度是多少

它运行时创立了N个函数栈帧,所以它的结果为O(N)

我们来看一个复杂点的

这个时间复杂度我们知道了是O(2^N)空间复杂度那

这个我们要好好想想,递归函数在创建函数栈帧的特点,第一列的函数栈帧创建完,调用完再销毁,后几列的函数递归再用第一列的曾经函数栈帧所用的空间,不会额外再开辟新的函数栈帧,简单来说就是第一列函数递归的深度就是它的空间复杂度,后面的函数递归,在第一列函数栈帧用完销毁的空间基础上,再重复利用这个空间进行第二次函数递归

我们要记住一点:空间可以重复利用!!!! ,不用累计计算

所以这个空间复杂度就是第一列函数递归开辟的空间,用大O表示O(N)


结束语

这篇博客我们对数据结构有了基础的认识,通过这篇博客,我们以后写代码要考虑这个算法的效率问题,尽量保证时间复杂度消耗低,空间复杂度空间不浪费,时间第一,空间其次的想法,研究出效率高的算法。

OK感谢观看!!!!!

相关文章:

【数据结构】初识数据结构与复杂度总结

前言 C语言这块算是总结完了&#xff0c;那从本篇开始就是步入一个新的大章——数据结构&#xff0c;这篇我们先来认识一下数据结构有关知识&#xff0c;以及复杂度的相关知识 个人主页&#xff1a;小张同学zkf 若有问题 评论区见 感兴趣就关注一下吧 目录 1.什么是数据结构 2.…...

子域名是什么?有什么作用?

在互联网世界中&#xff0c;域名是我们访问网站的关键。每一个公司的网站都需要拥有自己的域名&#xff0c;其中有些大型公司的网站还不止一个域名&#xff0c;除了主域名外还拥有子域名。有些人感到非常困惑&#xff0c;不知道子域名是什么。其实子域名也就是平时所说的二级域…...

学习 Rust 的第一天:基础知识

如果你对 Rust 一无所知&#xff0c;那我来解释一下。 “Rust 是一种系统编程语言&#xff0c;其优先考虑性能、内存安全和零成本抽象。” 你好&#xff0c;世界 我之前研究过 Rust&#xff0c;并且对 Java、C、C 和 Python 的基本编程概念有相当了解。 今天&#xff0c;我…...

电商技术揭秘七:搜索引擎中的SEO关键词策略与内容优化技术

文章目录 引言一、关键词策略1.1 关键词研究与选择1. 确定目标受众2. 使用关键词研究工具3. 分析搜索量和竞争程度4. 考虑长尾关键词5. 关键词的商业意图6. 创建关键词列表7. 持续监控和调整 1.2 关键词布局与密度1. 关键词自然分布2. 标题标签的使用3. 首次段落的重要性4. 关键…...

系统开发实训小组作业week7 —— 优化系统开发计划

目录 1. 建立规则&#xff0c;仪式&#xff0c;流程&#xff0c;模式 2. 给好行为正面的反馈 3. 明确指出不合适的行为&#xff0c;必要时调整人员 在 “系统开发实训课程” 中&#xff0c;我们小组的项目是 “电影院会员管理系统” 。在项目的开发过程中&#xff0c;我们遇…...

golang的引用和非引用总结

目录 概述 一、基本概念 指针类型&#xff08;Pointer type&#xff09; 非引用类型&#xff08;值类型&#xff09; 引用类型&#xff08;Reference Types&#xff09; 解引用&#xff08;dereference&#xff09; 二、引用类型和非引用类型的区别 三、golang数据类型…...

2024认证杯数学建模B题思路模型代码

目录 2024认证杯数学建模B题思路模型代码:4.11开赛后第一时间更新&#xff0c;获取见文末名片 第十三届“认证杯”数学中国数学建模比赛赛后体会 2024认证杯数学建模B题思路模型代码:4.11开赛后第一时间更新&#xff0c;获取见文末名片 第十三届“认证杯”数学中国数学建模比…...

一种快速移植 OpenHarmony Linux 内核的方法

移植概述 本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开发者&#xff0c;介绍一种借助三方芯片平台自带 Linux 内核的现有能力&#xff0c;快速移植 OpenHarmony 到三方芯片平台的方法。 移植到三方芯片平台的整体思路 内核态层和用户态层 为了更好的解释整个内核…...

java的jar包jakarta.jakartaee-web-api和jakarta.servlet-api有什么区别

jakarta.jakartaee-web-api和jakarta.servlet-api都是Java EE&#xff08;现在是 Jakarta EE&#xff09;中的一部分&#xff0c;用于开发基于Java EE平台的Web应用程序。它们之间的区别在于以下几点&#xff1a; 命名空间&#xff1a; jakarta.servlet-api是Java EE 8之前版本…...

QT_day2

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为…...

Advanced RAG 02:揭开 PDF 文档解析的神秘面纱

编者按&#xff1a; 自 2023 年以来&#xff0c;RAG 已成为基于 LLM 的人工智能系统中应用最为广泛的架构之一。由于诸多产品的关键功能&#xff08;如&#xff1a;领域智能问答、知识库构建等&#xff09;严重依赖RAG&#xff0c;优化其性能、提高检索效率和准确性迫在眉睫&am…...

Spring面试题pro版-1

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而&#xff0c;Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言&#xff0c;绝大部分Java应用都可以从Spring中受益。 Spring是什么…...

6 Reverse Linked List

分数 20 作者 陈越 单位 浙江大学 Write a nonrecursive procedure to reverse a singly linked list in O(N) time using constant extra space. Format of functions: List Reverse( List L ); where List is defined as the following: typedef struct Node *PtrToNo…...

【随笔】Git 高级篇 -- 相对引用2 HEAD~n(十三)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…...

2024免费Mac电脑用户的系统清理和优化软件CleanMyMac

作为产品营销专家&#xff0c;对于各类产品的特性与优势有着深入的了解。CleanMyMac是一款针对Mac电脑用户的系统清理和优化软件&#xff0c;旨在帮助用户轻松管理、优化和保护Mac电脑。以下是关于CleanMyMac的详细介绍&#xff1a; CleanMyMac X2024全新版下载如下: https://…...

Centos7源码方式安装Elasticsearch 7.10.2单机版

版本选择参考&#xff1a;Elasticsearch如何选择版本-CSDN博客 下载 任选一种方式下载 官网7.10.2版本下载地址&#xff1a; https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-linux-x86_64.tar.gz 网盘下载链接 链接&#xff1a;https://pan…...

mysql的安装和部署

##官网下载mysql 我下载的是一个mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz 可以通过xshell 或者xftp传送 xshell则是先下载一个lrzsz 执行以下的命令 yum install lrzsz -y #安装好我下面有个一键安装的脚本 #!/bin/bash#解决软件的依赖关系 yum install cmake ncurses…...

大数据基本名词

目录[-] 1.1. 1. Hadoop1.2. 2. Hive1.3. 3. Impala1.4. 4. Hbase1.5. 5.hadoop hive impala hbase关系1.6. 6. Spark1.7. 7. Flink1.8. 8. Spark 和 Flink 的应用场景 1. Hadoop 开源官网&#xff1a;https://hadoop.apache.org/ Hadoop是一个由Apache基金会所开发的分…...

网站网页客服、微信公众号客服、H5客服、开源源码与高效部署的完美结合

随着互联网技术的飞速发展&#xff0c;企业与客户之间的沟通方式也在持续变革。在线客服系统作为一种新兴的沟通工具&#xff0c;已经成为提升企业服务质量、增强客户满意度的重要手段。本文将详细介绍在线客服系统的优势、功能以及如何高效部署&#xff0c;特别是推荐一款名为…...

1、Qt UI控件 -- qucsdk

前言&#xff1a;Qt编写的自定义控件插件的sdk集合&#xff0c;包括了各个操作系统的动态库文件以及控件的头文件和sdk使用demo。类似于Wpf中的LivChart2控件库&#xff0c;都是一些编译好的控件&#xff0c;可以直接集成到项目中。该控件是飞扬青云大神多年前开发的&#xff0…...

Sora是什么?Sora怎么使用?Sora最新案例视频以及常见问题答疑

Sora 是什么&#xff1f; 2024年2月16日&#xff0c;OpenAI 在其官网上面正式宣布推出文本生成视频的大模型Sora 这样说吧给你一段话&#xff0c; 让你写一篇800字的论文&#xff0c;你的理解很可能都有偏差&#xff0c;那么作为OpenAi要做文生视频到底有多难&#xff0c;下面…...

如何在Ubuntu系统使用docker部署DbGate容器并发布至公网可访问

文章目录 1. 安装Docker2. 使用Docker拉取DbGate镜像3. 创建并启动DbGate容器4. 本地连接测试5. 公网远程访问本地DbGate容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 本文主要介绍如何在Linux Ubuntu系统中使用Docker部署DbGate数据库管理工…...

解决 VSCode 编辑器点击【在集成终端中打开】出现新的弹框

1、问题描述 在 VSCode 的项目下&#xff0c;鼠标右键&#xff0c;点击【在集成终端中打开】&#xff0c;出现新的一个弹框。新版的 VSCode 会有这个问题&#xff0c;一般来说我们都希望终端是在 VSCode 的控制台中打开的&#xff0c;那么如何关闭这个弹框呢&#xff1f; 2、解…...

从零开始:构建、打包并上传个人前端组件库至私有npm仓库的完整指南

文章目录 一、写组件1、注册全局组件方法2、组件13、组件2 二、测试三、发布1、配置package.json2、生成库包3、配置发布信息4、发布 四、使用1、安装2、使用 五、维护1、维护和更新2、注意事项 一、写组件 确定组件库的需求和功能&#xff1a;在开始构建组件库之前&#xff0c…...

Ant Design Vue 表单验证手机号的正则

代码&#xff1a; pattern: /^1[3456789]\d{9}$/ 1. <a-form-item label"原手机号" v-bind"validateInfos.contactTel"><a-inputstyle"width: 600px"allow-clear:maxlength"20"placeholder"请输入原手机号"v-mo…...

[dvwa] CSRF

CSRF 0x01 low 跨站&#xff0c;输入密码和确认密码直接写在url中&#xff0c;将连接分享给目标&#xff0c;点击后修改密码 社工方式让目标点击短链接 伪造404页&#xff0c;在图片中写路径为payload&#xff0c;目标载入网页自动请求构造链接&#xff0c;目标被攻击 http…...

只为兴趣,2024年你该学什么编程?

讲动人的故事,写懂人的代码 当你想学编程但不是特别关心找工作的时候,选哪种语言学完全取决于你自己的目标、兴趣和能找到的学习资料。一个很重要的点,别只学一种语言啊!毕竟,"门门都懂,样样皆通",每种编程语言都有自己的优点和适合的用途,多学几种可以让你的…...

HAL STM32 定时器PWM DMA输出方式

HAL STM32 定时器PWM DMA输出方式 &#x1f9e8;遗留问题&#xff1a;当配置RCR重复计数器&#xff0c;配置为2时&#xff0c;在定义了3组PWM参数情况下&#xff0c;只能输出第二组参数的PWM波形。&#xff08;HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, aCCValue_Buff…...

博客部署004-centos安装mysql及redis

1、如何查看当前centos版本&#xff1f; cat /etc/os-release 2、安装mysql 我的是centos8版本&#xff0c;使用dnf命令 2.1 CentOS 7/8: sudo yum install -y mysql-community-server 或者在CentOS 8上&#xff0c;使用DNF:&#x1f31f; sudo dnf install -y mysql-ser…...

Hive 之 UDF 运用(包会的)

文章目录 UDF 是什么&#xff1f;reflect静态方法调用实例方法调用 自定义 UDF&#xff08;GenericUDF&#xff09;1.创建项目2.创建类继承 UDF3.数据类型判断4.编写业务逻辑5.定义函数描述信息6.打包与上传7.注册 UDF 函数并测试返回复杂的数据类型 UDF 是什么&#xff1f; H…...