数据结构基础篇(7)

二十三.串、数组和广义表

  • -串的定义
    •    零个或多个任意字符组成的有限序列
    • 串的术语
      • - 子串:一个串中任意连续字符组成的子序列(含空串)叫该串的子串
      • - 主串:包含子串的串对应叫主串
      • - 字符位置:字符在序列中序号是该字符串中的位置
      • - 子串位置:子串第一个字符主串的位子
      • - 空格串:由一个或多个空格组成的串;与空串不同
      • - 串相等:只有当两个串的长度相等并且各个位置上字符也相同
  • - 串的类型定义、存储结构及运算
    • - 基本操作
      • - StrAssign(&T,chars)    //串赋值
      • - StrCompare(S,T)    //串比较
      • - StrLength(S)    求串长
      • - Concat(&T,S1,S2)    串连结
      • - Substring(&Sub,S,pos,len)    求子串
      • - StrCopy(&T,S)    串拷贝
      • - StrEmpty(S)    串判空
      • - ClearString(&S)    清空串
      • - index(S,T,pos)    子串的位置
      • - Replace(&S,T,V)    串替换
      • - StrInsert(&S,pos,len)    子串删除
      • - DestroyString(&S)        串删除
  • - 顺序存储结构
#define MAXQSIZE 255   //最大队列长度
typedef struct
{char ch[MAXLEN+!];    //存储串的一维数组int length;    //串的当前长度
}SString;

- 块链结构

#define CHUNKSIZE 80
typedef struct Chunk
{char ch[CHUNKSIZE];struct Chunk *next;
}Chunk;typedef struct
{Chunk *head,*tail   //串的头指针和尾指针int curlen;    //串的当前长度
}LString;    //字符串的块链结构
  • - 串的模式匹配算法
    • - 算法目的
      • - 确定主串中所含子串(模式串)第一次出现的位置(定位)
    • - 算法应用
      • - 搜狗引擎、拼写检查、语言翻译、数据压缩
    • - 算法种类
      • - BF算法
        • - 简单匹配算法。采用穷举法
          • - Index(S,T,pos)
            • - 将主串的第pos个字符和模式串的第一个字符比较
            • - 相等,继续逐个比较后续字符
            • - 不等,从主串的下一字符起,重新与模式串的第一个字符比较
              • - 直到主串的一个连续子串字符序列与模式串相等。返回值为S中与T匹配的子序列第一个字符的序号,则匹配陈宫
              • - 否则,匹配是失败,返回值0
