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

线性数据结构

  • 数组
  • 链表
    • 使用场景
  • 队列
    • 应用场景
  • 哈希表
    • 特点
    • 哈希函数,哈希值,哈希冲突
      • 键值对 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项目
  • 来吧!一文彻底搞定哈希表!

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

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

相关文章

安装redis时候修改过的配置文件

只要是石头,到哪里都不会发光的 bind 绑定主机某个网卡对应的IP地址,如果某个主机有两个网卡A和B,那么绑定了A,通过B连接就会无法访问protected-mode 保护模式 Yes为只能本地访问port 启动的端口号pidfile pid存放的位置&#xff…

python django实战开发序列化器的一个应用心得分享

需求: 查询的时候返回不包括SharePasswd 字段, 但是新增操作需要用到该字段 再不写多个model模型和序列化器的前提下实现 如果您在查询(GET 请求)时不希望返回 SharePasswd 字段,但在新增(POST 请求)时需要用到该字段…

Python3爬取2023省市区

爬取地址https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/ import re import requests import pandas as pd import warnings warnings.filterwarnings("ignore") import time from lxml import etree import pymysql t ,urls ,names [],[],[] INDEX_URL &…

Java两地经纬度通过高德api获取两地距离(公里)

代码如下: String startLongitude entity.getLONGITUDE(); // 起点(当前位置)经度String startLatitude entity.getLATITUDE(); // 起点纬度String endLongitude entity.getLO(); // 终点经度String endLatitude entity.getLA(); …

Spring框架介绍及详细使用

前言 本篇文章将会对spring框架做出一个比较详细的讲解,并且每个知识点基本都会有例子演示,详细记录下了我在学习Spring时所了解到全部知识点。 在了解是什么spring之前,我们要先知道spring框架在开发时,服务器端采用三层架构的方…

电子元器件批发采购的数字化转型与技术应用

电子元器件批发采购的数字化转型和技术应用是提高效率、优化供应链管理以及增强竞争力的关键。以下是一些数字化转型和技术应用的方面: 电子商务平台:建立并优化电子商务平台,提供在线采购功能,使客户能够方便地浏览产品、下订单、…

ABNDP: Co-optimizing Data Access and Load Balance in Near-Data Processing——论文泛读

ASPLOS 2023 Paper 论文阅读笔记整理 问题 近数据处理(NDP)是一种很有前途的体系结构范式,可以解决数据密集型应用程序的内存墙挑战。基于3D堆叠存储器的典型NDP系统包含大量并行处理单元,每个并行处理单元都可以访问其本地存储…

HTML基础:8个常见表单元素的详解

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端程序媛。 后台回复“前端工具”可免费获取开发工具,持续更新。 今天来说说 HTML 表单。它是用于收集用户输入信息的元素集合。例如文本框、单选按钮、复选框、下拉列表等。 用户经常填写的表…

​深入理解JMeter性能测试日志:分析并发用户行为与吞吐量指标

在进行软件性能测试时,使用Apache JMeter等工具能够生成详尽的测试报告和日志。这些数据对于评估应用程序的性能至关重要。本文将针对JMeter生成的压测日志数据进行详细解析,并解释特定字段的意义。 日志数据摘要: 以下是整个JMeter压测日志…

2024智能EDM邮件营销系统使用攻略

在数字化营销领域,智能EDM(Electronic Direct Mail)邮件营销作为一种高效、精准的推广方式,正日益受到企业的高度重视。而要实现这一策略的成功落地,一个高可靠性和高稳定性的专业邮件发送平台则是不可或缺的关键环节。…

前后端实时数据通信

实现前后端实时数据转换通常涉及到以下几个步骤: 后端提供数据转换接口。 前端实时数据获取。 前端实时数据转换。 前端实时展示转换后数据。 以下是一个简单的例子,假设后端提供了一个接口来转换某种数据格式,前端使用JavaScript和WebS…

大数据分析案例-基于决策树算法构建大学毕业生薪资预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

前端发版上线出现白屏问题

目录 路由配置问题资源缓存问题首屏加载过慢 :喂,你的页面白啦! 出现上线白屏的问题有很多,如:配置错误、缓存问题、浏览器兼容问题,根据不同情况去解决。 路由配置问题 问题描述: 在vue开发…

C语言中位运算介绍

在C语言中,位运算是一种对二进制位进行操作的运算方式,它可以对数据的二进制表示进行位级别的操作,包括按位与、按位或、按位异或、按位取反等。位运算常用于处理底层数据结构、优化代码性能以及实现各种算法。本文将深入介绍C语言中的位运算…

两区域二次调频风火机组,麻雀启发式算法改进simulink与matlab联合

区域1结果 区域2结果 红色曲线为优化后结果〔风火机组二次调频〕

软件杯 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 &am…

鸿蒙操作系统-初识

HarmonyOS-初识 简述安装配置hello world1.创建项目2.目录解释3.构建页面4.真机运行 应用程序包共享包HARHSP 快速修复包 官方文档请参考:HarmonyOS 简述 1.定义:HarmonyOS是分布式操作系统,它旨在为不同类型的智能设备提供统一的操作系统&a…

vue3中onUnmounted详解

在 Vue 3 中,onUnmounted 是一个生命周期钩子,它会在组件实例被卸载(unmounted)和销毁之前被调用。这个钩子特别有用,因为它允许你在组件卸载时执行一些清理工作,比如取消定时器、移除事件监听器、清理手动…

JavaScript if用法练习

编写一个“个人所得税计算器”函数,练习if的用法 编写一个“个人所得税计算器”函数,接收一个参数表示一个工资值,方法最终返回该工资值应缴纳的个人所得税金额。假设个税计算梯度如下: * 3500元以下部分免征 * 3500~5000的部分缴…

jforgame-socket快速入门

1.jforgame-socket开发背景 1.1socket介绍 Socket是用于在计算机网络中实现通信的编程接口。它提供了一种通过网络在不同计算机之间传输数据的方式。不同http基于请求-响应模式,socket是全双工的,允许服务器、客户端同时向另外一端发送数据。由于socke…