数据结构与算法基础(青岛大学-王卓)(5)

news2024/11/8 9:43:15

叮叮咚咚,新一期来袭,我还在吃桃子,吃桃子,吃桃子。。。串和python的字符串差不多,数组和广义表像是python的list


文章目录

      • 串(string) - 字符串
        • 概念及术语
        • 串的类型定义
        • 存储结构(同线性表)
        • 串的模式匹配算法
          • BF 算法
          • KMP算 法 (特点:速度快 )
      • 数组
        • 数组的定义
          • 一维数组
          • 二维数组
          • 数组特点
        • n维数组的数据类型定义
        • 数组的顺序存储
        • 特殊矩阵的压缩存储
          • 对称矩阵
          • 三角矩阵
          • 对角矩阵
          • 稀疏矩阵
      • 广义表
        • 概念
        • 性质
        • 广义表和线性表的区别?
        • 基本运算
      • 案例分析
    • TO BE CONTINUED...

串(string) - 字符串

概念及术语

  • 定义: 零个或多个任意字符组成的有限序列,是一种内容受限的线性表
    在这里插入图片描述

  • 子串 : 串中任意个连续字符组成的子序列称为该串的子串, 空串和串本身都是子串,不含本身的是真子串。

  • 主串 : 包含子串的串相应地称为主串。

  • 字符位置 : 字符在序列中的序号为该字符在串中的位置 。

  • 子串位置 : 子串第一个字符在主串中的位置 。

  • 空格串 : 由一个或多个空格组成的串 , 与空串不同。

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

  • 所有的空串是相等的。

串的类型定义

在这里插入图片描述

在这里插入图片描述

存储结构(同线性表)

  • 顺序串(顺序存储结构)(更常用因不经常插入删除)

    #define MAXLEN 255
    typedef struct{
    	char ch[MAXLEN+1]; // 存储串的一维数组,实际范围0-255(0可能保留不用)
    	int length; // 串的当前长度长度
    }SString;
    
  • 链串(链式存储结构)

    在这里插入图片描述

    // 块链结构
    #define CHUNKSIZE 80  // 块的大小可有客户定义
    typedef struct Chunk{
    	char ch[CHUNKSIZE];
    	struct Chunk *next;
    }Chunk;
    
    typedef struct LString{
    	Chunk *head,*tail; // 串的头指针和尾指针
    	int curlen; //串的当前长度
    }LString; //字符串的块链结构
    

串的模式匹配算法

确定主串中所含子串(模式串)第一次出现的位置(BF&KMP)

BF 算法
  • (Brute-Force, 又称古典的 、 经典的 、 朴素的 、 穷举的 )

思路:从主串的每一个字符开始依次与模式串字符进行比较

Index(S,T,pos)

  • 将主串的第 pos 个字符和模式串的第一个字符比较 ,若相等,继续逐个比较后续字符;

  • 若不等,从主串的下一字符起(回溯) , 重新与模式串的第一个字符比较

  • 直到主串的一个连续子串字符序列与模式串相等。 返回值
    为 S 中与 T 匹配的子序列第一个字符的序号 , 即匹配成功 。
    否则 , 匹配失败 , 返回值 0

    在这里插入图片描述

    int Index_BF(SString S, SString T, int pos){
        int i=pos; j=1; // 主串i的位置从1开始pos>=1
        while(i<=S.length&&j<=T.length){ 
            if (S.ch[i]==T.ch[j]) {++i; ++j;} // 主串和子串依次匹配下一个字符
            else {i=i-j+2; j=1} // 字符不相等,主串i回溯位置到(i-(j-1)+1),j回到1
        }
        if (j>T.length) return i-T.length; // 返回模式串匹配成功后主串对应首字符的下标
        else return 0;
    }
    
  • 时间复杂度为(n-m)*m+m --> (n-m+1)*m--> O(n*m)(当m<<n)在这里插入图片描述

KMP算 法 (特点:速度快 )

利用已经部分匹配的结果而加快模式串的滑动速度 ?
且主串 S 的指针 i 不必回溯 ! 可提速到 O( n+m )

在这里插入图片描述

