数据结构基础小结

数据结构基础小结

概述

什么是算法?

在计算机领域里,算法是一系列程序指令,用于处理特定的运算和逻辑问题。

衡量算法优劣的主要标准是时间复杂度和空间复杂度。

什么是数据结构?

数据结构,对应的英文单词是 data structure,是数据的组织、管理和存储格式,其使用目的是为了高效地访问和修改数据。

数据结构都有哪些组成方式?

基本数据结构
  1. 线性结构

    线性结构是最简单的数据结构,包括数组、链表,以及由它们衍生出来的栈、 队列、哈希表

  2. 树是相对复杂的数据结构,其中比较有代表性的是二叉树,由它又衍生出了二叉堆之类的数据结构。

  3. 图是更为复杂的数据结构,因为在图中会呈现出多对多的关联关系。

其他数据结构

除上述所列的几种基本数据结构以外,还有一些其他的千奇百怪的数据结构。它们由基本数据结构变形而来,用于解决某些特定问题,如跳表、哈希链表、位图

时间复杂度

时间复杂度是对一个算法运行时间长短的量度。它描述了算法运行时间与输入大小之间的关系,记作 T(n)=O(f(n))。

时间复杂度通常用大 O 记号(O表示)来表示,表示算法执行时间的上界

因为渐进时间复杂度用大写 O 来表示,所以也被称为大 O 表示法

O(1) < O(logn) < O(n) < O(n²)

空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,它同样使用了大 O 表示法,记作 S(n)=O(f(n))。

线性结构

什么是数组

数组是由有限个相同类型的变量所组成的有序集合,它的物理存储方式是顺序存储,访问方式是随机访问

  • 利用下标查找数组元素的时间复杂度是 O(1),
  • 中间插入、删除数组元素的时间复杂度是 O(n)。

什么是链表

链表是一种链式数据结构,由若干节点组成,每个节点包含指向下一节点的指针。链表的物理存储方式是随机存储,访问方式是顺序访问。(和数组相反)

  • 查找链表节点的时间复杂度是 O(n),
  • 中间插入、删除节点的时间复杂度是 O(1)。

什么是栈

栈是一种线性逻辑结构,可以用数组实现,也可以用链表实现。栈包含入栈和出栈操作,遵循先入后出的原则(FILO)。

什么是队列

队列也是一种线性逻辑结构,可以用数组实现,也可以用链表实现。队列包含入队和出队操作,遵循先入先出的原则(FIFO)。

什么是散列表

散列表也叫哈希表,是存储 Key-Value 映射的集合。对于某一个 Key,散列表可以在接近 O(1) 的时间内进行读写操作。

散列表通过哈希函数实现 Key 和数组下标的转换,通过【开放寻址法】和【链表法】来解决哈希冲突。

  1. 开放寻址法:当发生冲突时,它会尝试在哈希表中的其他位置继续寻找可用的位置来存储数据,直到找到一个空闲的位置为止。

    具体来说,开放寻址法通过以下方式处理哈希冲突:

    • 线性探测法:发生冲突时,依次检查下一个位置,直到找到一个空闲位置。
    • 二次探测法:发生冲突时,按照某个固定的二次探测序列依次检查下一个位置,直到找到一个空闲位置。
    • 双重哈希法:使用两个不同的哈希函数来计算下一个探测位置。

    开放寻址法的优点是不需要额外的数据结构来存储冲突的数据,节省了内存空间。但它的缺点是容易产生聚集性冲突,导致哈希表的性能下降。

  2. 链表法:它在哈希表的每个桶中维护一个链表(或其他数据结构,如红黑树),当发生冲突时,将冲突的数据存储在该桶的链表中。

    具体来说,链表法通过以下方式处理哈希冲突:

    • 将哈希表的每个桶初始化为一个空链表。
    • 当发生哈希冲突时,将新的数据插入到对应桶的链表中。

    链表法的优点是容易实现,且能够有效地处理较多的哈希冲突。然而,当链表过长时,会影响哈希表的性能,因为查找操作需要在链表上进行线性搜索。

什么是树

树是 n 个节点的有限集,有且仅有一个特定的称为根的节点。

当 n>1 时,其余节点可分为 m 个互不相交的有限集,每一个集合本身又是一个树,并称为根的子树。

什么是二叉树

二叉树是树的一种特殊形式,每一个节点最多有两个孩子节点。

