Leetcode算法入门与数组丨1. 数据结构与算法简介

文章目录

    • 前言
    • 1 数据结构与算法
      • 1.1 数据结构
      • 1.2 算法
    • 2 算法复杂度
      • 2.1 算法复杂度简介
      • 2.2 时间复杂度
      • 2.3 空间复杂度
    • 3 总结

前言

Datawhale组队学习丨9月Leetcode算法入门与数组丨打卡笔记

这篇博客以及接下来几篇将会是一个 入门型 的文章,主要是自己学习的一个记录。

内容会参考这篇笔记(很详细):LeetCode 算法笔记(Leetcode-Notes)

1 数据结构与算法

程序 = 算法 + 数据结构

  • 算法:解决问题的方式、方法或者过程。
  • 数据结构:数据的计算机表示和相应的一组操作。
  • 程序:由算法和数据结构组成,并进行具体实现。

程序设计的所要追求的是:

更加合适的数据结构 + 花费时间更少、占用空间更小的算法

LeetCode 算法笔记(Leetcode-Notes) 笔记中写道:如果把程序比喻成做菜,那么各种食材和调味料就是数据结构,而不同的做菜方法或者说不同的烹饪方式就是算法。那么色香味俱全就是做菜的追求,程序也是这样,通过合适的算法以及合适的数据结构,产生一个高质量的代码去解决问题。

1.1 数据结构

数据结构(Data Structure):带有结构特性的数据元素的集合。简言之,就是 数据的组织结构,用来组织、存储数据。用来提高计算机硬件的利用效率。

通过学习数据结构,我们可以了解和掌握计算中中的数据是以什么样的方式进行组织和存储的。

数据结构的分类方式

1. 逻辑结构

  • 集合结构:数据元素同属于一个集合,彼此互相独立,除此之外无其他关系。

在这里插入图片描述

  • 线性结构:数据元素之间是一对一关系。也就是线性结构中的数据元素(除了首尾元素)左右两侧都只有一个数据于其相邻。 数组、链表,栈、队列、哈希表,都属于线性结构类型。

在这里插入图片描述

  • 树形结构:数据元素之间是一对多的关系。

在这里插入图片描述

  • 图形结构:数据元素之间是多对多的关系。

在这里插入图片描述

2. 物理结构

  • 顺序存储结构:数据元素之间的逻辑关系通过数据元素的存储地址来反映。逻辑上相邻的数据元素在物理地址上相邻。
    • 优点:简单、易理解,且实际占用最少的存储空间。
    • 缺点: 需要占用一片地址连续的存储单元;并且存储分配要事先进行;另外对于一些操作的时间效率较低(移动、删除元素等操作)。

在这里插入图片描述

  • 链式存储结构:将数据元素存放在任意的存储单元里,存储单元可以连续,也可以不连续。
    链结点:每个元素所占用的若干单元组合。存放当前元素数据信息和下一元素所在链接点的指针。

    • 优点: 存储空间不必事先分配,在需要存储空间的时候可以临时申请,不会造成空间的浪费;一些操作的时间效率远比顺序存储结构高(插入、移动、删除元素)。
    • 缺点:不仅数据元素本身的数据信息要占用存储空间,指针也需要占用存储空间,链式存储结构比顺序存储结构的空间开销大。

在这里插入图片描述

1.2 算法

算法:解决问题的方法或者流程。

它不依赖于任何一种语言,可以用 自然语言、编程语言(Python、C、C++、Java 等) 描述,也可以用 伪代码、流程图 来表示。

1. 算法的基本特性

  • 输入:没有、一个或者多个输入。
  • 输出:一个或多个参数作为算法的输出。
  • 有穷性:算法必须在有限的步骤内结束。
  • 确定性:每条指令必须有明确的含义。
  • 可行性:每一步都能通过执行有限次数完成。

2. 算法追求的目标

  • 所需运行时间更少(时间复杂度更低);
  • 占用内存空间更小(空间复杂度更低)。

2 算法复杂度

2.1 算法复杂度简介

算法复杂度(Algorithm complexity):在问题的输入规模为 n n n 条件下,程序的时间使用情况空间使用情况

比较算法优劣的两种方法

  • 事后统计:计算机执行后,对运行时间和空间使用情况的记录,并挑选出好的算法。
  • 预先估算(常用):计算机执行前,对算法中步骤的时间复杂度和空间复杂度的估算,并挑选出好的算法。

问题的输入规模 n n n :算法问题输入的数据量大小。

  • 排序算法中: n n n 表示需要排序的元素数量。
  • 查找算法中: n n n 表示查找范围内的元素总数,比如数组大小、二维数组矩阵大小、字符串长度、二叉树节点数、图的节点数、图的边界点等。
  • 二进制计算相关算法中: n n n 表示二进制的展开宽度。

