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

news2025/1/13 10:05:52

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

    • 串的定义
      • 一、串的顺序存储结构
      • 1.1、串的链式存储结构
      • 1.2、串的模式匹配算法
        • 1.2.1、Brute-Force简称为BF算法
        • 1.2.2、KMP算法
    • 数组的定义
      • 2.1、数组的顺序存储结构
      • 2.2、数组的特点:结构固定-----维数和维界不变
      • 2.3、特殊矩阵的压缩存储
    • 广义表
      • 3.1、广义表的定义
      • 3.2、广义表的操作
      • 3.3、广义表与线性表的区别

串的定义

串的逻辑结构与线性表相似,是一种特殊的线性表,区别仅在于串的数据对象限定为字符;
串通常以整体作为操作的对象,而线性表通常以单个元素作为操作对象。

串或字符串:是由零个或多个字符组成的有序序列
字串:串中任意个连续的字符组成的子序列
空串:零个字符的串
空格串:由空格组成的串

一、串的顺序存储结构

在这里插入图片描述

1.1、串的链式存储结构

在这里插入图片描述
优点:操作方便
缺点:存储密度低
块链结构可以克服这个缺点
在这里插入图片描述

1.2、串的模式匹配算法

字串的定位运算一般称串的模式匹配或串匹配
著名的两种算法:BF 简单匹配法、暴力破解法;KMP (特点:速度快);
算法应用:搜索引擎、拼写检查、语言翻译、数据压缩;

1.2.1、Brute-Force简称为BF算法

用指针i,j指示主串S和子串T中当前待比较的字符位置,i的初值为pos,j的初值为1
如果两个串均未达到串尾,则循环执行以下操作:
	分别比较指针i,j所指的字符,若相等则指针i,j同时向后移动一位,继续比较
	若字符值不相等,则指针退后重新开始匹配,变成i=i-j+2,j=1,然后重新匹配
	(指针i,j最开始指向下标为1的数组元素,每次回溯时,指针i向后移动一位,指针j回到原点)

模式匹配不一定从主串的第一个位置开始,可以从指定的主串中查找的起始位置开始。

int index_BF(SString S, SString T){
	int i = 1, j = 1;
	while(i<=S.length && j<=T.length){
		if(s.ch[i]==t.cn[j]){++i;++j;} //主串和子串依次匹配下一个字符
		else{i=i-j+2;j=1} //主串、子串指针回溯重新开始下一次匹配 
	}
	if(j>T.length) return i-T.length;  //返回匹配的第一个字符的下标
	else return 0
}

在这里插入图片描述

1.2.2、KMP算法

只移动子串,让模式串向右移动,不需要回溯主串指针。
当第一个位置就出现字符不匹配,字串移动到主串的第二位进行比较
当其他位置出现字符不匹配,寻找公共前后缀。
当字符匹配时,子串的比较箭头向后移动一位继续比较。
让模式串向右滑动,将前缀的字符串直接移动到后缀字符串的位置,然后让子串的n号位,再与主串当前位置进行比较。

示例如下图:
定义next[j]函数,表明当前模式中第j个字符与主串中相应字符失配时,在模式中需要重新和主串中该字符进行比较的字符的位置
在这里插入图片描述

在这里插入图片描述
因为d前面的a b 在主串第一、第二个位置已经匹配到了,所以直接子串移到d前的这两个a b 开始匹配, next[j] = 3 ,从子串的第三个字符开始匹配
在这里插入图片描述

int index_KMP(SString S, SString T, int pos){
	i = pos;j=1;
	while(i<S.length&&j<T.length){
		if(j==0||S.ch[i]==T.ch[j]){i++;j++;}
		else(j=next[j]) //i不变 j后退
	}
	if(j>T.length) return i -T.length; //匹配成功
	else return 0;
}

数组的定义

数组是由类型相同的数据元素构成的有序集合,每个元素称为数组元素。(一般用顺序结构)
数组可以看成线性表的推广,其特点是结构中的元素本身可以具有某种结构的数据,但属于同一数据类型。

2.1、数组的顺序存储结构

对于数组,一旦规定了其维度和各维的长度,只要给出一组下标则可以求相应的数组元素的存储位置。
二维数组
在这里插入图片描述

设有一个二维数组A[M][N]按行优先顺序存储,假设A[0][0]放在位置644中,A[2][2]放在位置676,每个元素占一个空间,问A[3][3]存放在什么位置
​
2n+2=676-644
n=15
A[3][3]一共有3n+3=48
所以A[3][3]存放在48+644=692的位置上
下标存放从1开始

2.2、数组的特点:结构固定-----维数和维界不变

数组的基本操作:初始化、销毁,取元素、修改元素(一般不做插入和删除操作)

// m行n列,元素总个数mn
typedef elemtype array1[m][n];

