串(String):零个或多个任意字符组成的有限序列

  • 空串用∅表示

子串:一个串中任意个连续字符组成的子序列(含空串)称为该串的子串
真子串是指不包含自身的所有子串
几个术语

  • 子串:串中任意个连续字符组成的子序列称为该串的子串
  • 主串:包含子串的串相应的称为主串
  • 字符位置:字符在序列中的序号为该字符在串中的位置
  • 子串位置子串第一个字符在主串中的位置
  • 空格串:由一个或多个空格组成的串,与空串不同

串相等:当且仅当两个串的长度相等并且各个对应位置上的字符都相同时,这两个串才是相等的。
串的顺序存储结构

#define MAXLEN 255
typedef struct
{char ch[MAXLEN+1];//存储串的一维数组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算法(Brute-Force,又称古典的、经典的、朴素的、穷举的 )
  • KMP算法(特点:速度快)

BF算法,亦称简单匹配算法,采用穷举的思路

  • 算法的思路是从主串的每一个字符开始依次与子串的字符进行匹配 匹配失败要回溯 i=i-j+2 j=1(从头开始)

Index(S,T,pos)

  • 将主串的第pos个字符和模式串的第一个字符比较
  • 若相等,继续逐个比较后续字符
  • 若不等,从主串的下一个字符起,重新与模式串的第一个字符比较
  • 直到主串的一个连续字符序列和模式串相等。返回值为S(主串)中与T(模式串)匹配的子序列的第一个字符的序号,即匹配成功。否则匹配失败,返回0
int Index_BF(SString S,SString T,int pos)
{int i=pos;int j=1;while(i<S.length&&j<=T.length){if(S.ch[i]==T.ch[i])//主串和子串依次匹配下一个字符{++i;++j;}else//主串,子串指针回溯重新开始下一次匹配{i=i-j+2;j=1;}if(j>=T.length)return i-T.length;//返回匹配的第一个字符的下标else return 0;//模式匹配不成功}
}
  • 若主串长度n,子串长度m,算法复杂度O(m*n)

KMP算法

  • 定义next[j]函数,表明当模式中第j个字符与主串中相应字符“失配”时,在模式中需重新与主串中该字符进行比较的字符的位置

next[j]=

  1. max{k|1<k<j,且从头开始的k-1个元素=j前面的k-1个元素} 当此集合非空时
  2. 0 当j=1时
  3. 1 其它情况
int Index_BF(SString S,SString T,int pos)
{int i=pos;int j=1;while(i<S.length&&j<=T.length){if(j==0||S.ch[i]==T.ch[i])//主串和子串依次匹配下一个字符{++i;++j;}else{j=next[j];//i不变,j后退}if(j>T.length)return i-T.length;//返回成功返回匹配的第一个字符的下标else return 0;//模式匹配不成功}
}
  • next[j]可以改进成nextval[j],不多介绍了

数组

  • 数组:按一定格式排列起来的,具有相同类型的数据元素的集合
  • 一维数组:若线性表中的数据元素为非结构的简单元素,则称为一维数组
  • 一维数组的逻辑结构:线性结构。定长的线性表
  • 声明格式:数据类型 变量名称[长度]
  • 二维数组:若一维数组中的数据元素又是一维数组结构,则称为二维数组
  • 二维数组的逻辑结构
    非线性结构:每一个数据元素既在一个行表中,又在一个列表中
    线性结构:该线性表的每个数据 元素也是一个定长的线性表
  • 在C语言中,一个二维数组类型也可以定义为一维数组类型(其分量类型为一维数组类型)即:typedef elemtype array2[m][n]; 等价于 typedef elemtype array1[n]; typedef array1 array2[m];
  • 三维数组:若二维数组中的元素又是一个一维数组,则称作三维数组
  • n维数组:若n-1维数组中的元素又是一个一维数组结构,则称作n维数组
  • 结论:线性表结构是数组结构的一个特例,而数组结构又是线性表结构的扩展
  • 数组特点:结构固定–定义后,维数和维界不再改变
  • 数组的基本操作:除了结构的初始化和销毁之外,只有取元素和修改元素值的操作
  • 数组一般都是采用顺序存储结构来表示
  • 注意:数组可以是多维的,但存储数据元素的内存单元地址是一维的,因此,在存储数组结构之前,需要解决将多维关系映射到一维关系的问题
  • 一维数组:LOC(i)=
    1)LOC(0)=a, i=0;
    2)LOC(i-1)+L=a+i*L,i>1
  • 二维数组:以行序为主序
    设数组开始存储位置LOC(0,0),存储每个元素都需要L个存储单元数组元素a[i][j]的存储位置是:LOC(i,j)=LOC(0,0)+(n*i+j)*L

特殊矩阵的压缩存储

  • 矩阵:一个由m×n个元素排成的m行n列的表
  • 矩阵的常规存储:
    将矩阵表述为一个二维数组
  • 矩阵的常规存储的特点:
    可以对其元素进行随机存取
    矩阵运算非常简单;存储的密度是1
  • 不适宜常规存储的矩阵
    值相同的元元素很多且呈某种规律分布;零元很多
  • 矩阵的压缩存储:
    为多个相同的非零元素只分配一个存储空间;对零元素不分配空间
  • 特殊矩阵的压缩存储
    1、什么是压缩存储?
    若多个数据元素的值都相同,则只分配一个元素值的存储空间,且零元素不占存储空间
    2、什么样的矩阵能够压缩?
    一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等
    3、什么叫稀疏矩阵?
    矩阵中非零元的个数较少(一般小于5%)

广义表

广义表(又称列表)是n>=0个元素的有限序列,其中每一个ai或者是原子,或者是一个广义表

  • 广义表通常记作:LS=(a1,a2,…,an),其中:LS为表名,n为表的长度,小写字母表示原子
  • 习惯上,一般用大写字母表示广义表小写字母表示原子
  • 表头:若LS非空(n>=1),则其第一个元素a1就是表头,记作head(LS)=a1;
    注:表头可以是原子,也可以是子表
  • 表尾:除表头之外的其它元素组成的表 记作 tail(LS)=(a2,…an)。
    注:表尾不是最后一个元素,而是一个子表

广义表的性质

  • 广义表中的数据元素有相对次序;一个直接前驱和一个直接后继
  • 广义表的长度定义为最外层所包含元素的个数
  • 广义表的深度定义为该广义表展开后所包含括号的重数
    注意:原子的深度为0,空表的深度为1
  • 广义表可以为其它广义表共享
  • 广义表可以是一个递归的表
    注意:递归表的深度是无穷值,长度是有限值
  • 广义表是多层次结构,广义表的元素可以是单元素,也可以是子表,而子表的元素还可以是子表,。。。

广义表和线性表的区别

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

广义表的基本运算

  1. 求表头(GetHead(L)):非空广义表的第一个元素,可以是一个原子也可以是一个子表
  2. 求表尾(GetTail(L)):非空广义表除去表头元素以外其它元素构成的表。表尾一定是一个表

数据结构--串、数组、广义表相关推荐

  1. 数据结构C语言——广义表

    很久没有发博客记录了,不过应该也没人关心这个,哈哈哈. 突然想起来,学习也不能只是干学,稍微做点记录. 之前我对html.css.js基础有了一定的理解,也学了一些模板,不过现在我想先把计算机基础给补 ...

  2. 数据结构14——求广义表深度(严5.30)

    Description 试按表头.表尾的分析方法编写求广义表的深度的递归程序. Input 输入一串以'('开始,以'('结束的字符串,并且输入的左右括号必须匹配,如:(),(())-- Output ...

  3. 西北工业大学NOJ数据结构—014求广义表深度

    #include <stdio.h> #include <stdlib.h>typedef struct Node {int A_L;//使用枚举不熟练,A_T代表Atom或L ...

  4. C语言数据结构-数组广义表-十字链表-实现十字链表的初始化操作-实现十字链表的删除操作

    十字链表 十字链表相关定义如下: typedef int ElemType;// 非零元素结点结构 typedef struct OLNode {int row,col;ElemType value; ...

  5. 数据结构 习题 第五章 多维数组和广义表 (C语言描述)

    最近在复习数据结构,所以想把平时上课做的习题做个总结,如果大家有遇到这方面的问题就可以参考一下了,废话不多说,直接开始吧. 1.单选题 稀疏矩阵一般的压缩存储方法有两种,即( D) A. 二维数组和三 ...

  6. 数据结构之数组与广义表

    目录 联系 数组 广义表 联系 数组和广义表可看作一种扩展的线性数据结构,其特殊性在于数据元素的构成上.从组成线性表的元素角度看,数组是由具有某种结构的数据元素构成,广义表则是由单个元素或子表构成的. ...

  7. 数据结构与算法-Part6——数组与广义表

    目录 一丶数组 1:一维数组 2:二维数组 1)二维数组的概念 2)二维数组的顺序存储结构 3)二维数组的遍历 3:在C#中自定义矩阵类 二丶稀疏矩阵 1:稀疏矩阵的三元组 2:稀疏矩阵三元组集合的顺 ...

  8. 分层次的非线性结构——树(广义表)05

    包含子结构的线性结构,线性表的推广--广义表 广义表的定义 广义表定义 约定:为了区分原子和子表,书写时用大写字母表示子表,用小写字母表示原子. 广义表特性 广义表表示方法 用圆圈和方框分别表示表和单 ...

  9. 【数据结构总结】第四章:串、数组和广义表(线性结构)

    第四章:串.数组和广义表(线性结构) 提示:本文主要是以思维导图的形式概括数据结构第一章的精华内容,基本不会用到文字性的内容,目的是为了给大家梳理每个重要的知识点的相关概念,方便大家在复盘的时候快速阅 ...

  10. 《数据结构》第四章串,数组和广义表

    <数据结构>第四章 文章目录 <数据结构>第四章 4.1 串的定义 4.2 案例引入 4.3 串的类型定义,存储结构及其运算 4.3.1 串的抽象类型定义 4.3.2的存储结构 ...

