数据结构基本介绍

2023-10-27

数据结构基本介绍

1、基本数据结构

1、数组、字符串 / Array & String
优点:
构建一个数组非常简单
能让我们在 O(1) 的时间里根据数组的下标 (index) 查询到某个元素
缺点:
构建时必须分配一段连续的空间
查询某个元素是否存在时需要遍历整个数组,耗费 O(n) 的时间
删除和添加某个元素时, 同样需要耗费 O(n) 的时间
例如:
leetcode 242.有效的字母异位词

2、链表 / Linked-list
单链表:链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素中的引用字段链接在一起。
双链表:与单链表不同的是,双链表的每个结点中都含有两个引用字段。
利用快慢指针(有时候需要用到三个指针)
构建一个虚假的链表头
例如:
1)两个排序链表,进行整合
2)将链表的奇偶数按原定顺序分离,生成前半部分为奇数,后半部分为偶数的链表
如何训练技巧:
1)在纸上画出节点的关系
例如:
leetcode 25.K 个一组翻转链表

3、栈 / Stack
特点:后进先出(LIFO)
算法基本思想
可以用一个单链表来实现
只关心上一次的操作
处理完上一次的操作后,能在 O(1) 时间内查找到更前一次的操作
例如:
leetcode 739.每日温度

4、队列 / Queue
特点:先进先出(FIFO)
常用的场景:
1)广度优先搜索

5、双端队列 / Deque
基本实现:可以用一个双链表
队列的头尾两端能在 O(1) 的时间内进行数据的查看、添加和删除
常用的场景:
1)实现一个长度动态变化的窗口或者连续区间
例如:
leetcode 239.滑动窗口最大值

6、树 / Tree
树的共性,结构直观
通过树的问题来考察 递归算法 掌握的熟练程度
面试中常考的树的形状有:
1)普通二叉树
2)平衡二叉树
3)完全二叉树
4)二叉搜索树
5)四叉树
6)多叉树
特殊的树:红黑树、自平衡二叉搜索树
考察点:
1)树的遍历
前序(树的搜索、创建一颗新的树)、中序(二叉搜索树)、后序(需要知道树的左右信息时)
例如:
leetcode 230.二叉搜索树中第K小的元素

2、高级数据结构

1、优先队列 / Priority Queue
与普通队列的区别:
1)保证每次取出的元素是队列中优先级最高的
2)优先级别可自定义
最常用的场景:
1)从杂乱无章的数据中按照一定的顺序(或者优先级)筛选数据
本质:
二叉堆的结构,对在英文里叫 Binary Heap
利用一个数组结构来实现完全二叉树
特点(牢记):
1)数组里的第一个元素 array[0] 拥有最高的优先级
2)给定一个下标 i,那么对于元素 array[i] 而言
    父节点 对应的元素下标是 (i-1)/2
    左侧节点 对应的元素下标是 2*i + 1
    右侧节点 对应的元素下标是 2*i + 2
3)数据中的每个元素的优先级都必须要高于它两侧子节点
其基本操作为以下两个:
1)向上筛选(sift up / bubble up)
2)向下筛选(sift down / bubble down)
另外一个最重要的时间复杂度:
优先队列的初始化
例如:
leetcode 347.前 K 个高频元素
思路:
如何定义优先级别,以及优先队列中元素的数据结构

2、图 / Graph
最基本知识点如下:
1)阶、度
2)树、森林、环
3)有向图、无向图、完全有向图、完全无向图
4)连通图、连通分量
图的存储和表达方式:邻接矩阵、邻接链表
围绕图的算法也是各种各样:
1)图的遍历:深度优先、广度优先
2)环的检测:有向图、无向图
3)拓扑排序
4)最短路径算法:Dijkstra、Bellman-Ford、Floyd Warshall
5)连通性相关算法:Kosaraju、Tarjan、求解孤岛的数量、判断是否为树
6)图的着色、旅行商问题等
必须数量掌握的知识:
1)图的存储与表达方式:邻接矩阵、邻接链表
2)图的变量:深度优先、广度优先
3)二部图的检测(Bipartite)、树的检测、环的检测包括有向图、无向图
4)拓扑排序
5)联合-查找算法(Union-Find)
6)最短路径:Dijkstra、Bellman-Ford
例如:
leetcode 785.判断二分图