二叉树包含【完全二叉树】和【满二叉树】两种特殊形式。

  1. 完全二叉树(Complete Binary Tree):除了最后一层可能不满外,其他层的节点都必须是满的,并且最后一层的节点都尽量靠左排列。

    具体特点如下:

    • 所有叶子节点都集中在二叉树的最后两层。
    • 最后一层的叶子节点都靠左排列。
    • 如果一个节点只有右子树而没有左子树,那么它必定是最后一层的节点。

    完全二叉树在数组中的存储非常高效,因为它的特殊结构允许用数组的形式表示,无需使用额外的指针。

  2. 满二叉树(Full Binary Tree):除了叶子节点外,每个节点都有两个子节点,即每个节点的度数都是 2。

    具体特点如下:

    • 所有非叶子节点都有两个子节点。
    • 所有叶子节点都在同一层上。

    满二叉树的高度是固定的,由节点数决定,且在给定节点数下,它的高度是最小的。但是满二叉树并不常见,一般完全二叉树更为常见。

二叉树的遍历方式有四种,根据遍历节点之间的关系,可以分为以下 4 种方式:

  1. 前序遍历(Pre-order Traversal):先访问根节点,然后按照左子树、右子树的顺序递归遍历。(根左右)
  2. 中序遍历(In-order Traversal):先按照左子树的顺序递归遍历,然后访问根节点,最后按照右子树的顺序递归遍历。(左根右)
  3. 后序遍历(Post-order Traversal):先按照左子树、右子树的顺序递归遍历,然后访问根节点。(左右根)
  4. 层序遍历(Level-order Traversal):从上到下逐层遍历二叉树的节点,同一层节点按照从左到右的顺序访问。(上到下)

另外,从更宏观的角度划分,二叉树的遍历方式可以分为两大类:

  1. 深度优先遍历(Depth-First Traversal):以深度为优先级的遍历方式,即先访问根节点,然后递归遍历左子树和右子树。(根左右)
  2. 广度优先遍历(Breadth-First Traversal):以广度为优先级的遍历方式,即按照层序遍历的顺序逐层遍历二叉树的节点。

深度优先遍历适用于查找、搜索等问题(栈),而广度优先遍历适用于层次遍历和最短路径等问题(队列)。

什么是二叉堆

二叉堆是一种特殊的完全二叉树,分为最大堆和最小堆。

  • 在最大堆中,任何一个父节点的值,都大于或等于它左、右孩子节点的值。
  • 在最小堆中,任何一个父节点的值,都小于或等于它左、右孩子节点的值。

什么是优先队列

优先队列分为最大优先队列和最小优先队列。

  • 在最大优先队列中,无论入队顺序如何,当前最大的元素都会优先出队,这是基于最大堆实现的。
  • 在最小优先队列中,无论入队顺序如何,当前最小的元素都会优先出队,这是基于最小堆实现的

什么是图

图是由一组节点(顶点)和连接这些节点的边组成的集合。

节点表示实体,边表示节点之间的关系。

图可以是有向图(Directed Graph),即边有方向性,也可以是无向图(Undirected Graph),边没有方向性。

图的分类

  • 简单图:图中没有自环和重复的边。
  • 带权图:图的边带有权重,表示节点之间的距离或代价。
  • 连通图:任意两个节点之间都有路径连接。
  • 有向无环图(DAG):没有环的有向图,常用于表示任务依赖关系。

图的表示方式

  • 邻接矩阵:使用二维数组表示节点之间的连接关系。
  • 邻接表:使用链表或数组表示节点的邻居节点。

常见图算法

  • 广度优先搜索(BFS):用于在图中查找最短路径或层次遍历。
  • 深度优先搜索(DFS):用于查找图中的所有路径或判断是否存在环。
  • Dijkstra 算法:用于找到带权图中的最短路径。
  • Kruskal 算法:用于求最小生成树,适用于带权无向图。
  • 拓扑排序:用于有向无环图中的任务调度。

实际应用

  • 网络通信:图可用于表示计算机网络中的节点和连接。
  • 社交网络:图可用于表示用户之间的关系,进行社交网络分析。
  • 路径规划:图可用于地图导航、GPS 定位等。
  • 数据库查询优化:用图的拓扑排序来优化数据库查询计划。
  • 任务调度:用有向无环图表示任务依赖,实现任务调度和并行处理。
  1. BFS - 广度优先搜索(Breadth-First Search)
  2. DFS - 深度优先搜索(Depth-First Search)
  3. DAG - 有向无环图(Directed Acyclic Graph)
  4. GPS - 全球定位系统(Global Positioning System)

红黑树

红黑树是一种自平衡二叉搜索树(通过颜色调整和旋转操作),它在插入和删除节点时能够自动调整结构,保持树的平衡性,从而保证查找、插入和删除操作的时间复杂度稳定在 O(log n)。

红黑树特点

  1. 每个节点都是红色或黑色。
  2. 根节点是黑色。
  3. 叶子节点(空节点)都是黑色。
  4. 红色节点的子节点都是黑色。
    • RED 节点的 parent 都是 BLACK
    • 从根节点到叶子节点的所有路径上不能有 2 个连续的 RED 节点
  5. 从任意节点到其每个叶子节点的路径上包含相同数量的黑色节点(即相同的黑色高度)。

