笔记:数据结构——第四章 串

图像处理系列——直方图之直方图规定化(Histogram Specification) 直方图规定化也叫直方图匹配(Histogram Matching),让原图像的像素分布与规定图像的像素分布保持一致。直方图规定化比直方图均衡化更加灵活,算是直方图均衡的变种。常用于图片风格一致性的自动处理,能有效的改善图像的整体或局部的特征,广泛运用在图像增强处理中。 阅读详情

第四章 串

4.1 串

  • 串,即字符串(String)是由零个或多个字符组成的有限序列

    例如:S=“Hello World!”;有的地方用双引号(Java、C);有地方用单引号(Python)

  • 子串——任意个连续的字符组成;主串——包含子串的串

    空串——无字符;空格串——字符是空格,每个空格字符占1 B

    字符在主串中的位置:字符在串中的序号;子串在主串中的位置:子串的第一个字符在串中的序号

    (注意:序号是从1开始,而不是0开始)

  • 串 VS 线性表:

    串是一种特殊的线性表,数据元素之间呈现线性关系

    串的数据对象:字符集(如中文字符、英文字符、数字字符、标点字符等)

    串的基本操作:通常以子串为操作对象,如增删改查;Index(S,T)——定位操作;StrCompare (S,T)——比较操作

  • 串的比较操作:先出现更大的符号的串更大(ASCII码:小写字母97>大写字母65);长串前缀与短串相同时,长串更大

  • 拓展——乱码问题:在文件中,原本采用的是一套编码规则;打开文件时,软件以为采用的是另一套编码规则

4.1.2 串的存储结构

*串的顺序存储
  • 静态数组实现——定长顺序存储(函数执行结束后,系统自动回收)

    动态数组实现——堆分配存储(用完需要手动free)

#define MAXLEN 255
typedef struct{
    char ch[MAXLEN];
    int length;
}SString;

typedef struct{
    char *ch;
    int length;
}HString;
  • 保存字符串的长度数据

    1. 方案一:变量length放在数组的末尾

    2. 方案二:变量length放在数组的开头ch[0]

      优点:字符的位序和数组下标相同;缺点:ch[0]为char型,只能放下1B=8bit,表示范围0-255

    3. 方案三:没有length变量,以符号’\0’表示结尾(对应ASCII码的0)

      方法:遍历到’\0’计算length,适用于不常访问字符串长度的情况

    4. 方案四:ch[0]废弃不用,末尾声明变量length(结合方案一、二)

*串的链式存储
  • 存储密度低:在32位计算机中,一个char占 1 B,但一个指针占4B即32个字节bit
  • 让每个结点存放多个字节,来增加存储密度;存不满的字节可以用#填充
typedef strut StringNode{
    char ch;
    struct StringNode *next;
}StringNode,*String;

typedef strut StringNode{
    char ch[4];						//每个结点存放多个字符
    struct StringNode *next;
}StringNode,*String;
*顺序串——求子串
  • (方案四的存储方式)求子串:用Sub返回串S第pos个字符起长度为len的子串
#define MAXLEN 255
typedef struct{
    char ch[MAXLEN];
    int length;
}SString;

bool SubString(SString &Sub,SString S,int pos,in len){
    if(pos+len-1>S.length)
        return false;
    for(int i=pos;i<pos+len;i++)
        Sub.ch[i-pos+1]=S.ch[i];	//此时子串的位置为i-pos+1
    Sub.length=len;
    return true;
}
*顺序串——比较操作
  • 比较操作:若S>T,则返回值>0;若S=T,则返回值为0;若S<T,则返回值<0,
int StrCompare(SString S,SString T){
    for(i=1;i<=SString S&&i<=SString T;i++){	//此处结束长度为两串中较短的
        if(S.ch[i]!=T.ch[i])
            return S.ch[i]-T.ch[i];		//扫描过程,return为直接将值相减
    }
    return S.length-T.length;			//扫描结束,长度较长的更大
}
*顺序串——定位操作
  • 定位操作:设主串S中存在子串T;返回字串第一次出现的位置,否则返回0