3、前缀树 / Trie
也称为字典树
这种数据结构被广泛地运用在字典查找当中
什么是字典查找?
例如:给定一系列构成字典的字符串,要求在字典当中找出所有以"ABC"开头的字符串
方法一:暴力搜索法
时间复杂度:O(M*N)
方法二:前缀树
时间复杂度:O(M) // M 表示单词里最长的单词个数
经典应用:
1)搜索框输入搜索文字、会罗列以搜索词开头的相关搜索
2)汉字拼音输入法
重要性质:
1)每个节点至少包含两个基本的属性
2)children: 数组或者集合,罗列出每个分支当中包含的所有字符
3)isEnd:布尔值,表示该节点是否为某个字符串的结尾
4)根节点是空的
5)除了根节点,其他所有节点都可能是单词的结尾,叶子节点一定都是单词的结尾
最基本的操作:
创建方法:
遍历一遍输入的字符串,对每个字符串的字符进行遍历
从前缀树的根节点开始,将每个字符加入到节点的 children 字符集当中
如果字符集已经包含了这个字符,跳过
如果当前字符是字符串的最后一个,把当前节点的 isEnd 标记为真
搜索方法:
从前缀树的根节点出发,逐个匹配输入的前缀字符
如果遇到了,继续往下一层搜索
如果没遇到,立即返回
例题:
leetcode 212.单词搜索II


4、线段树 / Segment Tree
先从一个例题出发
假设我们有一个数组 array[0 ... n-1],里面有 n 个元素,现在我们要经常对这个数组做两件事:
1. 更新数组元素的数值
2. 求数组任意一段区间里元素的总和(或者平均值)
方法一:遍历一遍数组
时间复杂度:O(n)
方法二:线段树
时间复杂度: O(logn)
什么是线段树?
种按照二叉树的形式存储数据的结构,每个节点保存的都是数组里某一段的总和
例如:
数组是[1,3,5,7,9,11]
例如:
leetcode 315.计算右侧小于当前元素的个数

5、树状数组 / Fenwick Tree / Binary Indexed Tree
也被称为 Binary Indexed Tree
先从一个例题出发
假设我们有一个数组 array[0 ... n-1],里面有 n 个元素,现在我们要经常对这个数组做两件事:
1.更新数组元素的数值
2.求数组前 k 个元素的总和(或者平均值)
方法一:线段树
时间复杂度: O(logn)
方法二:树状数组
时间复杂度: Ol(logn)
重要的基本特征
1)利用数组来表示多叉树的结构,和优先队列有些类似
2)优先队列是用数组来表示完全二叉树,而树状数组是多叉树
3)树状数组的第一个元素是空节点
4)如果节点 tree[y] 是 tree[x] 的父节点,那么需要满足 y=x-(x & (-x))
拓展练习
leetcode 308.维区域和检索-可变
求一个动态变化的二维矩阵里,任意子矩阵里的数的总和

总结:
优先队列:常见面试考点,实现过程比较繁琐。在解决面试中的问题时,实行"拿来主义"即可
图:被广泛运用的数据结构,如大数据问题都得运用图论
1)在社交网络里,每个人可以用图的顶点表示,人与人直接的关系可以用图的边表示
2)在地图上,要求解从起始点到目的地,如何行驶会更快捷,需要运用图论里的最短路径算法,
前缀树:出现在面试的难题中,要求能熟练地书写它的实现以及运用
线段树和树状数组:应用场合比较明确
如果要求在一幅图片当中修改像素的颜色,求解任意矩形区间的灰度平均值,则需要采用二维的线段树
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构基本介绍 的相关文章