2.2 时间复杂度

1.时间复杂度简介

时间复杂度(Time Complexity):在问题的输入规模为 n n n 的条件下,算法运行所需要花费的时间,可以记作为 T ( n ) T(n) T(n)

度量标准:基本操作次数

什么是基本操作?

算法执行中的每一条语句。每一次基本操作都可以在常数时间内完成。

2.渐进符号

渐进符号(Asymptotic Symbol):专门用来刻画函数的增长速度的。简单来说,渐进符号只保留了 最高阶幂,忽略了一个函数中增长较慢的部分,比如 低阶幂、系数、常量。因为当问题规模变的很大时,这几部分并不能左右增长趋势,所以可以忽略掉。

  • Θ \Theta Θ 渐进紧确界符号
  • O O O 渐进上界符号
  • o o o 非渐近紧确上界符号
  • Ω \Omega Ω 渐进下界符号
  • ω \omega ω非渐近紧确下界符号

在这里插入图片描述

渐近记号 Θ \Theta Θ O O O o o o Ω \Omega Ω ω \omega ω关系

记号含义通俗理解
Θ \Theta Θ紧确界相当于"="
O O O(大欧)上界相当于"<="
o o o(小欧)非紧的上界相当于"<"
Ω \Omega Ω(大欧米伽)下界相当于">="
ω \omega ω(小欧米伽)非紧的下界相当于">"

在这里插入图片描述

3.时间复杂度计算

  • 计算算法的时间复杂度的步骤
  1. 确定基本操作:首先,需要明确算法中的基本操作是什么,这些基本操作通常是算法中执行一次所需要的时间最长的操作。

  2. 计算每个基本操作的执行次数:对于算法中的每个基本操作,需要计算它们分别会执行多少次。这通常涉及到对算法中的循环、递归等结构进行分析。

  3. 求和并简化:将每个基本操作的执行次数加总,并进行简化。通常可以根据常见的时间复杂度规则(如忽略常数项、保留最高次项等)来简化计算。

  4. 得出时间复杂度表达式:根据求和并简化后的结果,得出算法的时间复杂度表达式。常见的时间复杂度包括 O ( 1 ) O(1) O(1) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( n ! ) O(n!) O(n!) O ( log ⁡ n ) O(\log n) O(logn) O ( n log ⁡ n ) O(n \log n) O(nlogn)等。

需要注意的是,时间复杂度只是对算法的时间性能进行粗略估计,它描述的是算法的增长率,而非具体的执行时间。在实际应用中,还需要考虑输入规模、硬件环境等因素来综合评估算法的效率。

  • 计算时间复杂度时原则
  1. 忽略常数项:在计算时间复杂度时,通常会忽略常数项。因为常数项对于大规模数据来说影响较小,而且不同的机器、不同的编译器等因素都会影响常数项。

  2. 保留最高次项:在计算时间复杂度时,通常只保留最高次项,因为最高次项对于大规模数据来说影响最大。

  3. 乘法法则:如果一个算法中有多个嵌套的循环,那么它们的时间复杂度应该用乘法法则计算。

  4. 加法法则:如果一个算法中有多个不同的操作,那么它们的时间复杂度应该用加法法则计算。

  5. 最坏情况分析:在计算时间复杂度时,通常会假设算法在最坏情况下的时间复杂度,因为最坏情况下的时间复杂度可以保证算法在任何情况下都不会超时。

  6. 平均情况分析:有些算法的时间复杂度与输入数据的分布情况有关,这时需要进行平均情况分析。