最新文章

  1. 使用类计算矩形的面积
  2. Java多线程(十)之ReentrantReadWriteLock深入分析
  3. mac wmware 无网络_无线网络中常用的技术名词
  4. Linux 指令的分类 (man page 可查看)
  5. win7+vs2010+opnet教程
  6. poj2513Colored Sticks(无向图判欧拉路、回路+trie树)
  7. 微星小飞机怎么显示帧数?方法介绍
  8. 简单理解t检验与秩和检验
  9. 安卓psp模拟器哪个好_psp模拟器安卓完美版下载_psp模拟器完美版手机版下载_玩游戏网...
  10. 移动端证件识别,支持离线识别
  11. UNet 、3D-UNet 、VNet 区别
  12. IE被劫持的手动解除
  13. java remove removeat_Java PriorityQueue删除任意元素的性能
  14. 互联网项目,京东店群、淘宝店群和天猫无货源店群,创业者该如何选择?
  15. [MAS]智能体交流 Agent Communication
  16. 【HTML 教程】iframe
  17. 斜率、弧度、角度的转换
  18. 计算机动画关键技术,计算机动画关键技术综述ppt课件.ppt
  19. [读书笔记] 代码整洁之道(一)
  20. public、private、protected的区别

热门文章

  1. STM32物联网实战教程(十)—阿里云物联网平台搭建
  2. 【拜小白opencv】14-只去除RGB的某一颜色通道
  3. linux卸载和安装nginx资料汇总
  4. SSM整合(用json,easyui,spring实现从数据库查找信息并进行分页)
  5. 端口映射工具android,(转) android工具----adb的使用
  6. 免注册(不用序列号)使用Photoshop CS6
  7. geoserver wfs 服务访问
  8. 【Linux】零成本在家搭建自己的私人服务器解决方案
  9. 《Knowledge Neurons in Pretrained Transformers》论文解读 ACL2022
  10. 腾讯副总裁郄小虎离职:被曝涉及重婚罪 判决拘役半年