int Index(SString S,SString T){
    int i=1,n=StringLength(S),m=StringLength(T);
    SString sub;
    while(i<=n-m+1){					//前面定义i初始为1,所以+1
        SubString(Sub,S,i,m);			//i初始必为1,在主串里取一个长度相同的子串
        if(StrCompare(sub,T)!=0)		//比较两个子串是否一样
            i++;						//不一样就后移继续比较
        else
            return i;					//一样就返回子串位置
    }
    return 0;							//全部比较,没有相等子串
}

4.2 串的模式匹配

4.2.1 串的朴素模式匹配算法

  • 子串:一定是主串中存在的才叫“子串”;模式串:想尝试在主串中找到的串,未必存在

  • 串的模式匹配:在主串中找到与模式串相同的子串,并返回其所在位置

*朴素模式匹配算法
  • 与定位操作相似,但只要有一个字符不同就可以停止检查当前子串

  • 时间复杂度为O(nm);n远大于m

int Index(SSring S,SString T){
    int k=1;							//k为检查子串在主串的位置
    int i=k;j=1;						//i为检查子串的检查字符的位置,j为子串检查字符的位置
    while(i<=S.length&&i<=T.length){
        if(S.ch[i]==T.ch[j]){
            i++;
            j++;
        }else{
            k++;
            i=k;
            j=1;
        }
    }
    if(j>T.length)						//循环结束是因为子串匹配成功
        return k;
    else								//循环结束是因为子串到末尾也没匹配到
        return 0;
}

//方法二:不设置变量k
int Index(SSring S,SString T){						
    int i=1;j=1;						
    while(i<=S.length&&i<=T.length){
        if(S.ch[i]==T.ch[j]){
            i++;
            j++;
        }else{
            i=i-j+2;					//i-(j-1)+1; j-1子串扫描过的,+1后移一位
            j=1;
        }
    }
    if(j>T.length)						
        return i-T.length;				//返回第一个字符的位置
    else
        return 0;
}

4.2.2 KMP算法(上)

  • 模式串指针回溯位置——int next[7]

  • 例如:g o o g l e

    当j=k且发现字符不匹配是,令j=next[k];若当前两字符匹配,i++,j++;

    若j=1时发生不匹配,则应让j回到0,i++,j++(让i++,j依旧为1);若j=2时发生不匹配,则应让j回到1;

    若j=3时发生不匹配,则应让j回到1;若j=4时发生不匹配,则应让j回到1;

    若j=5时发生不匹配,则应让j回到2;若j=6时发生不匹配,则应让j回到1

*KMP算法代码
int Index_KMP(SString S,SString T,int next[]){
    int i=1,j=1;
    while(i<=S.length||j<=T.length){
        if(j==0||S.ch[i]==T.ch[j]){		//如果从0开始,为i-1、j-1
            i++;
            j++;						//初始时或匹配,继续往后比较
        }else{
            j=next[j];					//不匹配,模式串向右移动
        }
        if(j>T.length)
            return i-T.length;
        else
            return 0;
    }
}

4.2.3 KMP算法(下)

*求next数组
  • 串的前缀:包含第一个字符,且不包含最后一个字符的子串

    串的后缀:包含最后一个字符,且不包含第一个字符的子串

  • 当第j个字符匹配失败,由前1~j-1个字符组成的串记为S,则next[j-1]=S的最长相等前后缀长度+1

    特别地,next[1]=0;且next[2]=1,前后缀无相等next[x]=1(0+1)

  • 时间复杂度为O(m+n)

void get_next(SString T,int next[]){
    int i=1,j=0;
    next[1]=0;
    while(i<T.length){
        if(j==0||T.ch[i]==T.ch[j]){
            i++;
            j++;
            next[i]=j;
        }else
            j=next[j];
    }
}