j的位置可以根据模式串来确定 ,定义next[j]函数 , 表明当模式中剃个字符与主串中相应字符 " 失配 " 时 , 在模式中需重新和主串中该字符进行比较的字符的位置 。

在这里插入图片描述

在这里插入图片描述

int Index_KMP(SString S, SString T, int pos){
    int i=pos; j=1; // 主串i的位置从1开始pos>=1
    while(i<=S.length&&j<=T.length){ 
        if (S.ch[i]==T.ch[j]) {++i; ++j;} // 主串和子串依次匹配下一个字符
        else j=next[j] // 通过next[j]得到j的位置,i不用回溯
    }
    if (j>T.length) return i-T.length; // 返回模式串匹配成功后主串对应首字符的下标
    else return 0;
}

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

next[j]的改进- nextval[j]

在这里插入图片描述

在这里插入图片描述

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

数组

数组的定义

按一定格式排列起来的具有相同类型的数据元素的集合

一维数组

若线性表中的数据元素为非结构的简单元素,则称为一维数组 。
其逻辑结构有线性结构,定长的线性表 。

声明格式 : 数据类型 变量名称 [长度]

二维数组

在这里插入图片描述

声明格式: 数据类型变量名称 [行数] [列数] ,eg: int num[5][8]

在 C 语言中 ,一个二维数组类型也可以定义为一维数组类型
( 其分量类型为一维数组类型 ),

即 :typedef elemtype array2[m][n];

等价于 :

typedef elemtype array1[n];

typedef array1 array2[m];

三维数组 : 若二维数组中的元素又是一个一维数组 , 则称作三维数组 。。。。

n维数组:若n-1维数组中的元素又是一个一维数组结构则称为n维数组 。

线性表是数组结构的一个特例,数组结构又是线性表结构的扩展。

数组特点

结构固定(定以后维数和维界不再改变),基本操作就是初始化,销毁,取元素,修改元素 。

n维数组的数据类型定义

在这里插入图片描述

在这里插入图片描述

数组的顺序存储

一维数组存储位置

在这里插入图片描述

二维数组存储

  • 以行优先 - JAVA, C, BASIC ,COBOL ,PASCAL

    在这里插入图片描述

  • 以列优先 - FORTRAN

    在这里插入图片描述

三维数组 按页行列存放,页优先的顺序存储

在这里插入图片描述

在这里插入图片描述

扩展到n维数组存储位置计算

在这里插入图片描述

在这里插入图片描述

特殊矩阵的压缩存储

  • 压缩存储定义:若多个数据元素的值都相同 , 则只分配一个元素值的存储空间 , 且
    零元素不占存储空间 。

  • 特殊矩阵:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵(非零元素个数一般<5%)

对称矩阵

在这里插入图片描述

只需存储一半元素,存储个数为每一行个数相加,即1+2+3+…+n=n(n+1)/2

在这里插入图片描述

任一个元素存在一维数组的位置aij的位置i(i-1)/2+(j-1) 原理:前面(i-1)行个数+本行的前(j-1)个元素

三角矩阵

在这里插入图片描述

对角矩阵

[ 特点 ] 在n×n的方阵中,所有非零元素都集中在以主对角线为中心的带状区域中,区域外的值全为0 ,则称为对角矩阵 。 常见的有三对角矩阵 、 五对角矩阵 、 七对角矩阵等 。(3/5/7条数据)

在这里插入图片描述

在这里插入图片描述

稀疏矩阵

三元组(行,列,值) 和矩阵维数(总行,总列)来唯一确定一个元素的位置

在这里插入图片描述

  • 三元组顺序表又称有序的双下标法。

  • 优点:非零元素在表中按行序有序存储

  • 缺点:不能随机存储,按行号存取某一行中的非零元素要从头开始查找

十字链表 法存储稀疏矩阵

在这里插入图片描述

在这里插入图片描述

广义表

概念

广义表( 又称列表 Lists) 是 n>=0 个元素 a0, a1, a2…an-1的有限序列 , 其中每一个或者是原子 , 或者是一个广义表 。

在这里插入图片描述

性质

在这里插入图片描述

在这里插入图片描述