随机推荐

  • MyBatis映射文件与核心配置文件

    目录 1 Mapper 映射文件 2 POJO类 3 Junit测试代码 4 MyBatis 配置文件详解 5 mapper 映射配置文件详解 1 Mapper 映射文件 在 MyBatis 中 推荐使用 mapper 作为包名 我们只需要
  • LeetCode 53. Maximum Subarray 最大连续字段和问题

    考察 最大连续字段和问题 解决问题时间复杂度 O n 问题隐含条件 如果给出的数集都是负数 那么最大连续字段和就是 最大的那个负数 eg 2 1 结果应该输出 1 而不是 0 int maxSubArray int nums int num
  • vue中 $event 的用法--获取当前父元素,子元素,兄弟元素

    vue中 event 的用法 获取当前父元素 子元素 兄弟元素
  • opencv-python常见方法使用教程(一)

    文章目录 一 OpenCV是什么 二 使用步骤 1 安装 2 读取图片 方式一 方式二 3 保存图片 4 图像的基本操作 像素操作 图像切割 图像平移 图像旋转缩放 图片大小调整 总结 一 OpenCV是什么 OpenCV是一个基于BSD许
  • springboot入门

    文章目录 springboot入门 1 spring boot简介 2 微服务 3 环境搭建 1 maven配置 2 sprintboot HelloWord 1 创建一个maven工程 jar 2 导入spring boot相关依赖 3
  • CCNP的考试是中文还是英文?

    思科的所有考试都是英文 虽然CCNP的考试对考生的学历 专业没什么要求 但是它的考试是全英文考试 如果你的英语水平太糟糕的话 不太建议你考 不然的话很可能连考试题目都看不懂 CCNP培训费用 分两种情况 线上 3000左右 线下 线下的两倍
  • 【JAVA】id:‘org.springframework.boot‘, version:‘2.3.3.RELEASE‘] was not found in any of the following

    以下内容 均为治疗下载不了gradle的包的问题 gradle 加载新引入的项目 然后下载包报错 id org springframework boot version 2 3 3 RELEASE was not found in any
  • 用element-ui渲染一个二级数据表格即复杂表格,并且自定标题

    最终完成的效果 废话不多说 直接上代码 不懂来问
  • 在已排序的数组中查找

    如果数组已经排好序了 就可以使用 Arrays binarySearch 执行快速查找 千万不要对 未排序的数组使用binarySearch 否则结果不可预料 下面的例子使用 RandIntGenerator填充数组 再用此生成器生成一个值
  • Ruoyi若依前后端分离框架【若依登录详细过程】

    本文主要写RuoYi项目前端登录流程 后端包含ruoyi admin ruoyi common ruoyi framework等多个模块 ruoyi admin为启动模块 先看一下ruoyi admin src main applicati
  • 实例说明列表、字典中元素的提取

    经过这几天工作的忙碌 我终于又静下心来 让我来分享一些实际的案例并分享它的做法 1 案例 获取下面列表当中的每一个值 不必在同一行显示 list 1 2 3 4 5 6 7 8 9 10 11 12 for x y in list prin
  • java openssh_java – 将openssh公钥转换为ssh2(RFC 4716)格式

    主要问题就在于此 将openssh公钥解析为符合 rfc 4716格式 唯一的问题是 它必须在java中 使用ssh keygen 它只是单行命令 ssh keygen e f openssh key pub 不幸的是 我在Java中找不到
  • VMware下桥接设置

    操作环境 主机 Win7 X86 SP1 虚拟机 VMware station 8 虚拟机里的系统 Fedora 15 环境上 不管什么系统 什么版本的虚拟机 使用上都是大同小异的 毕竟核心是不变的 VM虚拟机下linux系统 桥接和NAT
  • 利用GitHub搭建一个你的博客

    为什么要写博客 作为一只程序猿 踩到坑是一件非常正常的事 当我们踩到坑的时候就会花心思去研究它 可能我们能够在当时把问题弄懂并把问题给解决掉 可是过一段时间我们又遇到了同样的坑的时候 难道还要再去 百度 Google 重新搜索一遍吗 这样做
  • QT4.8.4安装步骤简述

    QT4 8 4安装步骤简述 win10上面安装QT4 8 4 creator 的步骤如下 首先需要软件 1 MinGW gcc440 1 zip 2 qt win opensource 4 8 4 mingw exe 3 qt creato
  • React生态之React环境搭建

    React特点 Declarative 声明式编码 Component Based 组件化编码 高效的DOM Diff 算法 最小化页面重绘 单向数据流 React 生态 React React Router Redux Axios Bab
  • 【蓝湖前端校招一面】

    蓝湖 一面 无笔试 直接约面试 时长一小时 讲讲项目中的难点 讲讲原型链 更改原型的方法有什么 proto setPrototypeOf 讲讲闭包 es6 的新数据结构知道哪些 Object 和 Map 的区别 一道 this 相关的输出题
  • 协方差矩阵与PCA深入原理剖析

    一 协方差矩阵 一个维度上方差的定义 协方差的定义 a 协方差就是计算了两个维度之间的相关性 即这个样本的这两个维度之间有没有关系 协方差为0 证明这两个维度之间没有关系 协方差为正 两个正相关 为负则负相关 协方差矩阵的定义 对n个维度
  • Unity期末AI足球游戏小项目(免费开源)

    目录 游戏介绍 整体结构 部分截图 答辩论文截图 答辩问题 该游戏项目仅供参考 下载链接在文末 若需要答辩论文请私聊 版本 Unity 2018 4 36 游戏介绍 Crazy Soccer 是一款有趣的足球模拟游戏 玩家将看到两个球队之间
  • 数据结构基本介绍

    数据结构基本介绍 1 基本数据结构 1 数组 字符串 Array String 优点 构建一个数组非常简单 能让我们在 O 1 的时间里根据数组的下标 index 查询到某个元素 缺点 构建时必须分配一段连续的空间 查询某个元素是否存在时需