int Index_BF(SString S,SString T)
{int i=1,j=1;while(i<=S.length&&j<=T.length){if(s.ch[i]==t.ch[j]){++i;++j;        }    else{i=i-j+2;    //子串和主串依次匹配下个字符j=1;        //主串、子串指针回溯重新开始下一次匹配}}if(j>=T.length)return i-T.length;    //返回匹配的第一个字符的下标elsereturn 0;    //模式匹配不成功
}
  • - KMP算法
    • - 主串S的指针i不再回溯,提速到O(n+m)
    • - 定义next[j]函数,表明当模式中第j个字节与主串中对应字符失配,在模式中需要重新和主串中该字符进行比较的字符位置
  • - 数组的顺序存储
    • - 数组特点
      • - 结构固定——维数和维界不边
    • - 数组基本操作
      • - 初始化、销毁、取元素、修改元素值。
        • - 一般采用顺序存储结构来表示数组
        • - 注意:数组可以是多维的,存储数据元素的内存单元地址是一维的,在存储数组结构之前,需要解决将多维关系映射到一维关系
  • - 特殊矩阵的压缩存储
    • -  矩阵
      • - 一个由mxn个元素排成m行n列的表
    • - 矩阵的常规存储
      • - 将矩阵描述为一个二维数组
    • - 矩阵的常规存储特点
      • - 可以对元素进行随机存储;矩阵运算非常简单,密度为1
    • - 不适宜存矩阵
      • - 值相同的元素很多而且呈某种规律分布;零元素多
    • - 压缩矩阵
      • - 多个数据元素的值相同,只分配一个元素值的存储空间,零元素不占空间
    • - 特殊矩阵可以被压缩:对称矩阵、对角矩阵,三角矩阵,稀疏矩阵
    • - 对称矩阵
      • - 只存储上或下三角的数据元素,占用n(n+1)/2个元素空间
    • - 三角矩阵
      • - 对角线以下或以上的数据元素(不包括对角线)全部为常数c,重复元素c共享一个元素存储空间,占用n(n+1)/2+1元素空间
    • - 对角矩阵
      • - 在n x n的方阵中,所有非零元素都集中在以主对角线为中心的带状中,区域外全0.有三对角,五对角,七对角
    • - 稀疏矩阵
      • - 三元组顺序表(有序的双下标法)
        • - 总行数-总列数-非零元素总个数0
        • - 优点:非零元在表中按行序有存储,便于进行依行顺序处理的矩阵运算
        • - 缺点:不能随机存储,若行号存取某一行中的非零元,则需要从头开始进行查找
    • - 十字链表
      • - 优点:能够灵活地插入因运算产生的新的非零元素,删除因运算而产生的新的零元素,实现矩阵的各种运算
        • - 矩阵的每一个非零元素用一个节点表示,结点除了row,col,value以外,还要有两个域
          • - ringth:用于链接同一行的下一个非零元素
          • - down:用于连接同一行的下一个非零元素
    • - 稀疏矩阵:矩阵中非零元素的个数较少(一般少于百分之五)

    • - 广义表
      • - 概念
        • - 是n>=0个元素a~0,a~1,---,a~n-1的有限序列,其中每个a~i或是原子或一个广义表
      • - 性质
        • - 广义表中的数据元素有相对次序:一个直接前驱和一个直接后续
        • - 广义表的长度取决于广义表最外层所包含的个数
        • - 广义表的深度取决于该广义表展开后所包含的重数
          • - 原子深度为0,空表深度为1
        • - 广义表可以和其他广义表共享
        • - 广义表可以使递归的表
          • - 递归表深度是无穷的,长度是有限的
        • - 广义表是多层次的,元素可以是单元素,可以是子表
  • - 基本运算
    • - 求表头GetHead(L):非空广义表的第一个元素,可以是元素和子表
    • - 求表尾GetTail(L):非空广义表出去表头元素以外其他元素构成的表,表尾一定是一个表

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

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

相关文章

react-intl国际化在项目中的使用

前言 使用成熟的第三方库的国际化&#xff0c;可以直接使用封装好的方法&#xff0c;这个国际化的原理其实是使用了react 的第三方库react-intl &#xff0c;感觉主要比较好的就是使用其中的模版&#xff0c;它的本质还是通过了Provider的形式 第一步新建文件夹&#xff0c;计…

Python 限制输入数的范围

Python 限制输入数的范围 在 Python 编程中&#xff0c;我们经常需要限制用户输入的数据范围&#xff0c;以避免一些可能出现的问题。例如&#xff0c;在一个游戏程序中&#xff0c;我们可能想要确保玩家的分数在某个范围内&#xff0c;而不是太高或太低。在这个博文中&#x…

minos 2.4 中断虚拟化——中断子系统

首发公号&#xff1a;Rand_cs 该项目来自乐敏大佬&#xff1a;https://github.com/minosproject/minos 前面讲述了 minos 对 GICv2 的一些配置和管理&#xff0c;这一节再往上走一走&#xff0c;看看 minos 的中断子系统 中断 中断描述符 /** if a irq is handled by minos…

属性(property)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 1 创建用于计算的属性 在Python中&#xff0c;可以通过property&#xff08;装饰器&#xff09;将一个方法转换为属性&#xff0c;从而实现用于计算…

几种更新 npm 项目依赖的实用方法

引言 在软件开发的过程中&#xff0c;我们知道依赖管理是其中一个至关重要的环节。npm&#xff08;Node Package Manager&#xff09; 是 Node.js 的包管理器&#xff0c;它主要用于 Node.js 项目的依赖管理和包发布。随着项目的不断发展&#xff0c;依赖库的版本更新和升级成…

字符串-459重复字符串

459. 重复的子字符串 - 力扣&#xff08;LeetCode&#xff09; 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。示例 2: 输入: s "ab…

基于Win11下的Wireshark的安装和使用

Wireshark的安装和使用 前言一、Wireshark是什么简介 二、下载Wireshark下载过程查看自己电脑配置 三、安装Wireshark安装过程安装组件创建快捷方式winPacpNpcap 打开检验 四、使用Wireshark实施抓包捕获数据包 五、基于Wireshark使用显示过滤器简介使用方法注意ICMP的请求和应…

【明道云】如何在发送邮件模块给出多条记录形成的列表

【背景】 在完成批量分别发送邮件给不同部门担当的任务后,作为主管部门的用户希望能够获得成功得到处理的所有记录信息。这些信息需要在提醒邮件中以表格形式呈现。 【分析】 获得多条记录的方法能够拿到数据,问题在于如何合适地以表格形式呈现在邮件中。 只有富文本支持表…

c++文件流

1.流的概念 在 C 中&#xff0c;流&#xff08;stream&#xff09;是一种用来处理输入输出数据的概念。 可以把流看作从源头&#xff08;如文件、键盘、网络连接等&#xff09;到终端的数据传输管道。 这些管道在程序运行时动态创建&#xff0c;并可以连接到多种不同的源头和…

目标检测算法综述

1 研究背景 1.1 概述 目标检测是计算机视觉的重要分支&#xff0c;主要任务是在给定的图片中精确找到物体所在位置&#xff0c;并标注出物体的类别&#xff0c;即包含了目标定位与目标分类两部分。在计算机视觉领域中的目标跟踪、图像分割、事件检测、场景理解等的任务都以目标…

Java线程几种常用方法详细说明

在Java编程中&#xff0c;多线程编程是一个非常重要的主题。它允许我们同时运行多个任务&#xff0c;提高程序的性能和响应速度。在这篇博客中&#xff0c;我们将介绍一些常用的Java线程方法和构造器&#xff0c;并通过示例代码展示如何使用它们。 Thread提供的常用方法 publi…

速盾:速盾高防cdn的防御原理?

速盾高防CDN是一种专业的网络安全解决方案&#xff0c;通过多种防御措施保护网站不受各种网络攻击的影响。其防御原理主要包括以下几个方面&#xff1a; 高强度DDoS防护 速盾高防CDN采用了弹性云防护集群&#xff0c;能够应对大规模的分布式拒绝服务&#xff08;DDoS&#xff0…

SpringBoot与Spring Framework提供的缓存抽象

目录 缓存 项目总结 新建一个SpringBoot项目 pom.xml application.properties CacheConfig Book BookRepository接口 BookService服务类 BookController控制器 SpringbootCacheApplication启动类 启动项目&#xff0c;使用Postman测试 参考博文&#xff1a; 1、使用…

llvm 3.5 源码分析 clang for x86 001 之搭环境

0&#xff0c;目标 编译 针对x86 的&#xff0c;debug 的 c语言的编译器 1&#xff0c;下载代码 git clone --recursive 。。。llvm-project.git $ cd llvm-project 2&#xff0c;预备代码 llvm 3.5 版本的源代码&#xff0c;早期版本&#xff0c;可能比较小比较容易debug $…

Python知识点1---变量和数据类型

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 在所有知识开始前&#xff0c;先给大家介绍一下Python的注释&#xf…

使用STM32和TB6600驱动器控制42BYGH步进电机

项目概述 1. 系统组成 STM32微控制器&#xff1a;作为主控制器&#xff0c;负责发出控制指令。TB6600驱动器&#xff1a;用于接收STM32的指令并驱动步进电机。42BYGH步进电机&#xff1a;作为执行元件&#xff0c;根据控制信号进行转动。电源&#xff1a;为STM32、TB6600和步…

Unity MiniCPM-V 让引擎拥有视觉

Unity MiniCPM-V 让引擎拥有视觉 前言项目Python环境布置Unity场景布置代码编写添加并设置脚本总结 鸣谢AI提示 前言 新发布的MiniCPM-V&#xff0c;忍不住玩一下&#xff0c;可以让之前制作的语音助手拥有一定的视觉能力&#xff08;不是OpenCV不行&#xff0c;而是AI更加符合…

深入理解Java关系运算符,避免常见错误!

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

Java Web是前端吗:深入解析Java Web技术的定位与边界

Java Web是前端吗&#xff1a;深入解析Java Web技术的定位与边界 在探讨Java Web是否属于前端领域时&#xff0c;我们首先需要明确Java Web技术的定位和它所涉及的范畴。本文将从四个方面、五个方面、六个方面和七个方面来深入解析这一问题&#xff0c;带您领略Java Web技术的…

复现CELL文章图片,在线绘制scRNA-seq多个cluster的差异火山图

导读 火山图表示两组间的差异&#xff0c;而在scRNA-seq中&#xff0c;同时会有多个cluster&#xff08;vs其他cluster&#xff09;的差异。如果用常规火山图展示&#xff0c;可能需要绘制十几个图。有没有更高效的展示方法呢&#xff1f;今天给大家带来CELL文章“A Spatiotem…