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

news2024/10/7 18:24:47

文章目录

    • 前言
    • 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 = 1
    b = 2
    res = a * b + n
    return res
  1. 对数时间复杂度( O ( log ⁡ n ) O(\log n) O(logn):算法的执行时间与输入规模的对数成正比,常见的例子是二分查找算法
def algorithm(n):
    cnt = 1
    while cnt < n:
        cnt *= 2
    return cnt
  1. 线性时间复杂度( O ( n ) O(n) O(n) :算法的执行时间与输入规模成线性关系,即随着输入规模的增加,执行时间也相应增加。例如,遍历一个数组的算法。
def algorithm(n):
    sum = 0
    for i in range(n):
        sum += 1
    return sum
  1. 线性对数时间复杂度( O ( n log ⁡ n ) O(n \log n) O(nlogn):算法的执行时间与输入规模的对数乘以输入规模成正比,常见的例子是快速排序和归并排序等排序算法
def algorithm(n):
    cnt = 1
    res = 0
    while cnt < n:
        cnt *= 2
        for i in range(n):
            res += 1
    return res
  1. 平方时间复杂度( O ( n 2 ) O(n^2) O(n2):算法的执行时间与输入规模的平方成正比,例如,嵌套循环的算法。
def algorithm(n):
    res = 0
    for i in range(n):
        for j in range(n):
            res += 1
    return 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.coloradmin.cn/o/1002989.html

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

相关文章

Leaflet入门,原生html网页如何使用Leaflet地图

前言 本章讲解如何不使用vue或react的情况下,在原生html网页中使用Leaflet地图加载地图的功能。 以高德地图xyz瓦片地图为例。 示例演示效果 vue如何使用Leaflet vue2如何使用:《Leaflet入门,如何使用vue2-leaflet实现vue2双向绑定式的使用Leaflet地图,以及初始化后拿到…

【直接运行TS文件的三种方法】

直接运行TS文件的三种方法 文章目录 直接运行TS文件的三种方法法一&#xff1a;将 ts 编译成 js&#xff0c;然后运行 js 文件法二&#xff1a;用 ts-node 直接运行 ts法三&#xff1a;webstorm中直接运行ts(TypeScript) 法一&#xff1a;将 ts 编译成 js&#xff0c;然后运行 …

SpringBoot项目--电脑商城【显示购物车列表】

1.持久层 1.1规划需要执行的SQL语句 这里需要将商品表和购物车表进行连表查询 显示某用户的购物车列表数据的SQL语句大致是 多表查询如果字段不重复则不需要显示的表面表名 selectcid, #日后勾选购物车商品模块需要用到cid来确定勾选的是购物车表的哪一条数据uid, #感觉没必要…

教你如何利用人工智能技术提升气象、海洋、水文领域工作学习效率

查看原文>>>基于Python机器学习、深度学习提升气象、海洋、水文领域实践应用能力 Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;能够在不同操作系统和平台使用&#xff0c;简洁的语法和解释性语言使其成为理想的脚本语言。除了标准库…

小程序 navigateBack 携带参数返回的三种方式(详细)

如果觉着主图好看,点个赞,你早晚也会看到这么好看的景色! 第一种方式 getCurrentPages 获取当前页面栈。数组中第一个元素为首页,最后一个元素为当前页面。不要尝试修改页面栈,会导致路由以及页面状态错误。不要在 App.onLaunch 的时候调用 getCurrentPages(),此时 page …

选择什么电容笔比较好?主动式电容笔推荐

随着科学技术的飞速发展&#xff0c;越来越多人把纸质转换为电子版了&#xff0c;许多小伙伴会入手电容笔来提高自己的生产效率。无论是写作还是绘画。都在使用电容笔。apple pencil的昂贵众所周知&#xff0c;而现在线上的电容笔多得让我们眼花缭乱&#xff0c;再从众多品牌中…

测试平台部署三——Nginx

测试平台部署——Nginx 一、nginx部署1、nginx的作用:2、案例1二、django静态文件配置和部署1、nginx工作原理2、反向代理一、nginx部署 1、nginx的作用: 静态文件服务器和反向代理django服务 进入nginx容器中 sudo docker run --rm -it nginx:alpine /bin/sh

VPN都容易受到泄露流量的TunnelCrack攻击

导读研究人员近日发现&#xff0c;影响市面上大多数VPN产品的几个漏洞可以被攻击者用来读取用户流量、窃取用户信息&#xff0c;甚至攻击用户设备。 我们实施的攻击从计算上来说开销并不大&#xff0c;这意味着任何拥有适当网络访问权限的人都可以执行攻击&#xff0c;而且攻击…

Seekbar细节

Seekbar可以自定义thumb图标&#xff0c;但是有时候发现thumb没有展示完全&#xff0c;或者图标周围显示的是背景色&#xff0c;此时就需要设置一些属性 android:background"null" android:thumbOffset"0dp" android:splitTrack"false" 设置an…

WSL Ubuntu设置中文语言环境

问题现象&#xff1a;终端、Edge、VScode等软件乱码 在这里插入图片描述 解决方法 ① 安装中文语言包 sudo apt-get install language-pack-zh-han*② 运行语言支持检查 sudo apt install $(check-language-support)③ 修改相关配置文件 sudo gedit /etc/default/locale替…

2023年9月DAMA-CDGA/CDGP数据治理认证报名到这错不了

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

如何利用Python中实现高效的网络爬虫

各位大佬们&#xff01;今天我要和大家分享一个有关Python的技巧&#xff0c;让你轻松实现高效的网络爬虫&#xff01;网络爬虫是在互联网时代数据获取的一项关键技能&#xff0c;而Python作为一门强大的编程语言&#xff0c;为我们提供了许多方便而高效的工具和库。让我们一起…

XSC63-300-S-CB、XSC80-400-S-CA、XSC100-700-S-LB方型气缸

XQVB40-16、XQ-VB63-16、XQ-VB100-16倍压增压阀 QCK2400、QCK2400A、QCK2422、QCK2422A磁性开关 AL-07R、AL-30R、KT-50R、AL-03R、AL-20R、AL-72R磁性开关 XSC32-40-S-LB、XSC40-100-S-FA、XSC50-200-S-FB、XSC63-300-S-CB、XSC80-400-S-CA、XSC100-700-S-LB方型气缸 QSC3…

DC电源模块对设计和布线的重要性

BOSHIDA DC电源模块对设计和布线的重要性 在电子设备中&#xff0c;DC电源模块的作用是将市电或其他源的交流电转换成适合设备使用的直流电&#xff0c;因此&#xff0c;DC电源模块是电子设备中不可或缺的一个部分。在实际设计和应用中&#xff0c;DC电源模块的设计和布线显得…

智慧燃气:智慧燃气发展的讨论

关键词&#xff1a;智慧燃气、智能管网、智慧燃气系统、智能燃气、智慧燃气建设、智慧燃气平台 智慧燃气是什么&#xff1f; 智慧燃气是以智能管网建设为基础&#xff0c;利用先进的通信、传感、储能、微电子、数据优化管理和智能控制等技术&#xff0c;实现天然气与其他能源…

四化智造MES(WEB)与金蝶云星空对接集成原材料/标准件采购查询(待采购)连通采购订单新增(其他采购订单行关闭-TEST)

四化智造MES&#xff08;WEB&#xff09;与金蝶云星空对接集成原材料/标准件采购查询&#xff08;待采购&#xff09;连通采购订单新增(其他采购订单行关闭-TEST) 数据源系统:四化智造MES&#xff08;WEB&#xff09; MES系统是集成生产管理、品质管理、设备管理、BI数据中心、…

【赠书活动】考研备考书单推荐

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

比亚迪用USB Server,实现U盾远程连接

在过去&#xff0c;比亚迪的资金管理系统需要与多个银行进行银企直连对接&#xff0c;而银企直连的前置机程序是部署在物理机上的。为了推进企业虚拟化转型&#xff0c;比亚迪决定将前置机程序迁移到虚拟机中。然而&#xff0c;面临的问题是各银行的专用Ukey无法在虚拟机中被识…

SAP-SD-销售订单的删除

销售订单的删除和采购订单的删除是不同的&#xff0c;采购订单只是在行项目上打删除标记&#xff0c;也就是逻辑删除&#xff0c;而销售订单是物料删除&#xff0c;可以删除行或删除抬头&#xff0c; 首先查看底表SE16N&#xff0c;查看记录 TCODE&#xff1a;VA02&#xff0c…

Leetcode150. 逆波兰表达式求值

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&a…