// 数组嵌套:一维数组的一维数组
typedef elemtype array1[n];			// 该数组作为二维数组的元素
typedef array1 array2[m];		   // 二维数组,由m个一维数组组成

// n维数组——重复嵌套一维数组
typedef elemtype array1[n1];	  // 1维		
typedef array1 	 array2[n2];	  // 2维
typedef array2	 array3[n3];	  // 3维

2.3、特殊矩阵的压缩存储

所谓压缩存储,是指为多个值相同的元只分配一个储存空间,对零元不分配空间

对称矩阵(关于主对角线左右元素相同)
三角矩阵(主对角线一边全为0/常数c)
对角矩阵(所有非零元素都集中在对角线中心的带状区域中,其他元全为0)
十字链表(链式)
稀疏矩阵(非零个数少)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

广义表

3.1、广义表的定义

广义表是线性表的推广,也称为列表。
对于线性表而言,存储的数据元素只能是单个元素,而在广义表中,数据元素可以是单个元素,称为原子,也可以是一个广义表,称为子表。广义表的定义是一个递归的定义。
在这里插入图片描述

3.2、广义表的操作

求表头 GetHead(L)

非空广义表的第一个元素,可以试试一个元素也可以是一个子表

求表尾 GetTail(L)

非空广义表除去表头元素意外的其他元素所构成的表,表尾一定是一个表。

在这里插入图片描述

3.3、广义表与线性表的区别

广义表可以看成是线性表的推广,线性表是广义表的特例。
广义表的结构相当灵活,在某种前提下,它可以兼容线性表、数组、树和有向图等各种常用的数据结构。
当二维数组的每行(或每列)作为子表处理时,二维数组即为一个广义表。
另外,树和有向图也可以用广义表来表示。
由于广义表不仅集中了线性表、数组、树和有向图等常见数据结构的特点,而且可有效地利用存储空间,因此在计算机的许多应用领域都有成功使用广义表的实例。

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

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

相关文章

密码学—Kasiski测试法Python程序

Kasiski Kasiski是辅助破解Vigenere的前提工作&#xff0c;Kasiski是猜测加密者使用Vigenere密码体系的密钥的长度&#xff0c;Kasiski只是猜测长度而已&#xff0c;所以说是辅助破解Vigenere 若密文中出现两个相同的密文段(密文段的长度m>2)&#xff0c;则它们对应的明文&…

leetcode第66题:加一

题目 这是一道简单的小题&#xff0c;自己却也没写出来。。。逆序遍历数组digits&#xff0c;用carry标记当前元素是否需要进位&#xff08;0不要&#xff0c;1要&#xff09;。 若carry1&#xff0c;则当前元素要么置0&#xff0c;要么自加1。自加1之后&#xff0c;再也不需要…

【深入了解Spring Cloud Alibaba Nacos:服务注册和配置中心】—— 每天一点小知识

&#x1f4a7; 深入了解 S p r i n g C l o u d A l i b a b a N a c o s &#xff1a;服务注册和配置中心 \color{#FF1493}{深入了解Spring Cloud Alibaba Nacos&#xff1a;服务注册和配置中心} 深入了解SpringCloudAlibabaNacos&#xff1a;服务注册和配置中心&#x1f4a7;…

深入浅出解析LoRA完整核心基础知识 | 【算法兵器谱】

Rocky Ding 公众号&#xff1a;WeThinkIn 写在前面 【算法兵器谱】栏目专注分享AI行业中的前沿/经典/必备的模型&论文&#xff0c;并对具备划时代意义的模型&论文进行全方位系统的解析&#xff0c;比如Rocky之前出品的爆款文章Make YOLO Great Again系列。也欢迎大家提…

让Ai帮我们画个粽子,它会画成什么样呢?

让Ai帮我们画个粽子&#xff0c;它会画成什么样呢&#xff1f; 本文目录&#xff1a; 一、Ai绘图技术的现状 二、看看Ai理解的粽子是怎样的 2.1、基础粽子 2.2、生成不同风格的粽子 2.2.1、真实风格的粽子 2.2.2、插图风格的粽子 2.2.3、3D风格的粽子 2.2.4、卡通风格…

Mysql锁机制介绍

Mysql锁机制 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中&#xff0c;除传统的计算资源(如CPU、RAM、I/O等)的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&#xff0…

vue-cli笔记

vue的生命周期&#xff1a; 借鉴react 钩子函数&#xff1a; change() 挂载完毕&#xff0c;vue完成模板解析&#xff0c;并把初始的真实的dom元素放入到页面后执行 beforeCreate() {// 数据代理和数据监测创建之前console.log(beforeCreate) }, created() {console.l…

