当前位置: 首页 > news >正文

线性数据结构----(数组,链表,栈,队列,哈希表)

线性数据结构

  • 数组
  • 链表
    • 使用场景
  • 队列
    • 应用场景
  • 哈希表
    • 特点
    • 哈希函数,哈希值,哈希冲突
      • 键值对 Entry
    • 开放寻址法和拉链法
  • 参考文档

数组

  • 数组(Array) 是一种很常见的数据结构。由相同类型的元素组成,并且是使用一块连续的内存来存储的。

  • 在数组中 我们可以直接利用元素的索引(index)计算出该元素对应的存储地址

  • 数组的特点是:随机访问,但容量有限

      int[] arr = new int[n];访问:O(1)//访问特定元素插入/删除:O(n)//插入到数组头,或删除数组头元素--》都需要将数组中所有元素进行移动操作
    

链表

  • 有趣的理解(只是便于理解)
    可以这么理解链表

      把链表看成一个家庭关系(只查单线哈),把链表中的数据看成家庭里的人。有一天啊,来你家做人口调查怎么查呢?按常理--》从最年长的开始,比如:爷爷爷爷的孩子--》爸爸爸爸的孩子--》你你--》null这里,每个人,就相当于链表中的一个数据元素,它包括了爷爷本身 和 从爷爷出发找爸爸的指针同理,爸爸 也包括了它自身 和 指向你的指针你没有孩子,所以指针为空这就是,单链表
    
  • 链表分类(常见)

    • 单链表
    • 双向链表
    • 循环链表
    • 双向循环链表
  • 链表由一系列节点(链表中每一个元素成为节点)组成,节点在运行时动态生成,每个节点包括两个部分:

      - 数据域:存储数据元素- 指针域:存储下一个节点地址
    
    • 单链表
      在这里插入图片描述

    • 循环链表
      尾节点不指向null,而是指向头结点
      在这里插入图片描述

    • 双向链表
      包含两个指针,一个prev指向前一个节点,一个next指向后一个节点
      在这里插入图片描述

  • 双向循环
    在这里插入图片描述

  • 链表(LinkedList)

    • 虽然是一种线性表,但它和数组不同,它不是顺序存储的,而是使用不连续的内存空间存储数据(链表的结点一般都有后继指针next–》指向后面的元素存储位置)。
    • 因此,插入和删除操作:O(1);查找O(n)
    • 这种结构可以克服数组需要预先知道数据大小的缺点充分利用计算机的内存空间,实现灵活的内存动态管理。
    • 同时,也因此 链表不具有数组的随机读取的特点(必须知道目标位置元素的上一个元素)
  • 数组VS链表

    • 数组可以随机访问,链表不可以随机访问
    • 如果需要存储的数据元素的个数不确定,并且需要经常添加和删除数据的话,使用链表比较合适
    • 如果需要存储的数据元素的个数确定,并且不需要经常添加和删除数据的话,使用数组比较合适
    • 数组使用的是连续的内存空间,对CPU的缓存机制友好,链表则相反
    • 数组大小固定,而链表天然支持动态扩容。如果声明的数组过小,需要另外申请一个更大的内存空间放数组元素,然后将原数组拷贝进去(这个操作是比较耗时的!)

栈(Stack)就像个无顶的盒子
只允许在有序的线性数据集合的一端(称为栈顶top)进行加入数据(push)和移除数据(pop)的操作。
因而按照
后进先出
(LIFO,last in first out)的原理运作。
在栈中,push和pop的操作都发生在栈顶

在这里插入图片描述

  • 栈 常用一维数组或链表来实现,用数组实现的栈叫做顺序栈,用链表实现的栈叫做链式栈

使用场景

  • eg.实现浏览器的回退和前进功能

队列

  • 可以把队列看做是食堂打饭的队伍
    在这里插入图片描述

  • 队列(Queue)是先进先出(FIFO,first int first out)的线性表。

应用场景

当我们需要按照一定顺序来处理数据的时候,可以考虑使用队列这个数据结构。

哈希表

百科解释:

散列表(Hash
table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。

特点

提炼一下:

  • 哈希表(也叫散列表)。
  • 哈希表本质是一种数据结构----》特点可以根据一个key值直接访问数据,因此查找速度快

提到数据结构,特点是查找速度快的还有什么呢?

  • 数组—》所以,Hash Table本质就是一个数组
    ???那它跟数组有什么区别呢?

哈希函数,哈希值,哈希冲突

  • 这有一个例子:

      eg.在电话表里找“王三”这个人- 如果是数组,怎么找呢?---》遍历for(...){ if(...)... }- 那哈希表呢?我们把电话表中的数据,按照首字母进行分类然后,查找 ‘w’ 里面的数据从而,找到 “王二”
    

这里,我们把按首字母排序这个方法叫做哈希函数(散列函数)

键值对 Entry

  • 这还有个 不算例子

      我们都知道,哈希表经常存放的是一些键值对(key,value),jdk中把键值对叫做Entry。这是啥意思呢?就是key对应着value也就是value是由key通过哈希函数映射来的value就叫做哈希值(hash值)
    

啥玩应?

  • 这是个例子:

      eg. 王二的学生信息:002,王二我们根据之前说的,要有一个哈希函数,假设哈希函数的作用是 将002--》0那么 key = 0;value = 王二(0,王二)就是一个键值对(key,value)根据 0,我们可以查找出 王二 来
    

那 如何把kv对存到哈希表中呢?

	我们说了,哈希表本质还是个数组嘞根据 key 的值,就可以把value存到对应的位置上去

在这里插入图片描述
那这就有个问题了?

	如果 还有个学生 (007,翠花)key=0 value=翠花那不就和 王二的key冲突了吗?

这个就叫做哈希冲突(也叫做哈希碰撞)
怎么解决?

开放寻址法和拉链法

  • 开放寻址法
    在这里插入图片描述
    这里 会一直找不到空位置吗?

      不会的,对于HashMap来说,当它的增长因子(也叫负载因子),到达0.7--》比如,一共10个位置,被占了7位,那就要扩容了扩容 是create一个数组,是原来的2倍,然后把原数组的所有Entry都重新Hash一遍,放到新数组中重新hash 就是:把之前的数据,通过新的哈希函数计算出新的位置来存放。(因为数组扩大了,所以一般哈希函数也会有变化,就需要重新hash一遍)
    
  • 拉链法(常用)
    在这里插入图片描述

参考文档

  • github——JavaGuide项目
  • 来吧!一文彻底搞定哈希表!

相关文章:

线性数据结构----(数组,链表,栈,队列,哈希表)

线性数据结构 数组链表栈使用场景 队列应用场景 哈希表特点哈希函数,哈希值,哈希冲突键值对 Entry 开放寻址法和拉链法 参考文档 数组 数组(Array) 是一种很常见的数据结构。由相同类型的元素组成,并且是使用一块连续的内存来存储的。 在数组…...

lvgl 窗口 windows lv_port_win_visual_studio 版本 已解决

不知道的东西,不知道lvgl窗口。一切从未知开始 lv_port_win_visual_studio 主分支 对应的分支 v7版本更新git submodule update --init --recursive同步 lvgl代码随后打开 visualSudio 打开.sln 文件 编译 release模式 允许 一切正常代码部分...

【多模态融合】SuperFusion 激光雷达与相机多层次融合 远距离高清地图预测 ICRA 2024

前言 本文介绍激光雷达与相机进行多层次融合,包括数据级融合、特征级融合和BEV级融合。 融合后的BEV特征可以支持不同的任务头,包括语义分割、实例编码和方向预测,最后进行后处理生成高清地图预测,它是来自ICRA 2024的。 会讲解…...

富格林:梳理正规本领远离虚假套路

富格林悉知,黄金投资者在从事黄金交易之前,必须先了解黄金交易的风险。因为投资虽然能给你带来一定的收益,但往往也有亏损的风险。在进场后投资者可通过正规经验指导有效避免因为虚假诱导带来的异常亏损,增加安全做单盈利机会。以…...

fastadmin学习01-windows下安装部署

下载源代码 官网 安装 解压,然后使用phpstorm打开 修改配置文件 创建数据库 -- drop database fastadmin01; create database fastadmin01;这样fastadmin就部署好了 访问主页也能看到前台页面...

JAVA学习-网络编程.TCP

TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它在Java网络编程中被广泛应用。TCP通信可以确保数据的可靠传输,并且具有一定的顺序性。 一、Java中实现TCP通信主要有以下几种方式: 1. Socke…...

[Android]创建Google Play内购aab白包

开发时需要调试Google内购,需要先往Google商店传一个白包上去。确定包名,然后进行内购产品创建。 1.创建一个空项目,填写正式名称和正式包名。 如果你只是为一个测试开发账号打白包,然后进行内购测试,这时包名随便写…...

大数据基础:Linux基础详解

课程介绍 本课程主要通过对linux基础课程的详细讲解,让大家熟练虚拟机的安装使用,Linux系统的安装配置,学习掌握linux系统常用命令的使用,常用的软件安装方法,制作快照,克隆,完成免密登录&…...

unity中 鼠标按下移动端与pc端的位置

if (Input.GetMouseButtonDown(0)) { Vector2 V Input.touchCount > 0 ? Input.GetTouch(0).position : new Vector2(Input.mousePosition.x, Input.mousePosition.y); } 射线检测 if (Input.GetMouseButtonDown(0)) { …...

增强现实(AR)在广告中的力量

The Power of AR in Advertising 写在前面 增强现实(AR -Augmented Reality)是指借助软件、应用程序和智能手机、平板电脑或耳机等设备,为日常生活添加视觉和音频元素的技术。如今,品牌和广告商可以在营销活动中使用AR&#xff0…...

日志收集监控告警平台的选型思考

目前市面上比较常见的日志收集系统有:ELK,Grafana Loki,OpenObserve,SigNoz,Graylog ,Syslog-ng,Highlight,接下来我会对这几个一一做分析。 1. ELK ELK 是 Elasticsearch、Logsta…...

苹果Find My产品需求增长迅速,伦茨科技ST17H6x芯片供货充足

苹果的Find My功能使得用户可以轻松查找iPhone、Mac、AirPods以及Apple Watch等设备。如今Find My还进入了耳机、充电宝、箱包、电动车、保温杯等多个行业。苹果发布AirTag发布以来,大家都更加注重物品的防丢,苹果的 Find My 就可以查找 iPhone、Mac、Ai…...

题目:忐忑楼梯Ⅱ

问题描述: 解题思路: 利用差分,当第一个以后的差分元素都为零时就代表楼梯高度等于第一个楼梯的高度。为什么是第一个呢,因为以第一个为标准的区间操作数最少。 注意点:每次都只能加一或减一,ans开ll 题解&…...

TS函数类型

函数类型表达式 function hello(x: string) {console.log(x) } //greeter函数的参数是一个函数fn,fn也有一个string类型参数,无返回值。 function greeter(fn: (a: string) > void) {fn(hello) } greeter(hello)也可以把定义参数类型的语句单独提取出…...

数据链路层(四):数据链路层协议

目录 1 数据链路层协议1.1 异步协议1.2 同步协议1.3 局域网数据链路层协议1.4 广域网数据链路层协议 1 数据链路层协议 数据链路层“协议”也称为“规程”,数据链路控制协议也称数据链路控制规程。 数据链路控制协议主要分为异步协议和同步协议两大类。 1.1 异步协…...

#Linux系统编程(孤儿进程及僵尸进程以及wait函数)

(一)发行版:Ubuntu16.04.7 (二)记录: (1)概述 在 Unix/Linux 系统中,正常情况下,子进程是通过父进程创建的,且两者的运行是相互独立的&#xff…...

苍穹外卖项目-01(开发流程,介绍,开发环境搭建,nginx反向代理,Swagger)

目录 一、软件开发整体介绍 1. 软件开发流程 1 第1阶段: 需求分析 2 第2阶段: 设计 3 第3阶段: 编码 4 第4阶段: 测试 5 第5阶段: 上线运维 2. 角色分工 3. 软件环境 1 开发环境(development) 2 测试环境(testing) 3 生产环境(production) 二、苍穹外卖项目介绍 …...

学习笔记(16)函数防抖和节流

JavaScript 中的函数防抖(Debounce)和函数节流(Throttle)是两种优化频繁触发事件回调函数执行的技术,它们主要用于限制函数调用的频率,尤其是在处理高频率触发且响应开销较大的用户交互场景时。 函数防抖 …...

【揭秘】空号检测平台挑选秘籍:让每一分钱都花在“刀刃”上

在数字化营销时代,精准的数据是企业制胜的关键。而空号检测平台作为数据清洗的重要工具,其选择的正确与否直接影响到营销效果与成本效益。如何在众多平台中慧眼识珠,找到最适合自己的“黄金搭档”?今天,就跟着企讯通一…...

Linux源码包安装

目录 一、transmission源码包安装 二、 nginx源码包安装 一、transmission源码包安装 1、下载编译环境所需的软件包依赖 2、下载transmision源码包到用户主目录下 https://github.com/transmission/transmission/releases/download/4.0.5/transmission-4.0.5.tar.xz 3、解压…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

7.4.分块查找

一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...