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

串、数组和广义表

1. 串

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412021944459.png

1.1 串的定义

串(string)是由零个或多个字符组成的有限序列。一般记为

S = a 1 a 2 . . . a n ( n ≥ 0 ) S=a_1a_2...a_n(n\geq0) S=a1a2...an(n0)

其中,S是串名,单引号括起来的字符序列是串的值, a i a_i ai可以是字母、数字或其他字符;串中字符的个数n称为串的长度。n=0时的串称为空串(用表示)。

1.2 串的模式匹配

1.2.1 朴素模式匹配

使用暴力求解的方法,一直遍历,但时间复杂度过高。

int ViolentMatch(string &s, string &t)
{int i = 0, j = 0;while (i < s.size() && j < t.size()){if (s[i] == t[j]){i++;j++;}else{i = i - j + 1;j = 0;}}if (j == t.size())return i - j;elsereturn -1;
}

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412022043282.png

1.2.2 KMP算法

vector<int> make_next(const string &s)
{int i = 0, j = -1;vector<int> next(s.size() + 1, 0); // Initialize the vector with the correct sizenext[0] = -1;                      // Set the first element to -1while (i < s.size()){if (j == -1 || s[i] == s[j]){i++;j++;next[i] = j;}elsej = next[j];}return next;
}
int KMP(const string &s, const string &t)
{int i = 0, j = 0;vector<int> next = make_next(t);while (i < s.size() && j < (int)t.size()){if (j == -1 || s[i] == t[j]) // Fix the logic error here{i++;j++;}elsej = next[j];}if (j == t.size())return i - j;return -1;
}

2. 数组和广义表

2.1 数组

2.1.1 数组的定义

数组是由n(n>1)个相同类型的数据元素构成的有限序列,每个数据元素称为一个数组元素,每个元素在n个线性关系中的序号称为该元素的下标,下标的取值范围称为数组的维界。

数组与线性表的关系:数组是线性表的推广。一维数组可视为一个线性表;二维数组可视为其元素是定长数组的线性表,以此类推。数组一旦被定义,其维数和维界就不再改变。因此,除结构的初始化和销毁外,数组只会有存取元素和修改元素的操作。

2.1.2 数组的存储结构

大多数计算机语言都提供了数组数据类型,逻辑意义上的数组可采用计算机语言中的数组数据类型进行存储,一个数组的所有元素在内存中占用一段连续的存储空间。

以一维数组 A[0…n-1]为例,其存储结构关系式为

L O C ( a i , j ) = L O C ( a 0 , 0 ) + i × L ( 0 ≤ i ≤ n ) LOC(a_{i,j})=LOC(a_{0,0})+i\times L (0\leq i\leq n) LOC(ai,j)=LOC(a0,0)+i×L(0in)

其中L是每个存储单元的大小。

对于多维数组,有两种映射方法:按行优先和按列优先。以二维数组为例,按行优先存储的基本思想是:先行后列,先存储行号较小的元素,行号相等先存储列号较小的元素。设二维数组的行下标与列下标的范围分别为[0, h 1 h_1 h1]与[0, h 2 h_2 h2],则存储结构关系式为

L O C ( a i , j ) = L O C ( a 0 , 0 ) + [ i × ( h 2 + 1 ) + j ) × L LOC(a_{i,j})=LOC(a_{0,0})+[i\times (h_2+1)+j)\times L LOC(ai,j)=LOC(a0,0)+[i×(h2+1)+j)×L

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412022102961.png

2.2 特殊矩阵的压缩存储

压缩存储:指为多个值相同的元素只分配一个存储空间,对零元素不分配空间。

特殊矩阵:指具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有一定规律性的矩阵。常见的特殊矩阵有对称矩阵、上(下)三角矩阵、对角矩阵等。

特殊矩阵的压缩存储方法:找出特殊矩阵中值相同的矩阵元素的分布规律,把那些呈现规律性分布的、值相同的多个矩阵元素压缩存储到一个存储空间中。

2.2.1 对称矩阵

对于矩阵 A A A元素满足性质 a i , j = a j , i ​ a_{i,j}=a_{j,i}​ ai,j=aj,i,则其为对称矩阵。

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412022108424.png

由于其上三角与下三角元素相同,使用二维数组会浪费空间,故使用一维数组存储来压缩空间。如下图所示,数组下标从0开始。

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412022112698.png

2.2.2 三角矩阵

下三角矩阵:

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412022114196.png

上三角矩阵:

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412022115595.png

2.2.3 三对角矩阵

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412022116892.png

2.2.4 稀疏矩阵

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412022119078.png

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

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

相关文章

无再暴露源站!群联AI云防护IP隐匿方案+防绕过实战

一、IP隐藏的核心原理 群联AI云防护通过三层架构实现源站IP深度隐藏&#xff1a; 流量入口层&#xff1a;用户访问域名解析至高防CNAME节点&#xff08;如ai-protect.example.com&#xff09;智能调度层&#xff1a;基于AI模型动态分配清洗节点&#xff0c;实时更新节点IP池回…

1.5.3 掌握Scala内建控制结构 - for循环

Scala的for循环功能强大&#xff0c;支持单重和嵌套循环。单重for循环语法为for (变量 <- 集合或数组 (条件)) {语句组}&#xff0c;可选筛选条件&#xff0c;循环变量依次取集合值。支持多种任务&#xff0c;如输出指定范围整数&#xff08;使用Range、to、until&#xff0…

【MySQL基础-9】深入理解MySQL中的聚合函数

在数据库操作中&#xff0c;聚合函数是一类非常重要的函数&#xff0c;它们用于对一组值执行计算并返回单个值。MySQL提供了多种聚合函数&#xff0c;如COUNT、SUM、AVG、MIN和MAX等。这些函数在数据分析和报表生成中扮演着关键角色。本文将深入探讨这些聚合函数的使用方法、注…

windows版本的时序数据库TDengine安装以及可视化工具

了解时序数据库TDengine&#xff0c;可以点击官方文档进行详细查阅 安装步骤 首先找到自己需要下载的版本&#xff0c;这边我暂时只写windows版本的安装 首先我们需要点开官网&#xff0c;找到发布历史&#xff0c;目前TDengine的windows版本只更新到3.0.7.1&#xff0c;我们…

Web测试

7、Web安全测试概述 黑客技术的发展历程 黑客基本涵义是指一个拥有熟练电脑技术的人&#xff0c;但大部分的媒体习惯将“黑客”指作电脑侵入者。 黑客技术的发展 在早期&#xff0c;黑客攻击的目标以系统软件居多。早期互联网Web并非主流应用&#xff0c;而且防火墙技术还没有…

华为OD机试 - 最长的完全交替连续方波信号(Java 2023 B卷 200分)

题目描述 给定一串方波信号,要求找出其中最长的完全连续交替方波信号并输出。如果有多个相同长度的交替方波信号,输出任意一个即可。方波信号的高位用1标识,低位用0标识。 说明: 一个完整的信号一定以0开始并以0结尾,即010是一个完整的信号,但101,1010,0101不是。输入的…

游戏引擎学习第163天

我们可以在资源处理器中使用库 因为我们的资源处理器并不是游戏的一部分&#xff0c;所以它可以使用库。我说过我不介意让它使用库&#xff0c;而我提到这个的原因是&#xff0c;今天我们确实有一个选择——可以使用库。 生成字体位图的两种方式&#xff1a;求助于 Windows 或…

7、什么是死锁,如何避免死锁?【高频】

&#xff08;1&#xff09;什么是死锁&#xff1a; 死锁 是指在两个或多个进程的执行时&#xff0c;每个进程都持有资源 并 等待其他进程 释放 它所需的资源&#xff0c;如果此时所有的进程一直占有资源而不释放&#xff0c;就会陷入互相等待的一种僵局状态。 死锁只有同时满足…

Compose 实践与探索十四 —— 自定义布局

自定义布局在 Compose 中相对于原生的需求已经小了很多&#xff0c;先讲二者在本质上的逻辑&#xff0c;再说它们的使用场景&#xff0c;两相对比就知道为什么 Compose 中的自定义布局的需求较小了。 原生是在 xml 布局文件不太方便或者无法满足需求时才会在代码中通过自定义 …

【C++】:C++11详解 —— 入门基础

目录 C11简介 统一的列表初始化 1.初始化范围扩展 2.禁止窄化转换&#xff08;Narrowing Conversion&#xff09; 3.解决“最令人烦恼的解析”&#xff08;Most Vexing Parse&#xff09; 4.动态数组初始化 5. 直接初始化返回值 总结 声明 1.auto 类型推导 2. declty…

oracle删除表中重复数据

需求&#xff1a; 删除wfd_procs_nodes_rwk表中&#xff0c;huser_id、dnode_id、rwk_name字段值相同的记录&#xff0c;如果有多条&#xff0c;只保留一条。 SQL&#xff1a; DELETE FROM wfd_procs_nodes_rwk t WHERE t.rowid > (SELECT MIN(t1.rowid)FROM wfd_procs_n…

ESP32学习 -从STM32工程架构进阶到ESP32架构

ESP32与STM32项目文件结构对比解析 以下是对你提供的ESP32项目文件结构的详细解释&#xff0c;并与STM32&#xff08;以STM32CubeIDE为例&#xff09;的常见结构进行对比&#xff0c;帮助你理解两者的差异&#xff1a; 1. ESP32项目文件解析 文件/目录作用STM32对应或差异set…

整形在内存中的存储(例题逐个解析)

目录 一.相关知识点 1.截断&#xff1a; 2.整形提升&#xff1a; 3.如何 截断&#xff0c;整型提升&#xff1f; &#xff08;1&#xff09;负数 &#xff08;2&#xff09;正数 &#xff08;3&#xff09;无符号整型&#xff0c;高位补0 注意&#xff1a;提升后得到的…

HTML中滚动加载的实现

设置div的overflow属性&#xff0c;可以使得该div具有滚动效果&#xff0c;下面以div中包含的是table来举例。 当table的元素较多&#xff0c;以至于超出div的显示范围的话&#xff0c;观察下该div元素的以下3个属性&#xff1a; clientHeight是div的显示高度&#xff0c;scrol…

Netty基础—7.Netty实现消息推送服务二

大纲 1.Netty实现HTTP服务器 2.Netty实现WebSocket 3.Netty实现的消息推送系统 (1)基于WebSocket的消息推送系统说明 (2)消息推送系统的PushServer (3)消息推送系统的连接管理封装 (4)消息推送系统的ping-pong探测 (5)消息推送系统的全连接推送 (6)消息推送系统的HTTP…

人工智能助力家庭机器人:从清洁到陪伴的智能转型

引言&#xff1a;家庭机器人进入智能时代 过去&#xff0c;家庭机器人只是简单的“工具”&#xff0c;主要用于扫地、拖地、擦窗等单一任务。然而&#xff0c;随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;家庭机器人正经历从“机械助手”向“智能管家”甚…

ssh转发笔记

工作中又学到了&#xff0c;大脑转不过来 现有主机A&#xff0c;主机B&#xff0c;主机C A能访问B&#xff0c;B能访问C&#xff0c;A不能访问C C上80端口有个服务&#xff0c;现在A想访问这个服务&#xff0c;领导让用ssh转发&#xff0c;研究半天没找到理想的语句&#xf…

清晰易懂的Miniconda安装教程

小白也能看懂的 Miniconda 安装教程 Miniconda 是一个轻量级的 Python 环境管理工具&#xff0c;适合初学者快速搭建 Python 开发环境。本教程将手把手教你如何在 Windows 系统上安装 Miniconda&#xff0c;并配置基础环境&#xff0c;确保你能够顺利使用 Python 进行开发。即…

Flume详解——介绍、部署与使用

1. Flume 简介 Apache Flume 是一个专门用于高效地 收集、聚合、传输 大量日志数据的 分布式、可靠 的系统。它特别擅长将数据从各种数据源&#xff08;如日志文件、消息队列等&#xff09;传输到 HDFS、HBase、Kafka 等大数据存储系统。 特点&#xff1a; 可扩展&#xff1…

破解企业内部盗版软件管理难题的技术方案

引言&#xff1a;盗版软件——企业数字化转型的“隐形地雷” 据BSA《全球软件调查报告》显示&#xff0c;37%的企业存在员工私自安装盗版软件的行为&#xff0c;由此引发的法律诉讼、数据泄露及罚款风险年均增长28%。LMT基于“预防-检测-治理”三位一体技术框架&#xff0c;为…