深度:全面解析数据智能的金融“炼金术”!

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 金融以其财富效应&#xff0c;成为最新科技的试金石。一项新技术出来后&#xff0c;人们首先闪过的念头就是“能不能用它赚钱”。例如&#xff0c;ChatGPT带火了大模型&#xff0c;人们也开始将目标聚焦到大模型在金融领域的…

【实战】 JWT、用户认证与异步请求(下) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(五)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求1~56.用useAuth切换登录与非登录状态7.用fetch抽象通用HTTP请求方法&#xff0c;增强通用性8.用useHt…

AR宇航员互动体验软件:虚拟与现实叠加增强体验感

随着科技的不断发展&#xff0c;人们对太空探索的兴趣和热情也越来越高涨。为了满足人们对太空探索的渴望&#xff0c;广州华锐互动研发了宇航员AR模拟体验软件&#xff0c;这种软件可以让用户身临其境地体验太空探索的过程&#xff0c;提供一种全新的、令人兴奋的太空探索新体…

css基础知识十一:CSS3新增了哪些新特性?

一、是什么 css&#xff0c;即层叠样式表&#xff08;Cascading Style Sheets&#xff09;的简称&#xff0c;是一种标记语言&#xff0c;由浏览器解释执行用来使页面变得更为美观 css3是css的最新标准&#xff0c;是向后兼容的&#xff0c;CSS1/2的特性在CSS3 里都是可以使用…

图解CNN中的卷积(卷积运算、池化、Padding、多通道的卷积)

文章目录 卷积操作池化Padding对多通道&#xff08;channels&#xff09;图片的卷积套上激活函数是什么样的参考&#xff1a; 卷积层是深度学习神经网络中经常使用的一种层。它通过卷积运算来提取输入的特征&#xff0c;常用于图像、语音等信号处理任务中。 卷积层有以下几个参…

rocketmq-spring-boot-starter支持SpringBoot 1.x(spring-context 4.x)版本

1 问题说明 由于历史原因&#xff0c;项目使用的是SpringBoot1.x版本&#xff0c;而且由于种种原因&#xff0c;不能升级。在项目开发迭代过程中&#xff0c;决定使用RocketMQ作为消息中间件&#xff0c;因为是SpringBoot项目&#xff0c;理所应当的引入了rocketmq-spring-boo…

简单聊聊数字孪生与GIS融合的必要性

随着科技的不断发展和应用的不断深入&#xff0c;数字孪生和GIS在各自领域中展现出巨大的潜力。然而&#xff0c;更引人注目的是&#xff0c;数字孪生和GIS的融合将为许多行业带来全新的机遇和变革。在本文中&#xff0c;我们将探讨数字孪生和GIS融合的必要性&#xff0c;以及它…

2023ty计网期末综合题满分冲刺版

1. 假设有段1km长的CSMA/CD网络链路的数据传输率为1Gb/s。设信号在此链路媒介上的传播速度为2x105 km/s&#xff0c;求使用此协议的最短数据帧长度。 &#xff08;1&#xff09;传播时延&#xff1a;1/2000005微秒&#xff0c; &#xff08;2&#xff09;往返时延&#xff1a…

List合并的操作

List合并的操作 1.addAll方法 List list1new ArrayList();List list2new ArrayList();for (int i 0; i < 10; i) {list1.add(i*2);list2.add(i*21);}System.out.println(list1);//方法1&#xff1a;addAlllist1.addAll(list2);System.out.println(list1); 2.Stream操作 L…

ATTCK(二)之ATTCK的发展历史

ATT&CK的发展历史 MITRE公司 MITRE是美国NIST标准化组织选择的专注于网络安全的组织&#xff0c;由美国联邦政府资助。很多安全标准都MITRE制定的&#xff0c;比如有名的漏洞CVE编号规则以及威胁情报格式STIX。所以ATT&CK非常有影响力&#xff0c;而且未来能成为一个公…

MySQL----MHA高可用

文章目录 一、MHA理论1.1什么是 MHA1.2MHA 的组成1.3MHA 的特点 二、MHA的一主两从部署实验设计故障修复步骤&#xff1a; 一、MHA理论 1.1什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出…

Java 日志重点梳理

大家好&#xff01;我是今越。重点梳理一下在 Java 程序开发中关于日志管理的知识点&#xff0c;以及在 Spring Boot 框架中该如何使用日志。 在 Java 中&#xff0c;日志框架主要分为两大类&#xff1a;日志门面和日志实现。 日志门面 日志门面定义了一组日志的接口规范&am…

LangChain-Agent自定义Tools类 ——输入参数篇(二)

给自定义函数传入输入参数&#xff0c;分别有single-input 参数函数案例和multi-input 参数函数案例&#xff1a; from langchain.agents import Tool from langchain.tools import BaseTool from math import pi from typing import Union from math import pi from typing …