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

数据结构--串、数组和广义表

  1. 定义:串(String)是由零个或多个字符组成的有限序列。

  2. 子串:串中任意个连续字符组成的子序列称为该串的子串。

  3. 主串:包含子串的串相应地称为主串。

  4. 字符位置:字符在该序列中的序号为该字符在串中的位置。

  5. 子串位置:子串第一个字符在主串中的位置。

  6. 空格串:由一个或多个空格组成的串,与空串不同。

  7. 存储结构

    • 顺序存储结构:字符在内存中连续存放。
    • 链式存储结构:字符通过指针链接在一起。
  8. 模式匹配:在主串中查找子串的过程,称为串的模式匹配或串匹配。常见的算法有Brute-Force(BF)算法和KMP算法。

串的类型定义、存储结构及其运算

串的类型定义

串,又称字符串,是由零个或多个字符组成的有限序列。一般记为S='a1a2…an',其中S是串名,a1a2…an是串值。由零个字符组成的串称为空串(Null String),其长度为零。仅由一个或多个空格组成的串称为空格串(Blank String),其长度为串中空格字符的个数。

在计算机科学中,串是数据结构中的一种基本类型,用于表示文本数据或其他字符序列。串的每个元素(或称为字符)都来自一个有限的字符集,如ASCII字符集或Unicode字符集。

在Java中,串(String)是一种内置的数据类型,它已经被Java标准库以类的形式实现。虽然Java提供了丰富的String类库来操作字符串,但仍然可以基于面向对象编程的原则,为串定义一个抽象数据类型(ADT),并规定其应支持的基本操作。以下是一个简化的串的抽象类型定义(ADT)及其在Java中的可能实现方式:

ADT String {// 基本操作String concat(String other);        // 串连接int indexOf(String str);            // 查找子串首次出现的位置String substring(int beginIndex);   // 截取子串(从beginIndex开始到末尾)String substring(int beginIndex, int endIndex); // 截取子串(从beginIndex到endIndex-1)boolean contains(String str);       // 判断是否包含子串int length();                       // 返回串的长度char charAt(int index);             // 返回指定位置的字符boolean isEmpty();                  // 判断是否为空串// ... 可以根据需要添加更多操作
}

创建一个自定义的String类(注意,这里的实现仅用于教学目的,并不推荐在实际项目中使用,因为Java内置的String类已经高度优化且功能完善)。

public class MyString {private char[] chars;private int length;// 构造函数public MyString(String str) {this.chars = str.toCharArray();this.length = str.length();}// 串连接public MyString concat(MyString other) {char[] newChars = new char[this.length + other.length];System.arraycopy(this.chars, 0, newChars, 0, this.length);System.arraycopy(other.chars, 0, newChars, this.length, other.length);return new MyString(new String(newChars));}// 查找子串首次出现的位置public int indexOf(MyString str) {// 简单的线性搜索算法,可以优化为KMP等算法for (int i = 0; i <= this.length - str.length; i++) {int j;for (j = 0; j < str.length && this.chars[i + j] == str.chars[j]; j++) {// 无需操作}if (j == str.length) {return i; // 找到匹配}}return -1; // 未找到匹配}// 截取子串(从beginIndex开始到末尾)public MyString substring(int beginIndex) {return new MyString(new String(this.chars, beginIndex, this.length - beginIndex));}// 截取子串(从beginIndex到endIndex-1)public MyString substring(int beginIndex, int endIndex) {return new MyString(new String(this.chars, beginIndex, endIndex - beginIndex));}// 判断是否包含子串public boolean contains(MyString str) {return this.indexOf(str) != -1;}// 返回串的长度public int length() {return this.length;}// 返回指定位置的字符public char charAt(int index) {if (index < 0 || index >= this.length) {throw new IndexOutOfBoundsException("Index: " + index + ", Length: " + this.length);}return this.chars[index];}// 判断是否为空串public boolean isEmpty() {return this.length == 0;}// 为了方便测试,重写toString方法@Overridepublic String toString() {return new String(this.chars);}// ... 可以根据需要添加更多操作
}

串的存储结构