int Index_KMP(SString S,SString T){
    int i=1,j=1;
    int next[T.length+1];				//next[0]为空才能对应
    get_next(T,next);					//时间复杂度为O(n)
    while(i<=S.length||j<=T.length){	//时间复杂度为O(m)
        if(j==0||S.ch[i]==T.ch[j]){
            i++;
            j++;						
        }else{
            j=next[j];					
        }
        if(j>T.length)
            return i-T.length;
        else
            return 0;
    }
}

4.2.4 KMP算法的优化

  • next[j]的优化:当子串和模式串不匹配时j=nextval[j]

    思路:如果next回溯的字符和此字符相同,可将回溯字符的next给此字符:

*求nextval数组
//先算出next数组,先令nextval[1]=0
for(int j=2;j<=T.length;j++){
    if(T.ch[next[j]]==T.ch[j])
        nextval[j]=nextval[next[j]];
    else
        nextval[j]=next[j];
}

补充:广义表

  • 广义表(列表Lists)是n>=0个元素的有限序列,其中每一个元素或者是原子,或者是一个广义表;例如 LS=(a 1,a 2, … ,an)

  • 其中:LS为表名,n为表的长度,每一个a i为表的元素;习惯上,一般用大写字母表示广义表,小写字母表示原子

  • 表头:若LS非空(n>=1),则其第一个元素就是表头;记作head(LS)=a 1;注意:表头可以是原子,也可以是表子

    表尾:除表头之外的其他元素组成的表;记作tail(LS)=(a 2,a 3,…,an);注意:表尾不是一个元素,而是一个子表;例如:A=(x,y,z) 长度为3,表头为x,表尾为(y,z);每一项都是原子

    B=(()) 长度为1,表头、表尾均为();代表一个空子表

    C=(a,(b,c)) 长度为2,表头为a,表尾为((b,c));由原子a和子表(b,c)组成

    D=(a,D) 长度为2,表头为a,表尾为(D);由原子a和它本身组成

  • 广义表的性质:

    1. 具有相对次序,一个直接前驱和一个直接后继
    2. 广义表的长度定义为最外层所包含元素的个数
    3. 广义表的深度为该广义表展开后所含括号的重数;注意:“原子”的深度为0,“空表”的深度为1
    4. 广义表可以为其他广义表共享,通过名称来引用
    5. 广义表也可以是一个递归的表;注意:递归表的深度是无穷值,长度是有限值
    6. 广义表是多层次结构,元素可以是单元素,也可以是子表;可以用图形象的表示
  • 广义表和线性表的区别:广义表是线性表的推广,线性表是广义表的特例;广义表可以兼容线性表、数组、树和有向图等常用数据结构

  • 广义表的基本运算

    1. 求表头:可以是第一个元素,也可以是第一个表
    2. 求表尾:一定是一个表
【PyGIS】ERA5降雨蒸散发数据预处理 ERA5-LAND降雨蒸散发数据预处理 阅读详情

相关推荐

快手极速版抓包实战:安卓/iOS双端获取client_salt全流程解析(避坑指南)

本文详细解析了在安卓和iOS平台上获取快手极速版关键参数`client_salt`的全流程,包括环境配置、抓包工具使用、参数识别与转换等实战技巧。特别针对双端差异和反抓包机制提供了避坑指南,帮助开发者高效安全地完成数据获取任务。

weixin_29021195的博客 716

《数据结构(C语言版)》学习笔记05 串

串的基本实现,包括定长顺序存储、堆分配存储、块链存储的介绍,以及KMP算法实现、next数组求法、优化KMP算法实现等。

梦想终会实现 1277

自学PCB思路 | PCB设计零基础入门-小白适用(附详细入门经验分享)

