数据结构——复杂度讲解

数据结构——复杂度讲解

已经太久没用更新了,由于各种原因,导致很久没用更新了,但是停更期间我也是一直在很努力的学习与复习之前学过的知识,读了两本C语言的数据,初学者也是可以看的,推荐给大家,如果需要pdf,可以私信我

第一本:《C陷阱与缺陷》

第二本:《C语言深度剖析》

回归正题,今天开始正式学习数据结构,我将带领大家由浅入深的学习,不用害怕,因为我会把我认为比较难懂的知识学习好几遍,然后再给大家写出来。今天所讲的算法复杂度难度还好,不是很难,大家放心,不用担心学不会。

正式开始学习:

目录

1、算法复杂度

2、如何学好数据结构

3、算法效率

3.1、什么是算法效率?

3.2、复杂度的计算

4、时间复杂度

4.1、大O的渐进表示法

4.2时间复杂度计算示例

4.2.1、示例1:

4.2.2、示例2:

4.2.3、示例3:

4.2.4、示例4:

4.2.5、示例5:

4.2.6、示例6:

4.2.7、示例7:

5、空间复杂度

5.1 空间复杂度计算⽰例

5.1.1 ⽰例1

5.1.2 ⽰例2

6、常⻅复杂度对⽐

7、复杂度算法题

7.1 旋转数组

思路1

思路2

思路3


1、算法复杂度

数据结构与算法介绍:

数据结构:数据结构的内存中存储数据的格式,指的是相互之间存在一种或多种特定关系的数据元素集合与数据元素之间的集合,一种数据结构不会适用于全部的用途,所以我们要学习数据结构,数据结构包括:数组、链表、线性表、哈希值等等。

算法:算法是指数据输入与输出时,在底层中是如何实现,有的算法对于程序运行快,有的慢,但实现的功能都是一样的。

总结:数据结构管理在内存中是如何放置的,算法是如何在内存中计算的

数据结构与算法的概念是不是特别的简单,所以大家不要听到数据结构这门课的名字就害怕自己学不会,我们把这些拗口的语言给打回原形,让它们看起来也没用这么高大尚。

2、如何学好数据结构

有小伙伴问了,我们应该如何学习数据结构呢,我这里给出两点的建议:

秘诀1:死磕代码!!!

秘诀2:画图画图画图+思考!!!

3、算法效率

3.1、什么是算法效率?

算法效率就是我们所写的代码运行的速度快慢,比如:有两个人一起学习,学习的时间地点都是一样的,第一个人学的很快,第二个人学的很慢,很明显,第一个人学习效率高,第二个人学习效率低,这就是因为学习方法不一样导致的,虽然这两个人都可以学会相同的知识。

我们所写的代码也是如此,两个人写同一道算法题目时候,一个人写的代码运行效率快,一个人写的代码运行效率慢,但是最终实现的结构都是相同的。

如何衡量⼀个算法的好坏呢?

案例:旋转数组https://leetcode.cn/problems/rotate-array/description/

思路:循环K次将数组所有元素向后移动⼀位

void rotate(int* nums, int numsSize, int k) { while (k--) { int end = nums[numsSize - 1]; for (int i = numsSize - 1; i > 0; i--) { nums[i] = nums[i - 1]; } nums[0] = end; } } 

在我们刚学完C语言的同学们,肯定第一时间想到的是使用两个for循环进行嵌套到达交换,我也是第一时间想到的是两个for循环进行嵌套,那么这个写法到底对不对呢?有没有通过测试?

我们看见了,这个题目一共会验证38个输入数据,我们通过了0-36个输入数据,在进行第37个输入数据时候,显示超出计算时间,显然,我们算法实现的功能是没用问题的,主要的问题在于在进行很大数计算的时候,我们所写的代码运行时间超出了题目给定的时间限制,这时候我们就需要优化我们的算法了。

3.2、复杂度的计算

一般我们衡量一个算法的好坏是从时间与空间两个维度进行衡量的,分别成为时间复杂度与空间复杂度

时间复杂度是一个衡量算法运行快慢的

空间复杂度是衡量是指一个算法在运行时所需要的额外空间。

4、时间复杂度

定义:在计算机科学中,算法的时间复杂度是一个函数T(N),他定量描述了算法的运行时间,时间复杂度是该程序运行的时间快慢,那么我们为什么不直接计算程序的运行时间呢?

  1. 在相同的机器上,相同的代码分别放入新编译器与老编译器中,程序所执行的运行时间快慢是不一样的。
  2. 不同配置的电脑,在同一款编译器运行相同的代码,由于电脑的配置不一样,会导致计算出来的程序运行的速度快慢不一样
  3. 测试代码运行的时候,需要在代码完成以后才能进行测试,会耽误我们写代码。

总结:所以我们通过一个T(N)的算法模型,就可以大致判断代码的运行效率,可以大大提高我们代码的算法与书写效率。

案例:

前情提要:在我们计算T(N)的时候,我们所需要计算的是程序中最坏的情况(最大运行的时间)

// 请计算⼀下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--)

Read more

mT5分类增强版中文-base实战案例:新闻标题多样性增强与SEO内容生成落地

mT5分类增强版中文-base实战案例:新闻标题多样性增强与SEO内容生成落地 1. 项目背景与模型介绍 在内容创作和网络营销领域,如何快速生成多样化的优质内容一直是个难题。传统的文本改写方法往往效果生硬,缺乏创意,而人工创作又耗时耗力。mT5分类增强版中文-base模型的出现,为这个问题提供了智能化的解决方案。 这个模型基于强大的mT5架构,专门针对中文场景进行了深度优化。通过在大量中文数据上的训练,并结合零样本分类增强技术,模型能够理解文本的深层语义,生成既保持原意又富有变化的文本变体。 与普通文本生成模型不同,mT5分类增强版具备更强的语义理解能力和输出稳定性。它不仅能进行简单的同义词替换,还能从不同角度重构句子,保持逻辑连贯性的同时增加文本的多样性。这种能力使其特别适合新闻标题优化、SEO内容生成、广告文案创作等场景。 2. 环境部署与快速启动 2.1 系统要求与准备 在开始使用前,确保你的系统满足以下基本要求: * Python 3.7或更高版本 * 至少8GB内存(推荐16GB) * GPU支持(可选,但能显著提升速度) * 稳定的网络连接(用于

By Ne0inhk

Hybrid A*:算法概念详解

在之前,我们一起学习了A*算法,A* 是一种用于在图或网格中寻找最短路径的启发式搜索算法。然而A*算法得到的最优路径为折线,在实际机器人的运动中,我们更希望追踪的路径为平滑的曲线。         Hybrid A*(混合 A*)是一种用于连续空间、具有非完整约束的运动规划算法,尤其适用于自动驾驶车辆或移动机器人。 A*算法:启发式寻路核心解析-ZEEKLOG博客 1 核心思想         Hybrid A* 将 A* 的启发式搜索思想与连续状态空间的运动模型结合起来。         与普通 A* 不同,Hybrid A* 的搜索节点不仅包括位置坐标 (x,y) ,还包括车辆朝向 θ 。因此每个节点是一个三维状态:n=(x,y,θ)         这使得搜索考虑了车辆的运动学约束,即在寻找下一个搜索节点时不能单纯以相邻节点为搜索目标,要根据预先设定的采样步长,考虑转弯半径限制、不能原地旋转等因素,采样运动轨迹,并判断轨迹是否会与障碍物发生碰撞,选择满足车辆运动条件的轨迹为待选的搜索节点。 2

By Ne0inhk
【数据结构-初阶】详解线性表(5)---队列

【数据结构-初阶】详解线性表(5)---队列

🎈主页传送门:良木生香 🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》 🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离 上期回顾:在上一篇文章(【数据结构-初阶】详解栈和队列(1)---栈)中我们讲到了在顺序表与链表之外的另一种线性表---栈,知道了这是一种具有先进后出和后进先出特点的数据结构,既然有先进后出,那么肯定就有先进先出的数据结构,所以这就是我们今天要讲的------队列 一、队列的概念 既然我们想要实现先进先出的效果,那肯定就不像栈那样有一端是堵起来的,想必应该是两端都开口吧。嗯,事实确实如此。 队列:是只允许在一端进行数据的插入操作,在另一端进行数据的删除操作的一种特殊的线性表,其具有先进先出FIFO(first in first out)的结构特点. 入队列:进行插入操作的一端叫做队尾 出队列:进行删除操作的一端叫做队头 下面是队列的示意图: 名字叫做队列,其实就像我们排队一样,先排的人先得服务,后排的人后得到服务,在队列中,先进来的元素先得到操作,

By Ne0inhk
【数据结构-初阶】二叉树(1)---树的相关概念

【数据结构-初阶】二叉树(1)---树的相关概念

🎈主页传送门:良木生香 🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》 🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离 上期回顾:在上一篇文章中(这是文章链接:【数据结构-初阶】详解线性表(5)---队列),我们学习了初阶数据结构中的后一个线性表---队列,那么在初阶线性结构中线性表的内容我们就告一段落了,今天我们就进入到初阶段数据结构中的非线性表这块知识的学习.在这块知识中,我们会学习到树,但是还不学习图,这会等到我们学习C++语言的时候详细讲解 目录 一、树的相关概念 1.树的概念与结构: 2、树的相关术语 3、树的表示方法 4、树形结构在生活中的具体应用:   在学习二叉树之前,我们要先了解一下什么是树 一、树的相关概念 讲到树,我们就能联想到平时生活中所看到的植物树,那我们今天要讲的树与平时看到的树有联系吗?有的兄弟,当然有,我们今天要将的树灵感就是来源于生活中的树 生活中的树根是在地下的,分支是朝天上生长的,

By Ne0inhk