总之,计算时间复杂度需要遵循科学严谨的原则,同时也需要结合具体的算法和应用场景来进行综合评估。

  • 常见的时间复杂度
  1. 常数时间复杂度( O ( 1 ) O(1) O(1):无论输入规模大小,算法的执行时间都是常数级别的,即执行时间固定。
def algorithm(n):a = 1b = 2res = a * b + nreturn res
  1. 对数时间复杂度( O ( log ⁡ n ) O(\log n) O(logn):算法的执行时间与输入规模的对数成正比,常见的例子是二分查找算法
def algorithm(n):cnt = 1while cnt < n:cnt *= 2return cnt
  1. 线性时间复杂度( O ( n ) O(n) O(n) :算法的执行时间与输入规模成线性关系,即随着输入规模的增加,执行时间也相应增加。例如,遍历一个数组的算法。
def algorithm(n):sum = 0for i in range(n):sum += 1return sum
  1. 线性对数时间复杂度( O ( n log ⁡ n ) O(n \log n) O(nlogn):算法的执行时间与输入规模的对数乘以输入规模成正比,常见的例子是快速排序和归并排序等排序算法
def algorithm(n):cnt = 1res = 0while cnt < n:cnt *= 2for i in range(n):res += 1return res
  1. 平方时间复杂度( O ( n 2 ) O(n^2) O(n2):算法的执行时间与输入规模的平方成正比,例如,嵌套循环的算法。
def algorithm(n):res = 0for i in range(n):for j in range(n):res += 1return res
  • 最佳、最坏、平均时间复杂度
  1. 最佳时间复杂度(Best Case Time Complexity):指在最理想的情况下,算法执行所需的最少时间。最佳时间复杂度表示算法在最有利的输入情况下的性能表现。

  2. 最坏时间复杂度(Worst Case Time Complexity):指在最不利的情况下,算法执行所需的最长时间。最坏时间复杂度表示算法在最差的输入情况下的性能表现。

  3. 平均时间复杂度(Average Case Time Complexity):指算法执行所需时间的平均值,考虑了所有可能的输入情况下的性能表现。平均时间复杂度需要对输入的概率分布进行分析,通常需要使用概率论或统计学的方法来计算。

2.3 空间复杂度

空间复杂度是衡量算法在执行过程中所需的额外空间或内存资源的度量。它描述的是算法所需的额外空间随着输入规模增加而增长的趋势。

通常,空间复杂度可以分为以下几种情况:

  1. 常数空间复杂度( O ( 1 ) O(1) O(1)):算法所需的额外空间是固定的,与输入规模无关。例如,只使用有限个变量的算法。

  2. 线性空间复杂度( O ( n ) O(n) O(n)):算法所需的额外空间随着输入规模线性增长。例如,需要存储输入数据的数组或列表

  3. 平方空间复杂度( O ( n 2 ) O(n^2) O(n2)):算法所需的额外空间随着输入规模的平方增长。例如,需要存储二维矩阵的算法。

  4. 指数空间复杂度( O ( 2 n ) O(2^n) O(2n)):算法所需的额外空间随着输入规模的指数增长。例如,需要存储所有可能子集的算法。

需要注意的是,空间复杂度并不仅仅取决于算法中的变量和数据结构的使用情况,还受到函数调用、递归等因素的影响。在实际应用中,除了考虑时间复杂度外,也需要关注算法的空间复杂度,以避免因为内存不足导致程序异常或效率低下。

3 总结

在这里插入图片描述

参考文献

  • [1] https://datawhalechina.github.io/leetcode-notes/#/
  • [2] https://blog.csdn.net/so_geili/article/details/53353593

—— END ——


如果以上内容有任何错误或者不准确的地方,欢迎在下面 👇 留言。或者你有更好的想法,欢迎一起交流学习~~~

更多精彩内容请前往 AXYZdong的博客

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

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

相关文章

032:vue中三元运算, style、class、type、 event等多种场景示例

第032个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

VR全景广告——实体商家的营销新选择

前几年&#xff0c;大家出行不便&#xff0c;那个时候实体商家整天苦恼于没有客户&#xff0c;没有销量&#xff0c;一直到引入VR全景广告才算是有所好转。随着VR全景技术不断完善&#xff0c;许多行业、领域开始结合VR全景&#xff0c;例如景区、房地产、车企等都会利用VR全景…

CMS-织梦[dede]-通用免登发布插件

CMS-织梦[dede]-通用免登发布插件 1. 织梦通用免登陆发布插件功能说明2. 织梦通用免登陆发布接口使用说明2-1 下载插件2-2 安装插件3 对接火车头等采集工具 3 爬虫【古诗文网】示例[可选]测试火车头入库模型 使用火车头&#xff0c;简数采集器&#xff0c;八爪鱼等文章采集工具…

构造函数注入指定bean名称

配置类 Configuration public class ThreadPoolTaskExecutorConfig {Beanpublic ThreadPoolTaskScheduler syncScheduler() {ThreadPoolTaskScheduler syncScheduler new ThreadPoolTaskScheduler();syncScheduler.setPoolSize(10);syncScheduler.setThreadGroupName("s…

智慧公厕助推城市管理智能化和治理精细化

随着城市化进程的不断加快&#xff0c;城市管理面临着诸多挑战和问题。而智慧公厕作为城市数字化赋能的重要一环&#xff0c;正成为推动城市管理智能化和治理精细化的关键力量。本文将以智慧公厕头部厂家广州中期科技有限公司&#xff0c;所实施大量精品案例项目的实景实图&…

【深度学习】 Python 和 NumPy 系列教程(二):Python基本数据类型:3、字符串(索引、切片、运算、格式化)

目录 一、前言 二、实验环境 三、Python基本数据类型 3. 字符串&#xff08;Strings&#xff09; 1. 初始化 2. 索引 3. 切片 4. 运算 a. 拼接运算 b. 复制运算 c. 子串判断 d. 取长度 5. 格式化 a. 使用位置参数 b. 使用关键字参数 c. 使用属性访问 f-string…

计算机毕设之基于Hadoop+springboot的物品租赁系统的设计与实现(前后端分离,内含源码+文档+教程)

该系统基于Hadoop平台&#xff0c;利用Java语言、MySQL数据库&#xff0c;结合目前流行的 B/S架构&#xff0c;将物品租赁管理的各个方面都集中到数据库中&#xff0c;以便于用户的需要。在确保系统稳定的前提下&#xff0c;能够实现多功能模块的设计和应用。该系统由管理员功能…

Mybatis 框架 ( 四 ) QueryWrapper

4.5.Wrapper条件构造器 Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 AbstractWrapper &#xff1a; 用于查询条件封装&#xff0c;生成 sql 的 where 条件 QueryWrapper &#xff1a; Entity 对象封装操作类&#xff0c;不是用lambda语法 UpdateWrapper &am…

android注解之APT和javapoet

前言 前面我们已经讲过注解的基本知识&#xff0c;对于注解还不太了解的&#xff0c;可以去看一下之前的文章&#xff0c; android 注解详解_袁震的博客-CSDN博客。 之前我们在讲注解的时候&#xff0c;提到过APT和JavaPoet&#xff0c;那么什么是APT和JavaPoet呢&#xff1…

【Mysql】Mysql获取排班时间段中的休息时间段方法

在MySQL中&#xff0c;可以使用自连接&#xff08;self-join&#xff09;来获取上一条记录的结束时间和下一条记录的开始时间&#xff0c;并将它们组合成一条记录。首先&#xff0c;需要为表创建一个包含记录ID和时间信息的临时表&#xff0c;然后使用自连接获取相邻记录的时间…

【面试经典150 | 数组】移除元素

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;原地操作 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等…

【STM32】常用存储器

常用存储器 RAM 存储器 RAM 是“Random Access Memory”的缩写&#xff0c;被译为随机存储器。所谓“随机存取”&#xff0c;指的是当存储器中的消息被读取或写入时&#xff0c;所需要的时间与这段信息所在的位置无关。而RAM可随读取其内部任意地址的数据&#xff0c;时间都是…

若依框架i18n国际化

需求背景 项目需求要做国际化&#xff0c;结果网上找了好几篇文章&#xff0c;没有一个可以一次性搞定&#xff0c;现在这里总结一下。首先&#xff0c;我们分为两部分处理&#xff0c;一个是前端页面的静态文字&#xff0c;这个由前端vue.json自行处理。第二部分就是后端的错…

Qt下SVG格式图片应用

SVG格式图片介绍 svg格式图片又称矢量图&#xff0c;该种格式的图片不同于png等格式的图片&#xff0c;采用的并不是位图的形式来组织图片&#xff0c;而是采用线条等组织图片&#xff0c;svg格式是图片的文件格式是xml&#xff0c;可以通过文件编译器打开查看svg格式内容。 …

使用Vagrant创建和管理本地Kubernetes(K8s)集群的步骤是什么

文章目录 步骤1&#xff1a;准备环境步骤2&#xff1a;创建Vagrantfile步骤3&#xff1a;启动虚拟机步骤4&#xff1a;安装Kubernetes步骤5&#xff1a;配置Kubernetes网络插件步骤6&#xff1a;将Worker节点加入集群步骤7&#xff1a;验证集群步骤8&#xff1a;部署应用步骤9&…

综合续航达1040公里:腾势计划2024年在香港上市,售价60-100 万

腾势汽车表示&#xff0c;他们计划于2024年在香港地区上市全新的D9车型。这款中大型高端新能源MPV是通过DM-i超级混动技术打造的&#xff0c;由于综合续航能力达到1040公里&#xff0c;且纯电续航最大可达190公里&#xff0c;这款车已经引起了广泛关注。据腾势销售事业部总经理…

[小尾巴 UI 组件库] 全屏响应式轮播背景图(基于 Vue 3 与 Element Plus)

文章归档于&#xff1a;https://www.yuque.com/u27599042/row3c6 组件库地址 npm&#xff1a;https://www.npmjs.com/package/xwb-ui?activeTabreadme小尾巴 UI 组件库源码 gitee&#xff1a;https://gitee.com/tongchaowei/xwb-ui小尾巴 UI 组件库测试代码 gitee&#xff1a…

在ExoPlayer中使用协程:构建强大的Android媒体播放器

在ExoPlayer中使用协程&#xff1a;构建强大的Android媒体播放器 现今的移动应用世界中&#xff0c;媒体消费是用户体验的核心部分。无论是流媒体视频、音乐播放还是处理自适应媒体格式&#xff0c;强大的媒体播放器对于提供无缝和愉悦的用户体验至关重要。而在安卓平台上&…

C高级day4循环语句

1&#xff0c;思维导图 运行结果为&#xff1a; 运行结果为&#xff1a;