本人大一在实践课上就听说PCB,被虎的一楞一楞的,不过现在回看,发现其实并没有相信的那么难!想着把自己这一路摸索的学习路线分享一下,当时我是一边摸索一边上手,一把鼻涕一把泪的过来的。如果你想搞硬件或者需要搞硬件,下面是我的入门学习过程,希望可以帮到你。目录前言选择一款设计软件好的入门课程掌握抄板元件采购焊板子烙铁头热风枪自己半设计明确设计需求全设计最后我并非什么大佬,也没法自己去教大家如何画板。

自动化小秋葵的博客 1万+

数据结构(第四章串,学习笔记)

1.1 串定义和基本操作 1.1.1串的定义(逻辑结构):   串,即字符串(String)是由零个或多个字符组成的有限序列。一般记为:S=’a1a_1a1​a2a_2a2​a3a_3a3​…ana_nan​’(n≥0),其中,S是串名,单引号括起来的字符序列是串的值;aia_iai​可以是字母、数字或其他字符;串中字符的个数n称为串的长度.n=0时的串称为空串(用ϕ\phiϕ表示)。 注:   有的地方用双引号(如Java、C)有的地方用单引号(如Python)。 ====》串是一种特殊的线性表,数据元素

weixin_42645653的博客 653

【前端】【面试】【业务场景】前端如何获取并生成设备唯一标识

问题:前端如何获取并生成设备唯一标识?核心要点:浏览器原生信息有限,但通过组合多个维度可生成设备指纹(Device Fingerprint),用于唯一标识设备。常见方式浏览器信息(User-Agent)屏幕与系统参数本地存储标识(localStorage / cookie)第三方指纹库(如 FingerprintJS)方式优点缺点手动组合指纹实现简单不稳定,识别率低持久化强容易被用户清除识别率高、稳定性好依赖第三方库IP 地址识别网络识别粗略共享网络环境下重复可能大。

qq_59344127的博客 1796

Java8动态生成SFunction:基于字段名的Lambda表达式实践

本文深入探讨了在Java8中如何基于字段名动态生成SFunction,以解决MyBatis Plus的LambdaQueryWrapper在动态查询场景下的局限性。通过核心原理LambdaMetafactory的解析和手把手的代码实现,展示了如何将字符串字段名转换为类型安全的Lambda表达式,从而实现真正动态、类型安全的查询条件构建与通用数据处理,显著提升代码的灵活性与安全性。

sss66的博客 954

【二】数据结构第四章-串的堆分配存储-代码练习

这周换了VS CODE,放弃了DEVC,感觉用着不赖。 这次的动态分配的串虽然能正常运行,但是在赋值时会用到一个静态数组chars[256],感觉在动态分配是这样用非常不合理,但是我也不懂怎么修改,暂且先放着吧,希望有高手解答。 代码运行效果 /* 串的实现,采用堆分配方式(C/C++语言),即动态分配存储,以.cpp结尾的C++语言文件 由于C++语言支持引用,故已.cpp结尾,但仍采用C语言语法书写(但也不一定)。 故:采用引用方式实现各种基本功能。 */ using n...

wpwc8699的博客 561

STM8库函数开发手册(3) //UART1、内部EEPROM、FLASH操作库、IIC(硬、软)

STM8S 微控制器家族的通用同步异步收发器(UART1,UART2 或者UART3)提供了一种灵活的方法与使用工业标准NRZ 异步串行数据格式的外部设备之间进行全双工数据交换。STM8 的UART 提供范围的波特率选择,并且支持多处理器通讯。UART 也支持LIN(局部互联网)协议版本1.3,2.0,和2.1 以及在主模式下的J2602。 UART1 和UAR...

finedayforu的博客 2522

串的基本知识

#include <stdio.h> #include <stdlib.h> #include <string.h> #define MaxSize 15 // int StrCompare(SString S,SString T); // bool SubString(SString &Sub,SString S,int pos,int len); //定义串 typedef struct { char ch[MaxSize]; int length; }SSt

