线性表相关知识

1.简述

        线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据按照顺序(线性)的存储结构方式,存储在物理空间”。

按照空间分类:

顺序存储结构:数据依次存储在连续的物理空间中(顺序表);
链式存储结构:数据分散存储在不连续物理空间中,通过某种指向关系,来维持它们之间的逻辑关系(链表);

 

2.顺序表(数组)

        在Java中,我们通常使用数组来定义顺序表,同时,数组也是最基本的数据结构。它由相同类型的元素组成,并且是使用一块连续的内存来存储。使用下标来访问数组中的元素,首元素的下标从0开始,最后一个元素的下标是数组长度-1。

2.1.优缺点

内存地址连续,数组元素进行遍历时,速度快。
根据下标,查找指定位置的元素时,速度快。

长度固定,使用前需要预估长度。
插入删除元素时,时间复杂度相对较高。

2.2.时间复杂度

数组的长度为 n。

  • 访问特定位置的元素,时间复杂度为O(1)
  • 插入元素的时间复杂度为O(n) :插入元素时的最坏情况,新元素插入到数组的头部,需要移动n个元素。
  • 删除元素的时间复杂度为O(n) : 删除元素时的最坏情况,删除数组的的头部元素,需要移动n-1个元素

 

3.链表

3.1.结构

由以下两部分组成:

  • 1数据元素本身,其所在的区域称为数据域;
  • 2指向直接后继元素的指针,所在的区域称为指针域;

        在链表中,实际存储的是一个一个的节点,真正的数据元素包含在这些节点中,所以链表是一种在物理上非连续的数据结构,由若干个节点(Node)组成的一种线性存储结构。

3.2.优点

  • 不需要提前预估长度,可以克服数组需要预先知道数据长度的缺点
  • 使用不连续内存空间,充分利用计算机内存空间,实现灵活的内存动态管理

3.3.缺点

  • 会占用更多的空间,因为每个节点中,除了存放数据,还有存放指向其他节点的指针
  • 不能随机读取元素(RandomAccess)
  • 遍历和查找元素的速度比较慢

 3.4.时间复杂度

链表的插入和删除操作的复杂度为 O(1),查找一个节点或者访问特定位置的节点的时候复杂度为 O(n),最坏情况下需要遍历整个链表。

3.5.链表分类

单项链表

        每一个节点Node中包含1个数据域和1个指针域。数据域是存放数据的变量data,指针域是指向下一个节点的指针next,所以单向链表只有一个方向。

//单向链表的节点

static class Node<E>{

        E data; // 数据域

        Node<E> next; // 后继节点(指针域)

        public Node(E data) {

                this.item = data;

        }

}

循环链表

双向链表

        每个节点Node中包含2个指针域和1个数据域,指针域next指向后一个节点, prev 指向前一个节点,数据域item用于存储数据。

// 双向链表的节点

public static class Node<E> {

        E item; // 数据域

        Node<E> next; // 后继节点

        Node<E> prev; // 前驱节点

        // 构造方法

        Node(Node<E> prev, E element, Node<E> next) {

                 this.prev = prev; // 参数1:前驱节点

                this.item = element; // 参数2:数据域

                this.next = next;// 参数3:后继节点       

        }

}

 双向循环链表

 

4.顺序表和链表的区别

4.1.适用场景

顺序表(数组)可以通过下标快速定位元素,遍历速度快,适合读多写少的应用场景;
链表插入和删除元素效率高,适合读少写多的应用场景;
顺序表(数组)的长度固定,如果声明的数组过小,需要另外申请更大的内存空间+拷贝原数组进行扩容。而链表支持动态扩容。

 4.2.开辟空间的方式

        顺序表(数组)存储数据实行的是 "一次开辟,永久使用",即存储数据之前先开辟好足够的存储空间,空间一旦开辟后期无法改变大小(使用动态数组的情况除外)。

        链表存储数据时一次只开辟存储一个节点的物理空间,如果后期需要,还可以再申请。

所以:若只从空间角度去考虑,当存储数据的个数无法提前确定,又或是物理空间无法一次性申请到足够大小的空间时,使用链表更有助于问题的解决。

4.3.空间利用率

顺序表(数组)的空间利用率显然要比链表高。

  1. 链表每次申请空间相对随机,容易产生空间碎片,一定程序上造成了空间浪费。
  2. 链表由于链表中每个数据元素都必须携带至少一个指针保证线性关系。

 4.4.各种操作的时间复杂度

查找修改插入删除
数组O(1)O(1)O(n)O(n)
链表O(n)O(1)O(1)O(1)

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

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

相关文章

【Zookeeper专题】Zookeeper经典应用场景实战(一)

目录 前置知识课程内容一、Zookeeper Java客户端实战1.1 Zookeeper 原生Java客户端使用1.2 Curator开源客户端使用快速开始使用示例 二、Zookeeper在分布式命名服务中的实战2.1 分布式API目录2.2 分布式节点的命名2.3 分布式的ID生成器 三、zookeeper实现分布式队列3.1 设计思路…

完美解决 flex 实现一行三个,显示多行,左对齐

效果图 代码 <body><section class"content"><div class"item">元素</div><div class"item">元素</div><div class"item">元素</div><div class"item">元素</di…

【MySQL】Linux 中 MySQL 环境的安装与卸载

文章目录 Linux 中 MySQL 环境的卸载Linux 中 MySQL 环境的安装 Linux 中 MySQL 环境的卸载 在安装 MySQL 前&#xff0c;我们需要先将系统中以前的环境给卸载掉。 1、查看以前系统中安装的 MySQL rpm -qa | grep mysql2、卸载这些 MySQL rpm -qa | grep mysql | args yum …

关于Jupyter markdown的使用

