【计算机基本原理-数据结构】八大数据结构分类

news2024/11/24 5:20:53

【计算机基本原理-数据结构】八大数据结构分类

  • 1)数组
  • 2)链表
  • 3)队列
  • 4)栈
  • 5)树
  • 6)图
  • 7)堆
  • 8)散列表(哈希表)

数据结构是计算机存储、组织数据的方式。一种好的数据结构可以带来更高的运行或者存储效率。数据在内存中是呈线性排列的,但是我们可以使用指针等道具,构造出类似“树形”的复杂结构。下面介绍八个常见的数据结构。如图所示:

在这里插入图片描述

1)数组

数组是可以再内存中连续存储多个元素的结构,在内存中的分配也是连续的。数组是一种线性结构,而且在物理内存中也占据着一块连续空间。数组中的元素通过数组下标进行访问,数组下标从 0 开始。例如下面这段代码就是将数组的第一个元素赋值为 1。

int[] data = new int[100];
data[0]  = 1;
  • 优点:

    1、按照索引查询元素速度快

    2、按照索引遍历数组方便

  • 缺点:

    1、数组的大小固定后就无法扩容了

    2、数组只能存储一种类型的数据

    3、添加,删除的操作慢,因为要移动其他的元素。

  • 适用场景:

    频繁查询,对存储空间要求不大,很少增加和删除的情况。

2)链表

链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域(内存空间),另一个是指向下一个结点地址的指针域。

在这里插入图片描述

  • 优点:

    1、链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素。

    2、添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快。

  • 缺点:

    1、因为含有大量的指针域,占用空间较大。

    2、查找元素需要遍历链表来查找,非常耗时。

  • 适用场景:

    数据量较小,需要频繁增加,删除操作的场景

数据访问因为数据都是分散存储的,所以想要访问数据,只能从第一个数据开始,顺着指针的指向逐一往下访问。

在这里插入图片描述

数据添加将Blue的指针指向的位置变成Green,然后再把Green的指针指向Yellow。

在这里插入图片描述

数据删除只要改变指针的指向就可以了,比如删除Yellow,只需把Green指针指向的位置从Yellow编程Red即可。

虽然Yellow本身还存储在内存中,但是不管从哪里都无法访问这个数据,所以也就没有特意去删除它的必要了。今后需要用到Yellow所在的存储空间时,只要用新数据覆盖掉就可以了。

在这里插入图片描述

3)队列

队列与栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端取出元素,也就是:先进先出。从一端放入元素的操作称为入队,取出元素为出队

在这里插入图片描述

  • 注意 :

    栈是先进后出,队列是先进先出——两者虽然都是线性表,但原则是不同的,结构不一样嘛。

  • 使用场景 :

    因为队列先进先出的特点,在多线程阻塞队列管理中非常适用。

4)栈

栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作

栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈

栈的结构就像一个集装箱,越先放进去的东西越晚才能拿出来,所以,栈常应用于实现递归功能方面的场景,例如斐波那契数列。

在这里插入图片描述

5)树

树是一种典型的非线性结构,它是由 n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做 “树” 是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

  • 特点:

    1、每个节点有零个或多个子节点。

    2、没有父节点的节点称为根节点。

    3、每一个非根节点有且只有一个父节点。

    4、除了根节点外,每个子节点可以分为多个不相交的子树。

在日常的应用中,我们讨论和用的更多的是树的其中一种结构,就是二叉树。二叉树是树的特殊一种。

  • 二叉树特点:

    1、每个结点最多有两颗子结点。

    2、左子树和右子树是有顺序的,次序不能颠倒。

    3、即使某结点只有一个子树,也要区分左右子树。

二叉树是一种比较有用的折中方案,它添加,删除元素都很快,并且在查找方面也有很多的算法优化,所以,二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。

树有很多扩展的数据结构,包括平衡二叉树、红黑树、B+树等,这些数据结构二叉树的基础上衍生了很多的功能,在实际应用中广泛用到,例如 mysql 的数据库索引结构用的就是B+树,还有 HashMap 的底层源码中用到了红黑树。这些二叉树的功能强大,但算法上比较复杂,想学习的话还是需要花时间去深入的。

6)图

图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。按照顶点指向的方向可分为无向图和有向图:

  • 有向图:

在这里插入图片描述

  • 无向图:

在这里插入图片描述

7)堆