广义表和线性表的区别?

  • 广义表是线性表的推广,线性表是广义表的特例
  • 广义表的结构相当灵活 , 在某种前提下 , 它可以兼容线性表 、 数组 、
    树和有向图等各种常用的数据结构 。

基本运算

GetHead(L): 求非空广义表的第一个元素,可以是一个原子或者一个子表

GetTail(L):非空广义表去掉表头元素以外其他元素所构成的表。

案例分析

病毒感染检测(病毒RNA是环状)

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tK0IY99o-1687358835821)(../resources/image-20230621224425435.png)]


TO BE CONTINUED…

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

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

相关文章

leetcode46. 全排列(回溯算法-java)

全排列 leetcode46. 全排列题目描述解题思路代码演示 回溯算法专题 leetcode46. 全排列 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/permutations 题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有…

关于平差中误差方程 v=Bx-l 的探讨

文章目录 Part.I IntroductionPart.II 误差方程的探讨Chap.I 符号表示Chap.II 误差方程的含义Chap.III 误差方程的其他形式Chap.IV 平差的大致流程 Part.III 误差方程的表示形式 Part.I Introduction 在平时阅读文献或者整理笔记时&#xff0c;经常会看到各种各样的有关误差方…

Git安装详细教程(win11)

Git安装详细教程&#xff08;win11&#xff09; 一、下载二、安装三、配置 一、下载 官网下载&#xff1a;点击下载 网盘下载&#xff1a;点击下载 二、安装 双击程序运行&#xff0c;点击next 选择安装路径&#xff0c;我安装在了D盘&#xff0c;如下图所示&#xff0c;…

Server - 测试 GPU 的显卡使用率与张量之间的关系

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131331049 NVIDIA A100 是一款基于 Ampere 架构的高性能 GPU&#xff0c;专为 AI、数据分析和高性能计算等应用场景设计。NVIDIA A100 具…

【Java入门基础第10天】Java程序结构

Java程序结构 1、Java程序结构什么是Java程序结构&#xff1f; 2、Java注释1、单行注释2、多行注释3、多行注释 1、Java程序结构 什么是Java程序结构&#xff1f; 程序是由程序块组成的&#xff0c;所谓程序块&#xff0c;指的是使用一对{ } 包含若干的代码的总称。程序块是由…

【Python 基础篇】Python 变量与数据类型以及数据类型转换

文章目录 引言一、变量和常见数据类型1. 变量2. 常见数据类型 二、数据类型转换结论 引言 Python 是一种广泛应用于各个领域的高级编程语言&#xff0c;其灵活性和易用性使其成为众多开发者的首选。在 Python 中&#xff0c;变量是程序中存储数据的基本单元&#xff0c;而数据…

数据结构学习笔记:概论

✨博文作者&#xff1a;烟雨孤舟 &#x1f496; 喜欢的可以 点赞 收藏 关注哦~~ ✍️ 作者简介: 一个热爱大数据的学习者 ✍️ 笔记简介&#xff1a;作为大数据爱好者&#xff0c;以下是个人总结的学习笔记&#xff0c;如有错误&#xff0c;请多多指教&#xff01; 目录 数据结…

哈工大计算网络课程网络层协议之:IP数据报、IP子网、子网掩码详解

哈工大计算网络课程网络层协议之&#xff1a;IP数据报、IP子网、子网掩码详解 文章目录 哈工大计算网络课程网络层协议之&#xff1a;IP数据报、IP子网、子网掩码详解Internet网络层IP数据报&#xff08;分组&#xff09;格式IP数据报分片最大传输单元&#xff08;MTU&#xff…

网工内推 | 云计算专场,有通讯补助,13薪,带薪年假

01 中电信数智科技有限公司湖南分公司 招聘岗位&#xff1a;云计算工程师 职责描述&#xff1a; 1、云计算平台环境的搭建&#xff1a;安装、部署、配置、优化&#xff1b; 2、云计算平台有关的解决方案、平台测试&#xff1b; 3、桌面云和虚拟化项目的交付和维护工作&#…

功能强大却十分小众的5款软件