红黑树的应用

TreeMap、TreeSet 以及 JDK1.8 的 HashMap 底层都用到了红黑树。

为什么要用红黑树?

简单来说红黑树就是为了解决二叉查找树的缺陷,因为二叉查找树在某些情况下会退化成一个线性结构。

布隆过滤器

布隆过滤器(Bloom Filter)是一种空间高效的概率型数据结构,用于快速判断一个元素是否存在于一个集合中

实际上是一个位数组(通常用二进制位表示),以及一系列哈希函数。

它的主要特点是快速查询、低存储消耗,但可能会产生一定的误判率。

布隆过滤器通常用于以下场景

  1. 缓存加速:在缓存中判断一个数据是否存在,如果不存在,则不需要从数据库或其他存储中加载数据,从而加速数据的查询。
  2. 数据库查询优化:可以在数据库查询之前,先通过布隆过滤器快速判断数据是否可能存在,从而减少对数据库的查询负担。
  3. 分布式系统:在分布式系统中,可以使用布隆过滤器来快速判断数据是否存在于分布式缓存或分布式数据库中。
  4. 防止缓存穿透:当请求的数据在缓存中不存在时,可以使用布隆过滤器先进行判断,如果判断结果为不存在,则可以直接返回,避免对数据库等存储系统的过多查询。

由于误判率的存在,布隆过滤器不适合用于需要绝对精确判断的场景

具体实现步骤如下:

  1. 初始化位数组:创建一个位数组,并将所有位初始化为 0。位数组的大小通常根据预期元素数量和期望的误判率来确定。
  2. 添加元素:将待添加的元素通过多个哈希函数计算出一系列哈希值,然后将对应位置的位设置为 1。通常会选择多个不同的哈希函数,以增加散列效果。
  3. 查询元素:将待查询的元素通过相同的哈希函数计算出一系列哈希值,然后检查对应位置的位。如果所有位置的位都为 1,则表示元素可能存在;如果有任何一位为 0,则表示元素一定不存在。

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

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

相关文章

Apache SeaTunne简介

Apache SeaTunne简介 文章目录 1.Apache SeaTunne是什么&#xff1f;1.1[官网](https://seatunnel.apache.org/)1.2 项目地址 2.架构3.特性3.1 丰富且可扩展的连接器和插件机制3.2 支持分布式快照算法以确保数据一致性3.3 支持流、批数据处理&#xff0c;支持全量、增量和实时数…

C#实现一个安全的事件订阅器

1.解释下什么是事件订阅器 在C#的上下文中&#xff0c;事件订阅器是一种用于处理特定事件的机制。 事件&#xff08;Event&#xff09;&#xff1a;事件是在软件应用程序中发生的事物&#xff0c;如按钮被点击、数据被更改等。在C#中&#xff0c;事件是通过使用event关键字声…

Linux_Docker图形化工具Portainer如何安装并结合内网穿透实现远程访问

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 本文主要介绍如何本地安装Portainer并结合内网穿透工具实现任意浏览器远程访问管理界面。Portainer 是一个轻量级…

频谱论文:基于张量Tucker分解的频谱地图构建算法

#频谱# [1]陈智博,胡景明,张邦宁 郭道省.(2023).基于张量Tucker分解的频谱地图构建算法.电子与信息学报(11),4161-4169. &#xff08;陆军工程大学&#xff09; 研究内容 将动态电磁环境的时变频谱地图建模为3维频谱张量&#xff0c;通过张量Tucker分解提取出具有物理意义的核…

【MySQL】(DDL) 数据库操作

创建&#xff1a; create database 数据库名称; //创建数据库 create database if not exists 数据库名 ; //创建数据库并添加判断 &#xff08;如果存在就不创建不存在就创建 &#xff09; create database 数据库名 default charset 字符集 ; //创建数据库并设置字符集 查…

CSRF(跨站脚本请求)

一、漏洞原理 CSRF&#xff08;Cross-Site Request Forgery&#xff09;是一种网络安全攻击&#xff0c;攻击者通过欺骗用户在不知情的情况下发送请求&#xff0c;从而实现对目标网站的操作。 网站管理员(已经登录网站后台)——黑客构造的恶意服务器(是网站的创建用户请求)——…

B01、JVM与Java体系结构-01

字节码与多语言混合编程 字节码概述&#xff1a; 我们平时说的java字节码&#xff0c;指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为&#xff1a;jvm字节码。不同的编译器&#xff0c;可以编译出相同的字节码文件&…

微信小程序vant安装使用过程中遇到无法构建npm的问题

官网地址&#xff0c;然而如果完全按照这个教程来&#xff0c;实际上是缺少步骤的&#xff0c;需要补充一些步骤&#xff08;参考https://www.bilibili.com/video/BV1vL41127Er&#xff09; # 这步init就是补充的 npm init npm i vant/weapp -S --production# 剩下的按照vant的…

