线性表相关知识

news2024/11/25 4:24:31

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.coloradmin.cn/o/1071179.html

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

相关文章

可爱的回调函数

目录 一、作者声明&#xff1a; 二、什么回调函数&#xff1f; 三、库函数qsort为例&#xff0c;讲解回调函数 一、作者声明&#xff1a; 标题中的可爱纯纯是用来凑字数&#xff0c;没有特殊含义&#xff0c;因为可爱的平台不让用四个字作为标题&#xff01; 如果平台允许我…

上海未来产业创投联盟启动成立,和鲸Heywhale成为首批发起单位

第三届“海聚英才”全球创新创业峰会于近期举办&#xff0c;会上正式启动成立“上海未来产业创投联盟”&#xff0c;上海和今信息科技有限公司等 31 家单位成为首批发起单位。 为进一步坚定产业投资信心&#xff0c;营造最优人才生态&#xff0c;9月20日下午&#xff0c;第三届…

mstp vrrp bfd 实验

LSW1配置 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sys lsw1 [lsw1]vlan batch 10 20 30 [lsw1]int g0/0/1 [lsw1-GigabitEthernet0/0/1]port link-type access [lsw1-GigabitEthernet0/0/1]port default vlan 10 [lsw1-GigabitEthernet0…

ELK集群 日志中心集群

ES&#xff1a;用来日志存储 Logstash:用来日志的搜集&#xff0c;进行日志格式转换并且传送给别人&#xff08;转发&#xff09; Kibana:主要用于日志的展示和分析 kafka Filebeat:搜集文件数据 es-1 本地解析 vi /etc/hosts scp /etc/hosts es-2:/etc/hosts scp /etc…

铁路防护网RFID锁控,实现铁路防护网智能防盗防破坏

一、铁路防护网的挑战与需求 铁路防护网作为铁路运输系统中的重要组成部分&#xff0c;面临着安全性和防盗防破坏的挑战&#xff0c;传统的锁控系统存在以下问题&#xff1a; 1、安全隐患难以发现&#xff1a;传统锁控系统无法及时发现锁被剪断或破坏的情况&#xff0c;容易造…

【SpringCloud】Eureka原理分析、搭建Eureka服务、服务注册、服务发现

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 eureka 一、Eureka原理分析1.1 服务调用出现…

【项目开发 | C语言项目 | 贪吃蛇】

项目简单介绍 本项目是一个命令行版的贪吃蛇游戏。用户需要控制一个蛇在屏幕上移动&#xff0c;吃食物来增长&#xff0c;同时避免撞到边界和自己的身体。 一&#xff0c;开发环境需求 操作系统 &#xff1a;Windows 开发环境工具 &#xff1a;Qt, VSCode, Visual Studio 技…

springboot基于Web的社区医院管理服务系统springboot025

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

10.8队列安排,最少找字典次数,表达式转换与计算模拟(栈、队列)

队列安排1160 灵活的插入与删除 用队列实现的话&#xff0c;就是双端队列&#xff0c; 第一阶段是要找到对应编号的同学&#xff0c;然后根据p的取值决定是怎么插入 第二阶段也是要找到对应编号同学&#xff0c;之后就删除&#xff0c;如果找不到就返回 思路是这个思路&…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(六)

思维导图 一、正则表达式 1.1正则表达式介绍 1.2 语法 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewpor…

JavaWeb-Vue

JavaScript-Vue 什么是Vue Vue Vue是一套前端框架&#xff0c;免除原生JavaScript中的DOM操作&#xff0c;简化书写。基于MVVM&#xff08;Model-View-ViewModel&#xff09;思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上。官网&#xff1a;http…

若依项目新建子模块

官方资料:后台手册 | RuoYi 建设完成后测试详情 在新建的业务模块添加com.ruoyi.ding包&#xff0c;新建TestService.java&#xff1b; 在里面写测试代码返回hello 在ruoyi-admin新建测试类&#xff0c;调用helloTest&#xff0c;成功返回hello代表成功。

基于springboot实现汽车租赁管理系统项目演示【项目源码+论文说明】分享

基于springboot实现汽车租赁管理系统项目演示 摘要 随着社会的发展&#xff0c;计算机的优势和普及使得汽车租赁系统的开发成为必需。汽车租赁系统主要是借助计算机&#xff0c;通过对汽车租赁信息等信息进行管理。减少管理员的工作&#xff0c;同时也方便广大用户对个人所需汽…

(Vue3)defineOptions、defineModels Pinia及持久化

Vue3.3新特性defineOptions v-model和defineModel 开启特性vite.config.js中加配置 重启架子&#xff08;试验性质&#xff09;npm run dev Pinia Vue最新的状态管理工具&#xff0c;代替Vuex Pinia配置创建项目时自动添加 安装 npm install pinia 创建一个 pinia 实例 (根 s…

Unity简单操作:Unity接sdk写的java代码放在Plugins/Android/libs目录中即可被打进apk中,无需提前编译成jar

Unity项目&#xff0c;接入第三方sdk的时候&#xff0c;难免需要写一下java代码&#xff0c;之前的做法是把自己写的java先编译成一个game.jar&#xff0c;然后把game.jar放到Plugins/Android/libs目录中。 事实上&#xff0c;直接把java代码放在Plugins/Android/libs目录中即…

unity使用UniStorm 5.1.0.unitypackage增加天气

添加天天气组件unistorm 然后添加一个player 导入包会报错,需要修改代码 using UnityEngine; using UnityEngine.PostProcessing;namespace UnityEditor.PostProcessing {[CustomPropertyDrawer(typeof(UnityEngine.PostProcessing.MinAttribute))]sealed class MinDrawer : …

电商项目之如何扣减库存

文章目录 1 问题背景2 前言3 扣减库存的三种方案3.1 下单减库存3.2 付款减库存3.3 预扣库存 4 如何解决恶意买家下单的问题4.1 限制用户下单的数量4.2 标识恶意买家 5 实战&#xff1a;具体实现思路 1 问题背景 今天研究一下亿级流量的电商网站是怎么扣减库存 参考自&#xff1…

ml-dms-dataset实验

https://github.com/apple/ml-dms-dataset 数据集的两个问题&#xff1a; 部分图片失效images 和 labels不匹配 evaluation运行结果 论文中的结果&#xff1a; inference结果&#xff1a;

iPhone升级iOS17出现无法连接互联网的错误提示怎么办?

最新的iOS 17系统已经发布了快一个月了&#xff0c;很多人都已升级体验更多全新功能&#xff0c;但有部分用户却在升级过程中遇到一些问题&#xff1a;如无法验证更新&#xff0c;iOS17验证失败&#xff0c;因为您不再连接到互联网、 iPhone无法检查更新等错误问题。明明网络稳…

Java——String类的常见操作

Java String类的常见方法 package com.yushifu.javaAPI;import java.lang.reflect.Array; import java.util.Arrays; //String类的常见操作 public class Demo02 {public static void main(String[] args) {String s new String("ababbadc");//indexOf方法————…