有些软件虽然功能强大&#xff0c;使用便捷&#xff0c;但是却没有得到广泛的关注和推荐&#xff0c;这并不意味着它们不值得一试&#xff0c;相反&#xff0c;它们可能是你不知道的宝藏。我的任务就是要把这些隐藏的好软件分享给大家。 轻量级笔记——CintaNotes CintaNotes…

PCB设计系列分享-LDO的布局布线指南

目录 概要 整体架构流程 技术名词解释 技术细节 小结 概要 “噪声问题” 这是每位电路板设计师都会听到的四个字。为了解决噪声问题&#xff0c;往往要花费数小时的时间进行实验室测试&#xff0e;以便揪出元凶&#xff0c;但最终却发现&#xff0c;噪声是由开关电源的布局不当…

27-1BP_Adaboost强分类器公司财务预管建模——强预测器和弱预测器(附matlab程序)

1.简述 学习目标&#xff1a;进行强预测器和弱预测器的训练来减小误差 BP_Adaboost模型 Adaboost算法的思想是合并多个“弱”分类器的输出以产生有效分类。其主要步骤为&#xff1a;首先给出弱学习算法和样本空间&#xff0c;从样本空间中找出m组训练数据&#xff0c;每组训练…

0015-TIPS-pawnyable : userfaultfd

原文 Linux Kernel PWN | 040303 Pawnyable之userfaultfd userfaultfdの利用 题目下载 代码分析 #include <linux/cdev.h> #include <linux/fs.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/random.h> #include &…

学生党可以做的暑期兼职,让暑假生活不再躺平

夏季期间有几种兼职工作可供选择&#xff1a; 1.许多超市在暑假期间会雇佣一些短期工来从事收银和理货等工作&#xff0c;每小时报酬一般约为15元左右&#xff0c;算是不错的待遇。 2.在暑假期间&#xff0c;你可以寻找一些人力资源工作&#xff0c;借助他们的帮助来安排一些临…

常用工具类之AJ-Captcha入门

1.引入MAVEN依赖 若依官方引入的是1.2.7版本。我选择了目前最常用的1.3.0版本。 在项目中给的 ruoyi-framework\pom.xml 添加依赖 <!-- anji滑块验证码 --><dependency><groupId>com.anji-plus</groupId><artifactId>spring-boot-starter-captc…

android native hook简介

&#xff08;一&#xff09;简介 android中的 native Hook是一个吸引人的技术点&#xff0c;诱使和带来很多特别精彩的想法和体验&#xff0c;在调试和其他场景中有很多应用。 本文代码基本都来自github上的源码&#xff0c;只做了适当的编辑和修改&#xff0c;主要是为了验证…

解决VMware虚拟机和Windows主机不在同一网段无法连接问题

解决VMware虚拟机和Windows主机不在同一网段无法连接问题 由于自己平时需要频繁更换虚拟机网段&#xff0c;有时候在Windows主机使用Xshell等SSH工具无法连接&#xff0c;还需要配置Windows主机的网段&#xff0c;需要将它们的网段配置到同一网段内&#xff0c;才能使SSH连接成…

Pillow库 三分钟带你了解最基础的使用

努力是为了不平庸~ 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰 目录 一、Pillow库是什么 二、以下是 Pillow 的一些主要作用和使用方法的概述&#xff1a; 三、学习使用 Pillow&#xff0c;一个强大的 Python …

python综合实践-利用Python turtle模块画樱花丛

目录 一、方法步骤 二、代码实现 三、代码解释 四、优化代码 五、Python turtle模块介绍 六、Python turtle模块使用方法 创建画布和画笔对象 控制画笔移动和旋转 控制画笔外观 绘制基本图形 控制画布参数 这段代码使用Python turtle模块&#xff0c;利用递归的方式绘…

前端实现消息推送、即时通信、SSE、WebSocket、http简介

信息推送 服务端主动向客户端推送消息&#xff0c;使客户端能够即时接收到信息。 场景 页面接收到点赞&#xff0c;消息提醒聊天功能弹幕功能实时更新数据功能 实现即时通讯方式 短轮询 浏览器&#xff08;客户端&#xff09;每隔一段时间向服务器发送http请求&#xff0c;…