串的存储结构主要有两种:静态存储结构和动态存储结构。

  1. 静态存储结构

    • 顺序存储结构:将串定义成字符型数组,由串名可以直接访问到串值。这种存储结构的特点是访问速度快,但空间利用率可能不高,因为需要预先分配一个足够大的数组空间。
    • 紧缩存储结构:为了节省空间,可以将多个字符存储在一个机器字内(如果机器字足够大)。这种存储结构可以减少空间浪费,但访问速度可能受到影响,因为需要额外的计算来提取字符。
  2. 动态存储结构

    • 链式存储结构:也称为链串,结构与链表类似。链串中每个结点有两种域,一种是数据域(data),用于存放字符串中的字符;另一种是指针域(next),用于存放后继结点的地址。这种存储结构可以灵活地扩展串的长度,但访问速度相对较慢。

此外,还有串的索引存储结构,其构造方法是:首先开辟一块地址连续的存储空间(又称为堆),用于存放各串本身的值。另外再建立一个索引表,在索引表的项目中存放串的名字、长度和在存储空间中的起始地址。这种存储结构适用于需要频繁查找和访问不同串的场景。

串的运算

串的运算主要包括以下几种:

  1. 串的匹配:在主串中查找子串的过程称为串的匹配。常见的串匹配算法有朴素的模式匹配算法(也称为布鲁特-福斯算法)和改进的模式匹配算法(如KMP算法)。这些算法的时间复杂度取决于主串和子串的长度以及匹配过程中的字符比较次数。
  2. 串的替换:在主串中查找并替换某个子串为另一个子串的过程。这通常涉及多次串匹配和插入/删除操作。
  3. 串的拼接:将两个或多个串连接成一个新的串。这可以通过顺序存储结构中的数组拼接或链式存储结构中的链表合并来实现。
  4. 串的截取:从主串中提取一个子串的过程。这通常涉及定位子串的起始和结束位置,并复制相应的字符到新的串中。
  5. 串的长度:计算串中字符的个数。这可以通过遍历串并计数字符来实现。
  6. 串的比较:比较两个串是否相等或确定它们的字典序大小关系。这通常涉及逐个比较字符的字符编码值。

数组

  1. 定义:数组是按一定格式排列起来的具有相同类型的数据元素的集合。

  2. 类型

    • 一维数组:如A=(a1,a2,a3,…,an)。
    • 二维数组:如矩阵,按行或列优先顺序存储。
    • 三维数组:按页/行/列存放,页优先的顺序存储。
  3. 特殊矩阵的压缩存储:对于某些具有特定规律的矩阵,如对称矩阵、三角矩阵、对角矩阵和稀疏矩阵,可以采用压缩存储方式来节省存储空间。

一维数组

  1. 定义:一维数组是由相同类型的数据元素按一定顺序排列的集合,每个元素都有一个唯一的下标(索引)来标识其在数组中的位置。
  2. 存储结构:一维数组在内存中占据一段连续的存储空间,每个元素按线性顺序排列。
  3. 访问方式:通过数组名和元素的下标来访问数组中的元素,例如array[i]表示访问一维数组array中第i个位置的元素。
  4. 应用:一维数组常用于存储线性数据,如学生的成绩、员工的工资等。

二维数组

  1. 定义:二维数组是由多个一维数组组成的数组,每个一维数组称为二维数组的行,而每个一维数组中的元素则称为二维数组的列。因此,二维数组可以看作是一个表格或矩阵。
  2. 存储结构:二维数组在内存中也是占据一段连续的存储空间,但它是按行或列的顺序存储的。通常,二维数组的第一维表示行,第二维表示列。
  3. 访问方式:通过数组名和两个下标(行号和列号)来访问二维数组中的元素,例如array[i][j]表示访问二维数组array中第i行第j列的元素。
  4. 应用:二维数组常用于存储具有行和列关系的数据,如学生的成绩表、矩阵运算等。

一维数组与二维数组的区别

  1. 存储结构:一维数组是线性存储的,而二维数组是矩阵(表格)形式存储的。
  2. 访问方式:一维数组通过单个下标访问元素,而二维数组通过两个下标(行号和列号)访问元素。
  3. 应用场景:一维数组适用于存储线性数据,而二维数组适用于存储具有行和列关系的数据。