堆是一种图的树形结构,被用于实现“优先队列”(priority queues)。优先队列是一种数据结构,可以自由添加数据,但取出数据时要从最小值开始按顺序取出。在堆的树形结构中,各个顶点被称为“结点”(node),数据就存储在这些结点中。

  • 堆的特点:

    1、每个节点最多有两个子节点。

    2、排列顺序必须从上到下,同一行从左到右。

    3、堆中某个节点的值总是不大于或不小于其父节点的值。

    4、存放数据时,一般会把新数据放在最下面一行靠左的位置。如果最下面一行没有多余空间时,就再往下另起一行,并把数据添加到这一行的最左端。

  • 堆的性质:

    1、堆是一个完全二叉树。

    2、堆中某个结点的值总是不大于或不小于其父结点的值。

  • 将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。
  • 一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树
  • 一棵深度为k 且有2^k - 1个结点的二叉树称为满二叉树。也就是说除了叶子节点都有2个子节点,且所有的叶子节点都在同一层。

在这里插入图片描述

8)散列表(哈希表)

哈希表,也叫散列表,是根据关键码和值 (key和value) 直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。例如,下列键(key)为人名,value为性别。

一般来说,我们可以把键当作数据的标识符,把值当作数据的内容。

在这里插入图片描述

  • 具有以下的性质:

    1、可以利用哈希函数快速访问到数组的目标数据。如果发生哈希冲突,就使用链表进行存储。

    2、如果数组的空间太小,使用哈希表的时候就容易发生冲突,线性查找的使用频率也会更高;反过来,如果数组的空间太大,就会出现很多空箱子,造成内存的浪费。因此,给数组设定合适的空间非常重要。

    3、在存储数据的过程中,如果发生冲突,可以利用链表在已有数据的后面插入新数据来解决冲突。这种方法被称为“链地址法”。除了链地址法以外,还有几种解决冲突的方法。其中,应用较为广泛的是“开放地址法”。

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

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

相关文章

Java基础(十三)系统相关类

1. 系统相关类 1.1 java.lang.System类 System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。 由于该类的构造器是private的,所以无法创建该类的对象。其内部的成员变量和成员方法都是static的,所以也可…

Netty(一)深入Hotspot源码与Linux内核理解NIO与Epoll

深入Hotspot源码与Linux内核理解NIO与Epoll 前言介绍Netty 的介绍Netty 的应用场景理解阻塞和同步关键字初始BIO、NIO、AIOBIO(Blocking IO)缺点:应用场景: NIO(Non Blocking IO)应用场景:NIO非阻塞代码示例存在的问题 NIO 有三大核心组件&am…

Mybatis学习基础篇(一)——使用Maven快速搭建一个mybatis项目,并实现简单的增删改查

题外话: 在了解mybatis框架之前,我先说明一句,目前主流的框架技术层出不穷,每个人都有自己喜欢的技术框架,自己喜欢用就行。技术并没有高低之分,喜欢用就用,虽然目前大部分人都喜欢向新技术看齐…

flex布局下两端对齐,不满左对齐

文章目录 解决方案一 (利用父级的 :after 占位)解决方案二(利用:last-child和:nth-child()占位)解决方案三(补位添加节点法,这种方案适用于多种排列方式) 问题情境: 在flex布局下,多行排列,如何让flex布局最后一行没有排满时&…

如何构建适合自己的DevOps软件测试改进方案

根据2022年的DevOps全球调查报告显示,主流软件企业采用或部分采用DevOps且已获得良好成效的占比已达70%,DevOps俨然成为当下软件开发研究的重要方向。 测试作为软件开发的必要过程,是提升软件可靠性、保证软件质量的关键环节。然而&#xff…

上海亚商投顾:沪指失守3300点 传媒、游戏板块逆市大涨

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 三大指数今日继续调整,沪指午后跌超1%,失守3300点整数关口,创业板指一度跌逾2%…