Lzylijn的博客 189

修复后找不到ip 黑群晖_黑群晖引导U盘损坏了怎么办?

前言虽然一般来说引导U盘损坏的可能性很小,但是避免不了万一出现问题导致黑群晖没有办法引导进入系统也是一件相当麻烦的事情。这里我就用两块U盘做个小试验,看看如果黑群晖上的引导U盘损坏以后,另一块U盘需要怎样写引导文件才能让黑群晖正常引导进入系统。试验开始我这里黑群晖使用的是DSM6.1.7的系统,U盘一块使用的是闪迪的酷豆,另一块就是闪迪的酷铄。目前系统引导U盘使用的是酷豆,VID:0781 PID...

weixin_36239323的博客 8270

Open3D 实现CSF布料模拟算法【2025最新版】

CSF布料模拟算法在open3d模块下的实现,博客长期更新,本文最近更新时间为:2025年1月16日。。

点云侠的博客 5749

数据结构 第四章总结

1.主串与模式串的模式匹配 这里讲了两种方法,bp暴力匹配和kmp算法。 想要理解kmp算法,就一定要弄懂kmp的核心,最长前后缀数组的求法。这里直接上代码。 void prefix_table(string a,int prefix[],int n){ prefix[0]=0; int len=0; int i=1;//这里我选择从两个字符开始对比,应为从一开始是,自己和...

weixin_30408675的博客 247

【Qwen2微调实战】LLaMA-Factory框架对Qwen2-7B模型的微调实践

在人工智能的浪潮中,大型语言模型(LLMs)正逐渐成为研究和应用的热点。它们在自然语言处理(NLP)的各个领域,如文本生成、翻译、问答等任务中展现出了卓越的能力。Qwen2-7B模型,作为该领域的佼佼者,不仅因其庞大的参数量和强大的表示能力受到关注,更因其在微调后能够更好地适应特定任务而备受关注。本文将详细介绍如何利用LLaMA-Factory这一高效的微调框架对Qwen2-7B进行微调,以期达到提升模型在特定任务上的表现。

寻道AI,探索AI无限可能! 2万+

【数据结构-陪读笔记】第四章:串

对串进行总结,对比陈越老师的kmp-next版本与严蔚敏老师的next版本。

Bonstoppo 414

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

数据结构笔记(王道考研) 第四章:串

数据结构笔记(王道考研) 第四章:串

zimuzi2019的博客 1378

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

数据结构学习笔记(第四章:串)

第三章:栈和队列4.1 串的定义和实现串的定义串的实现1、定长顺序存储实现 4.1 串的定义和实现 串的定义 串(String)是由零个或多个字符组成的有限序列。一般记为 S=‘a1a2...an’S=‘a_1a_2...a_n’S=‘a1​a2​...an​’ 串中任意多个连续的字符组成的子序列称为该串的子串。当两个串的长度相等且每个对应位置的字符相等时,称这两个串是相等的。 需要注意的是,由一个或多个空格组成的串称为空格串(空格串不是空串) 串的逻辑结构和线性表类似,区别仅在于串的数据类型限定为字符集。

qq_44993579的博客 622

(免费)04专升本数据结构笔记 第四章:串和数组

一、串的定义及其基本操作二、定长顺序存储结构三、堆存储结构四、块链存储结构串(string)是零个或多个字符组成的有限序列,通常记作:串中任意个连续的字符组成的子序列称为该串的子串。包含子串的串称为该子串的主串。子串在主串中第一次出现时第一个字符的位置称为子串的位置。当两个串的长度相等,并且各个对应位置的字符都相等时,称两个串是相等的。串的定长顺序存储结构指用一组地址连续的存储单元存放串的字符序列。255//串的最大长度//数组ch的每个分量存储串的一个字符int length;//串的长度。

lxttzlove的博客 671

数据结构(C语言版)学习笔记(第四章:串)

数据结构学习笔记(第四章:串)串的定义与实现基本概念串的基本操作串赋值:StrAssign(T,chars),把串T赋值为chars串复制:StrCopy(&T,S),由串S复制得到T串判空:StrEmpty(S)串比较:StrCompare(S,T),若S>T,则返回值>0,若S=T,则返回值=0,若S串的定义与实现 基本概念 串(String):由零个或多个字符组成的有限序列,一般记作(S=‘a1,a2,a3…an’, n>=0) 其中S是串名,单括号引起来的字符序列是串

Z_2nd的博客 763

数据结构知识总结笔记------第四章:串(1)串的定义、存储结构、基本操作

数据结构知识总结笔记------第四章:串(1)串的定义、存储结构、基本操作

DKPT的博客 1521

数据结构知识总结笔记------第四章:串(2)串的简单模式匹配算法、KMP算法、KMP算法的改进

数据结构知识总结笔记------第四章:串(2)串的简单模式匹配算法、KMP算法、KMP算法的改进

DKPT的博客 726

数据结构第四章笔记

第四章字符串和多维数组 本章的基本内容是: 串的存储结构及模式匹配算法数组的逻辑结构特征 数组的存储结构及寻址方法特殊矩阵和稀疏矩阵的压缩存储方法字符串的定义 字符串:零个或多个字符组成的有限序列。简称串串长度:串中所包含的字符个数。 空格串:只包含空格的串。 空串:长度为0的串,记为:" “。 非空串通常记为: S=” s1 s2 …… sn " 其中:S是串名,双引号是定界符,双引号引起来的...

see__you__again__的博客 608

408数据结构第四章 串

本篇文章是数据结构第四章:串的内容笔记,讲对数据结构串进行说明与算法补充

m0_74983085的博客 1612

【数据结构】第四章:串

【数据结构】第四章:串 一、串的定义 二、串的存储结构 1. 串的顺序存储 2. 串的链式存储 三、串的基本操作 1. 举例 2. 实现 四、模式匹配 1. 朴素模式匹配算法 2. KMP算法

iFulling的博客 1644

考研408_数据结构笔记(第四章 串)

本文介绍了串的基本概念、存储结构和模式匹配算法。首先定义串是由字符组成的有限序列,讨论了子串、主串等基本概念以及串的常用操作。在存储结构方面,介绍了顺序存储(静态和动态数组)和链式存储两种实现方式。重点讲解了串的模式匹配算法,包括朴素的暴力匹配算法和优化的KMP算法。KMP算法通过预处理模式串生成next数组,避免主串指针回溯,提高了匹配效率。文章还提出了进一步优化的nextval数组计算方法。这些内容为理解字符串处理和文本搜索算法提供了理论基础。

yanxing_D的博客 926

数据结构学习笔记 第四章 串

第四章 串 4.1串的基本概念 字符串是零个或多个字符组成的有限序列。 子串:串中任意个连续字符组成的子序列。 主串:包含字串的串称为主串。 字串在主串中的位置:以字串第一个字符所在的位置表示,即下标+1. 串相等:两个串值相等,即长度内容一样。 ADT 串 (String) Data 串中的元素仅由一个字符组成,相邻元素具有前驱和后继关系. Operation StrAssign (...

itLance的博客 685

866数据结构笔记 - 第四章 串

866数据结构、湖南大学考研、串

qq_45331246的博客 1423

数据结构(严版)课本代码重敲——第四章

复习笔记 数据结构 第四章 串 #include &lt;iostream&gt; #include &lt;string.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define maxSize 20 #define ERROR -1 using namespace std; /* 题目:数据结构 cha4 串 ...

暴走的二萌 384
上一篇: 笔记:数据结构——第三章 栈和队列
下一篇: 笔记:数据结构——第五章 树
ITS_Oaij
博客等级 码龄6年 1857粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值