广义表

  1. 定义:广义表(列表)是由n(n>=0)个表元素组成的有限序列,记作LS=(a0,a1,a2,…,an-1)。其中,LS是表名,ai是表元素,它可以是表(称为子表),也可以是数据元素(称为原子)。

  2. 表头:若LS非空(n>=1),则第一个元素a0是表头,记作head(LS)=a0。

  3. 表尾:除表头外的其他元素组成的表是表尾,记作tail(LS)=(a1,a2,…,an-1)。注意,表尾不是最后一个元素,而是一个子表。

  4. 递归定义:广义表可以递归地定义,即广义表中的元素可以是另一个广义表。

  5. 存储结构

    • 链式存储结构:使用链表来表示广义表,每个节点可以是原子节点(存储原子)或表节点(存储子表)。
  6. 特点

    • 广义表的结构相当灵活,可以兼容线性表、数组、树和有向图等各种常用的数据结构。
    • 广义表可以看成是线性表的推广,线性表是广义表的特例。

相关文章:

数据结构--串、数组和广义表

串 定义&#xff1a;串&#xff08;String&#xff09;是由零个或多个字符组成的有限序列。 子串&#xff1a;串中任意个连续字符组成的子序列称为该串的子串。 主串&#xff1a;包含子串的串相应地称为主串。 字符位置&#xff1a;字符在该序列中的序号为该字符在串中的位置…...

LLMs之Agent之Lares:Lares的简介、安装和使用方法、案例应用之详细攻略

LLMs之Agent之Lares&#xff1a;Lares的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;这篇博文介绍了 Lares&#xff0c;一个由简单的 AI 代理驱动的智能家居助手模拟器&#xff0c;它展现出令人惊讶的解决问题能力。 >> 背景痛点&#xff1a;每天都有新的…...

1-1.mysql2 之 mysql2 初识(mysql2 初识案例、初识案例挖掘)

一、mysql2 概述 mysql2 是一个用于 Node.js 的 MySQL 客户端库 mysql2 是 mysql 库的一个改进版本&#xff0c;提供了更好的性能和更多的功能 使用 mysql2 之前&#xff0c;需要先安装它 npm install mysql2 二、mysql2 初识案例 1、数据库准备 创建数据库 testdb CREAT…...

企业邮箱为什么不能经常群发邮件?

企业邮箱是用企业域名作为后缀的邮箱&#xff0c;虽然企业邮箱确实具备群发邮件的功能&#xff0c;但它更适用于企业内部的群发&#xff0c;而非用于外部推广。如果是在企业邮件域内进行群发&#xff0c;通常可以借助企业邮箱的邮件列表来实现。然而&#xff0c;对于域外的大量…...

集成运算放大电路反馈判断

集成运算放大电路 一种具有很高放大倍数的多级直接耦合放大电路&#xff0c;因最初用于信号运算而得名&#xff0c;简称集成运放或运放 模拟集成电路中的典型组件&#xff0c;是发展最快、品种最多、应用最广的一种 反馈 将放大电路输出信号的一部分或全部通过某种电路引回到输…...

媒体查询、浏览器一帧渲染过程

文章目录 媒体查询语法示例根据视口宽度应用不同的样式根据设备像素比应用不同的样式根据方向应用不同的样式 使用场景 浏览器一帧的渲染过程 媒体查询 媒体查询&#xff08;Media Query&#xff09;是CSS3中的一个重要特性&#xff0c;它允许开发者根据设备的特定条件&#x…...

高级排序算法(一):快速排序详解

引言 当我们处理大规模数据时&#xff0c;像冒泡排序、选择排序这样的基础排序算法就有点力不从心了。这时候&#xff0c;快速排序&#xff08;Quick Sort&#xff09;就派上用场了。 作为一种基于分治法的高效排序算法&#xff0c;快速排序在大多数情况下可以在O(n log n)的时…...

3.2 网络协议IP

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 1 定义2 虚拟互连网络3 分组在互联网中的传送4 IPv4 地址 1 定义 网际协议 IP是 TCP/IP 体系中两个最主要的协议之一&#xff0c;也是最重要的互连网协议之一。IPv4 和 IPv6 …...

2024 一带一路暨金砖国家技能发展与技术创新大赛【网络安全防护治理实战技能赛项】样题(中职组)

2024 一带一路暨金砖国家技能发展与技术创新大赛【网络安全防护治理实战技能赛项】样题&#xff08;中职组&#xff09; 1.基础设置和安全强化&#xff08;xxx 分&#xff09;1.3. 任务内容: 2.安全监测和预警&#xff08;xxx 分&#xff09;2.1. 任务一&#xff1a;建立目录安…...