基于PWM技术的三相光伏逆变器研究(Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【手把手做ROS2机器人系统开发二】熟悉ROS2基本命令

【手把手做ROS2机器人系统开发二】熟悉ROS2基本命令 一、上讲回顾 在上一讲开发环境搭建中,我们讲解了如何搭建Ubuntu系统环境和ROS2开发运行环境。 1.Ubuntu系统安装 2.ROS2系统环境安装 二、ROS2核心命令讲解 1、daemon-各种守护进程相关的子命令 查看帮助&am…

[网络原理] 详解Cookie与Session

做好准备,迎接所有的成功吧 文章目录 1. Cookie的概念2. Session的概念3. Cookie与Session的关联与区别3.1 关联3.2 区别 4. Cookie与Session中的核心方法 1. Cookie的概念 Cookie是用户首次登陆网站成功之后,对应页面的服务器会返回给用户一个身份标识,被保存在用户主机的硬盘…

无人机视频与GIS融合三维实景怎么实现?

无人机视频与GIS融合三维实景怎么实现?无人机三维GIS作为一项新兴的测绘重要手段,具有续航时间长、成本低、机动灵活等优点,为城市的规划建设带来极大便利。 那么此项技术有什么样的特点呢?下面智汇云舟就带大家一起来了解一下。 三维是将采集以及经运…

leetcode 1416. Restore The Array(恢复数组)

一台打印机没有把空格打印出来,以至于不知道打印出的 s 中到底有哪些数字。 现在知道数字的取值范围在1 ~ k, 数字开头不能是0. 返回可能的数字个数。取模1097. 思路: DP 假设dp[ i ]为 i ~ n位的s 所能组成的数字组合数。 从右到左遍历,…

【云原生进阶之容器】第六章容器网络6.7.1--阿里云Terway网络模式综述

《云原生进阶之容器》专题索引: 第一章Docker核心技术1.1节——Docker综述第一章Docker核心技术1.2节——Linux容器LXC第一章Docker核心技术1.3节——命名空间Namespace第一章Docker核心技术1.4节——chroot技术第一章Docker核心技术1.5.1节——cgroup综述

如何在在一个账户内管理多个WhatsApp号

许多企业拥有多个WhatsApp Business账户。这可能是因为他们在多个地点都有商店,或者可能在全球范围内都有客户,并希望用当地语言迎合他们每个人。 无论出于何种原因,管理多个WhatsApp企业帐户既耗时又困难。但是,如果我们说有一种…

LoadRunner参数化最佳实践:让你的性能测试更加出色!

距离上次使用loadrunnr 已经有一年多的时间了。初做测试时在项目中用过,后面项目中用不到,自己把重点放在了工具之外的东西上,认为性能测试不仅仅是会用工具,最近又想有一把好的利器毕竟可以帮助自己更好的完成性能测试工作。这算…

【AI实战】微小目标检测模型MMDet-RFLA--训练环境从零开始搭建

【AI实战】微小目标检测模型MMDet-RFLA--训练环境搭建 RFLA介绍环境搭建安装依赖参考 RFLA介绍 官方连接 https://github.com/Chasel-Tsui/mmdet-rflaarxiv https://arxiv.org/abs/2208.08738 环境搭建 我的机器的cuda是10.2,根据自己的cuda版本到 https://hub.do…

python使用KDDockWidget

编译原理:KDDockWidget是一个C库,通过shiboken转成python的绑定支持。针对特殊版本,需要在cmake文件中增加一些变量。 注:本次编译,Qt版本统一指定为6.4.2,库支持Qt>5.12或6.2.0以上版本 下载仓库 Git…

解决npm安装慢卡顿reify:ajv: timing reifyNode问题、报错require() of ES Module

网上方法众多,但是都没有具体说明原因和具体解决办法 镜像优先推荐:cnpm 和 taobao 文章目录: 第一个错:Error [ERR_REQUIRE_ESM]: require() of ES Module 1.来源 2.错误显示 3.问题解决 第二个错: 卡顿在reify:…

(原创)Flutter基础入门:手把手教你搭建Flutter混合项目

前言 Flutter是Google开源的构建用户界面(UI)工具包 支持在不同平台构建一致的ui效果 但在实际业务中,一般不会整个APP都用纯Flutter开发 尤其一些老的项目,会采用接入Flutter的方式来混合开发 那么今天就主要讲一下如何搭建一个…

0424作业

实现串口收发字符/字符串 uart4.c #include "uart4.h"void hal_uart_init() {//rcc初始化//使能CPIOB组控制器RCC->MP_AHB4ENSETR | (0x1 << 1);//使能CPIOG组控制器RCC->MP_AHB4ENSETR | (0x1 << 6);//使能UART4控制器RCC->MP_APB1ENSETR | …

Linux网路服务之PXE网络批量装机和Kickstart全自动化安装

文章目录 一 、PXE网络批量装机的简介和相关知识1.1 什么是PXE1.2搭建PXE 远程安装服务器1.3 PXE装机的过程描述 二、PXE批量安装的具体操作过程2.1安装并启用 TFTP 服务2.2安装并启用 DHCP 服务2.3准备 Linux 内核、初始化镜像文件2.4准备 PXE 引导程序2.5安装FTP服务&#xf…