一级标题 #空格 标题1 二级标题 ## 空格 标题2 三级标题 ###空格 标题3 无序&#xff1b; 有序&#xff1a; 数学符号&#xff1a;

Rust Http 性能测试框架/工具

在Rust中&#xff0c;有几个常用的性能测试框架和工具可用于对HTTP性能进行测试。以下是其中一些&#xff1a; 1、Criterion&#xff1a;Criterion是一个通用的性能测试框架&#xff0c;可以用于测试各种类型的代码性能&#xff0c;包括HTTP性能。你可以使用Criterion来编写和运…

正则验证用户名和跨域postmessage

一、正则验证用户名 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录</title> </head> <body> <form action"/login" method"post"><input type…

蓝桥杯每日一题2023.10.2

时间显示 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 输入为毫秒&#xff0c;故我们可以先将毫秒转化为秒&#xff0c;由于只需要输出时分&#xff0c;我们只需要将天数去除即可&#xff0c;可以在这里多训练一次天数判断 #include<bits/stdc.h> using namespace std…

【网络安全 --- kali2023安装】超详细的kali2023安装教程(提供镜像资源)

如果你还没有安装vmware 虚拟机&#xff0c;请参考下面博客安装 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;https://blog.csdn.net/m0…

python代码封装二进制文件并使用C#调用方案

思路 首先使用Cython库将python代码生成二进制文件pyd&#xff0c;然后使用C#中的pythonnet的Nuget包来进行调用&#xff0c;python代码中可以使用第三方类库。 Cython使用 Cython的安装 在命令行中使用如下语句即可安装Cython pip install cythonpyd文件格式 Cython用于…

openGauss学习笔记-93 openGauss 数据库管理-访问外部数据库-oracle_fdw

文章目录 openGauss学习笔记-93 openGauss 数据库管理-访问外部数据库-oracle_fdw93.1 编译oracle_fdw93.2 使用oracle_fdw93.3 常见问题93.4 注意事项 openGauss学习笔记-93 openGauss 数据库管理-访问外部数据库-oracle_fdw openGauss的fdw实现的功能是各个openGauss数据库及…

Umijs介绍

今天我们来看 umijs 我们访问官网 https://umijs.org/ 这是一个可 插拔的企业级 React框架 当然 你也可以选择 React 的一个脚手架 但是 这样就有很多需要考虑的东西 用这个umi 很多点 我们就不需要考虑了 框架已经帮我们配置好了 这边 我们点击快速上手的一个 指南 我们可…

数据结构刷题训练——二叉树篇(一)

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

贪心找性质+dp表示+矩阵表示+线段树维护:CF573D

比较套路的题目 首先肯定贪心一波&#xff0c;两个都排序后尽量相连。我一开始猜最多跨1&#xff0c;但其实最多跨2&#xff0c;考虑3个人的情况&#xff1a; 我们发现第3个人没了&#xff0c;所以可以出现跨2的情况 然后直接上dp&#xff0c;由 i − 1 , i − 2 , i − 3 i…

谷歌浏览器驱动下载

谷歌浏览器驱动下载 在使用selenium进行网页操作的时候通常会用到驱动器。以下是谷歌浏览器驱动下载方式。 谷歌浏览器驱动下载链接&#xff1a;https://chromedriver.chromium.org/downloads 打开连接后按照下图步骤进行操作&#xff1a; 查找出自己谷歌浏览器版本后根据以…

【单元测试】如何使用 JUnit5 框架?

JUnit5 单元测试框架使用教程 一、Junit5 是什么&#xff1f; Junit5是一个用于在Java平台上进行单元测试的框架。JUnit 5 框架主要由三部分组成&#xff1a;JUnit Platform、JUnit Jupiter 和 JUnit Vintage。 JUnit Platform&#xff1a;定义了测试引擎的 API&#xff0c;是…

[yolo系列:yolov7添加可变形卷积Deformable Conv V2]

yolo系列文章目录 文章目录 yolo系列文章目录一、可变形卷积是什么&#xff1f;二、使用步骤1.在models/common.py文件添加2.然后再yolo.py里面添加DCNv23.修改yolov7的yaml 总结参考文章 一、可变形卷积是什么&#xff1f; 可变形卷积即DCN&#xff08;缩写取自Deformable Con…

天启科技联创郭志强:趟遍教育行业信数化沟坎,创业智能赛道重塑行业生态

郭志强 天启科技联合创始人 近20年互联网、企业信息化、数字化实施、管理及培训经验。对于集团型企业及初创企业、传统企业及互联网企业的信息化、数字化转型有自己独到的见解和实操经验。具备跨区域、集团化信息规划、解决方案、系统架构及企业流程搭建、优化和技术团队管理能…

leetCode 674. 最长连续递增序列 动态规划 / 贪心策略

674. 最长连续递增序列 - 力扣&#xff08;LeetCode&#xff09; 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r&#xff08;l < r&#xff09;确定&#xff0c;如果对于每…

Qt之实现圆形进度条

在Qt自带的控件中&#xff0c;只有垂直进度条、水平进度条两种。 在平时做页面开发时&#xff0c;有些时候会用到圆形进度条&#xff0c;比如说&#xff1a;下载某个文件的下载进度。 展示效果&#xff0c;如下图所示&#xff1a; 实现这个功能主要由以下几个重点&#xff1a…

php 安装mongodb扩展模块,rdkafka模块

mongodb mongodb扩展下载 选择php版本&#xff0c;根据报错提示&#xff0c;选择扩展对应的版本选择非安全进程将php_mongodb.dll放到php/ext目录下修改php.ini配置&#xff0c;添加extensionphp_mongodb.dll开启php_mongodb扩展&#xff0c;重启服务php -m 查看是否开启成功…