人工智能在金融与商业领域的智能化变革

导言 随着人工智能技术的不断发展&#xff0c;金融和商业领域正迎来一场智能化的变革。随着人工智能的不断发展&#xff0c;其在金融和商业领域的应用正成为业界瞩目的焦点。本文将深入探讨人工智能在金融和商业应用中的关键技术、应用场景以及对未来的影响。 1. 关键技术与算…

音频I2S

前言 基于网上资料对相关概念做整理汇总&#xff0c;部分内容引用自文后文章。 学习目标&#xff1a;简单了解相关概念、相关协议。 1 概述 数字音频接口DAI&#xff0c;即Digital Audio Interfaces&#xff0c;顾名思义&#xff0c;DAI表示在板级或板间传输数字音频信…

AtCoder Beginner Contest 332 G. Not Too Many Balls(最大流转最小割 dp)

题目 n(n<500)种球&#xff0c;第i种有ai(0<ai<1e12)个球&#xff0c; m(m<5e5)个盒子&#xff0c;第j个能放bj(0<bj<1e12)个球 特别地&#xff0c;第j个盒子最多能放i*j个第i种球 求m个盒子能放的最多的球的总数 思路来源 官方题解 题解 显然是一个最…

关于pycharm无法进入base界面的问题

问题&#xff1a;terminal输入activate无法进入base 解决方案 1.Cortana这边找到Anaconda Prompt右击进入文件所在位置 2. 右击进入属性 3. 复制cmd.exe开始到最后的路径 cmd.exe "/K" C:\ProgramData\anaconda3\Scripts\activate.bat C:\ProgramData\anaconda3 …

学习使用DDP: DistributedDataParallel

Introduction “DistributedDataParalled” 是Pytorch中用于分布式训练的模块&#xff0c;相较与比较老的DataParallel更高效,易用&#xff08;我在使用DataParallel时经常遇到参数和数据没有在一块卡的报错情况&#xff0c;非常烦人&#xff09;。它允许在多个GPU甚至多个节点…

C语言预处理详解及其指令

预处理详解 1.预定义符号2.#define定义常量基本使用方法举例子如果在define定义的表示符后面加上分号会发生什么&#xff1f;用一下来解释 3. #define定义宏举例例1例2 4. 带有副作用的宏参数例如: 5. 宏替换的规则6. 宏函数的对比宏和函数的一个对比 7. #和##7.1 #运算符7.2 #…

全套SpringBoot讲义01

hello&#xff0c;我是小索奇&#xff0c;全套SpringBoot教程~一起来学习叭 文章目录 SpringBoot文档更新日志前言课程内容说明课程前置知识说明 SpringBoot基础篇JC-1.快速上手SpringBootJC-1-1.SpringBoot入门程序制作&#xff08;一&#xff09;JC-1-2.SpringBoot入门程序制…

数据库交付运维高级工程师-腾讯云TDSQL

数据库交付运维高级工程师-腾讯云TDSQL上机指导&#xff0c;付费指导&#xff0c;暂定99

Python一键升级所有Package的办法

对于一个有强迫症的人来说&#xff0c;总是希望自己使用的是最新的Package&#xff0c;一个个去升级那就太侮辱Python了&#xff0c;一键升级的办法有的是呢&#xff0c;在cmd窗口中就能完成&#xff1a; 第一步&#xff1a;升级默认更新网站 作为内网用户&#xff0c;连接外…

【PostgreSQL】从零开始:(十三)PostgreSQL-SQL语句操作架构(模式) Schema

Schema概述 PostgreSQL 数据库集群包含一个或多个命名数据库。角色和一些其他对象类型在整个集群中共享。与服务器的客户端连接只能访问单个数据库中的数据&#xff0c;该数据库在连接请求中指定。 用户不一定有权访问集群中的每个数据库。共享角色名称意味着不能在同一集群中…

wsl kafka的简单应用

安装并配置单机版kafka所需环境 wsl2 环境可用性较高&#xff0c;如下介绍在该环境中安装单机版本kafka的详细过程。 启动命令行工具启动wsl&#xff1a;wsl --user root --cd ~&#xff0c;&#xff08;以root用户启动&#xff0c;进入wsl后当前路径为~“用户主目录”&#…

【数据结构】复习题(一)

一、选择题 1.组成数据的基本单位是()。 A. 数据项 B.数据类型 C.数据元素 D.数据变量 2.设数据结构A{D,R},其中D&#xff5b;1,2,3,4},R{r},r{<1,2>,<2,3>,< 3,4>,<4,1>}&#xff0c;则数据结构A是()。 A.线性结构 B.树型结构 C.图型结构 D.集合 3.…