excel如何让单元格选中时显示提示信息?

现象&#xff1a; 当鼠标放在单元格上&#xff0c;会出现提示信息&#xff1a; 先选中单元格选择上方的【数据】-【数据验证】图标选择【输入信息】勾上【选定单元格时显示输入信息】输入【标题】&#xff0c;如&#xff1a;最上方图中的&#xff1a;姓名&#xff1a;输入【输…...

oscp备考,oscp系列——Kioptix Level 3靶场

Kioptix Level 3 oscp备考&#xff0c;oscp系列——Kioptix Level 3靶场 nmap扫描 主机发现 └─# nmap -sn 192.168.80.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-09 00:33 CST Nmap scan report for 192.168.80.1 Host is up (0.00014s latency). MAC…...

信创改造-达梦数据库配置项 dm.ini 优化

设置模式&#xff1a;兼容MySQL&#xff0c;COMPATIBLE_MODE 4 内存占比&#xff1a;90%&#xff0c;MAX_OS_MEMORY 90 目标内存&#xff1a;2G&#xff08;不影响申请内存超过2G&#xff0c;但这部分内存不会回收&#xff09;&#xff0c;MEMORY_TARGET 2000 参考 https:…...

日本IT-需要掌握哪些技术框架?一篇通读

在日本从事IT工作&#xff0c;需要掌握的技术框架与全球范围内的趋势相似&#xff0c;但也有一些特定的技术和框架在日本更为流行。以下是一些在日本IT行业中常用的技术框架&#xff1a; Java后端 Java语言&#xff1a;Java在日本是一门非常稳定且受欢迎的编程语言&#xff0…...

错题:Linux C语言

题目&#xff1a;手写代码&#xff1a;判断一个数&#xff08;int类型的整数&#xff09;中有有多少1 题目&#xff1a;手写代码&#xff1a;判断一个数(转换成二进制表示时)有几个1 #include <stdio.h> int main(int argc, const char *argv[]) { //判断一个数&#xf…...

多表设计-一对多一对多-外键

一.多表设计概述&#xff1a; 二.一对多&#xff1a; 1.需求&#xff1a; 根据 页面原型 及 需求文档&#xff0c;完成部门及员工模块的表结构设计 -->部门和员工就是一对多&#xff0c;因为一个部门下会有多个员工&#xff0c;但一个员工只归属一个部门 2.页面原型&…...

Ch1:古今的manipulation与仿真、ROS和Drake介绍

不同的机器人研究与仿真 以前&#xff08;15年左右&#xff09;只能用仿真环境训练行走机器人&#xff0c;对于manipulation任务&#xff0c;有两个问题&#xff1a;1&#xff09;相机不真实&#xff1b;2&#xff09;接触行为太复杂。 I remember just a few years ago (~201…...

JAVA秋招面试题精选-第一天总结

目录 分栏简介&#xff1a; 问题一&#xff1a;订单表每天新增500W条数据&#xff0c;分库分表应该怎么设计&#xff1f; 问题难度以及频率&#xff1a; 问题导向&#xff1a; 满分答案&#xff1a; 举一反三&#xff1a; 问题总结&#xff1a; 问题二&#xff1a;解释…...

服务器卸载安装的 Node.js

卸载安装的 Node.js 版本&#xff0c;具体步骤取决于你是通过包管理器&#xff08;如 yum 或 dnf&#xff09;安装的&#xff0c;还是通过 nvm (Node Version Manager) 安装的。以下是针对这两种情况的指南。 通过包管理器卸载 Node.js 如果你是通过 yum 或 dnf 安装的 Node.…...

深度解析 Ansible:核心组件、配置、Playbook 全流程与 YAML 奥秘(下)

文章目录 六、playbook运行playbook方式Playbook VS ShellScripts忽略错误 ignore_errorshandlers和notify结合使用触发条件playbook中tags的使用playbook中变量的使用invertory参数模板templates迭代与条件判断迭代&#xff1a;with_items迭代嵌套子变量roles 六、playbook 运…...

使用go生成、识别二维码

1、下载 # 创建目录 # 进入目录 # 执行 go mod init xxx 命令&#xff08;即&#xff1a;在当前目录初始化创建一个模块&#xff09;# 下载gozxing go get github.com/makiuchi-d/gozxing 2、生成二维码 package mainimport ("image/png""os""gith…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...