【数据结构-串-数组-广义表】

news2025/1/15 6:28:12

目录

  • 1 串-理解
    • 1.1 串的抽象定义:-理解
    • 1.2 串的存储结构-不断掌握
      • 1.2.1 顺序存储结构:
      • 1.2.2 链式存储结构:
    • 1.3 串的模式匹配算法:-掌握
      • 1.3.1 BF暴力求解算法-代码 -掌握
      • 1.3.2 KMP求解算法-代码--掌握
  • 2 数组-不断掌握
    • 2.1 顺序存储结构
    • 2.2 特殊矩阵压缩存储
  • 3 广义表

快速的过一遍数据结构中的串、数组、广义表,

1 串-理解

 顾名思义,串也称字符串,不过在数据结构里面处理的串和常规的字符串不一样,这里吧字符串当成一个整体进行处理:例如,在串中查找某个子串,求取一个子串,在串的某个位置上插入一个子串,以及删除一个子串等

1.1 串的抽象定义:-理解

在这里插入图片描述

1.2 串的存储结构-不断掌握

1.2.1 顺序存储结构:

 主要是有:串的定长存储结构、和串的串的堆式顺序存储结构

1.2.2 链式存储结构:

在这里插入图片描述

1.3 串的模式匹配算法:-掌握

1.3.1 BF暴力求解算法-代码 -掌握

  1. BF(Brute Force,暴力搜索)串的模式匹配算法是一种简单直接的字符串匹配算法
#include <stdio.h>
#include <string.h>

int bfMatching(char *mainStr, char *patternStr)
{
    int mainLen = strlen(mainStr);
    int patternLen = strlen(patternStr);

    for (int i = 0; i < mainLen - patternLen + 1; i++)
    {
        if (strncmp(mainStr + i, patternStr, patternLen) == 0)
        {
            // 找到匹配返回起始位置
            return i;
        }
    }

    // 未找到匹配返回 -1
    return -1;
}

int main()
{
    char mainStr[] = "hello world example this is a example";
    char patternStr[] = "example";

    int result = bfMatching(mainStr, patternStr);
    if (result != -1)
    {
        printf("模式串在主串中首次出现的位置是:%d\n", result);
    }
    else
    {
        printf("未找到模式串\n");
    }

    return 0;
}

结果:
在这里插入图片描述

1.3.2 KMP求解算法-代码–掌握

  1. KMP(Knuth-Morris-Pratt)算法是一种字符串匹配算法,用于在主字符串中查找模式字符串。该算法的时间复杂度为 O(n + m),其中 n 和 m 分别是主串和模式串的长度。下面是一个用 C 语言实现 KMP 算法的示例代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_SIZE 255

typedef struct HString
{
    char zfc[MAX_SIZE];
    int length;
} HString;

// 获取 next 数组(部分匹配表)
void Get_Next(HString child, int *next)
{
    int i = 0, j = -1;
    next[0] = -1;

    while (i < child.length)
    {
        if (j == -1 || child.zfc[i] == child.zfc[j])
        {
            i++;
            j++;
            if (child.zfc[i] != child.zfc[j])
            {
                next[i] = j;
            }
            else
            {
                next[i] = next[j];
            }
        }
        else
        {
            j = next[j];
        }
    }
}

// 模式匹配函数
int bfMatching(char *mainStr, char *patternStr)
{
    HString parents;
    HString child;

    strcpy(parents.zfc, mainStr);
    parents.length = strlen(mainStr);
    strcpy(child.zfc, patternStr);
    child.length = strlen(patternStr);

    int *next = (int *)malloc(child.length * sizeof(int));
    Get_Next(child, next);

    int i = 0, j = 0;
    while (i < parents.length)
    {
        if (j == -1 || parents.zfc[i] == child.zfc[j])
        {
            i++;
            j++;
        }
        else
        {
            j = next[j];
        }
        if (j == child.length)
        {
            free(next);
            return i - j;
        }
    }

    free(next);
    return -1;
}

int main()
{
    char mainStr[] = "hello world example this is a example";
    char patternStr[] = "example";

    int result = bfMatching(mainStr, patternStr);
    if (result != -1)
    {
        printf("模式串在主串中首次出现的位置是:%d\n", result);
    }
    else
    {
        printf("未找到模式串\n");
    }

    return 0;
}

结果:在这里插入图片描述

2 数组-不断掌握

 主要是有数组类型定义,顺序存储结构,下标计算,对于数组而言,其下标之间的关系是一种线性关系,无论是几维数组

2.1 顺序存储结构

在这里插入图片描述

2.2 特殊矩阵压缩存储

 例如一些对称矩阵,我们不用把所有元素都存储,利用对称矩阵的性质,n阶矩阵只用存n(n+1)/2个数,而不用存n^2个数,还有一些其他的特殊矩阵和规则可以利用。

3 广义表

 顾名思义,广义表是线性表的推广,也称为列表。广泛地用千人工智能等领域的表处理语言LISP语言,把广义表作为基本的数据结构,就连程序也表示为一系列的广义表。
广义表的定义是一个递归的定义,因为在描述广义表时又用到了广义表的概念。下面 列举一些广义表的例子
在这里插入图片描述

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

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

相关文章

vue-cli2 与vue-cli3,vue2与vue3 初始化项目,本地vue项目,详细解析区别(2024-04-19)

目录 1、区别&#xff08;vue-cli2 与 vue-cli3 &#xff09; 2、例子1&#xff08;vue2项目&#xff09; 2.1 版本与命令行 2.2 项目本地截图 2.3 项目文件解析 &#xff08;1&#xff09;package.json 文件 &#xff08;2&#xff09;webpack.dev.conf.js文件 &#…

PTA图论的搜索题

目录 7-1 列出连通集 题目 输入格式: 输出格式: 输入样例: 输出样例: AC代码 7-2 六度空间 题目 输入格式: 输出格式: 输入样例: 输出样例: 思路 AC代码 7-3 地下迷宫探索 题目 输入格式: 输出格式: 输入样例1: 输出样例1: 输入样例2: 输出样例2: 思路 …

股票战法课程之主力的痕迹

文章目录 1. 主力的操作痕迹2. 主力的建仓2.1 建仓的三种方式2.2 建仓的五个特点2.3 建仓的迹象2.4 建仓的成交量特征 1. 主力的操作痕迹 序号痕迹原因1不跟随大盘节奏筹码都在主力手中2突发利空消息&#xff0c;股价不跌反涨主力被套&#xff0c;不希望散户抛盘3很小的成交量…

【初识Qt】如何使用QtCreator创建项目

文章目录 1 :peach:Qt Creator 概览:peach:2 :peach:使⽤ Qt Creator 新建项目:peach:2.1 :apple:新建项目:apple:2.2 :apple:使用标签实现 Hello World 程序:apple:2.2.1 :lemon:纯代码方式实现:lemon:2.2.2 :lemon:可视化操作实现:lemon: 2.3 :apple:使用按钮实现 Hello Worl…

vue element-ui 表格横向滚动条在合计项下方

目前效果 需求效果 1.隐藏bodyWrapper滚动条&#xff0c;显示footerWrapper滚动条 css代码如下&#xff1a; div ::v-deep .el-table--scrollable-x .el-table__body-wrapper{overflow-x: hidden!important;z-index: 2!important;} div ::v-deep .el-table__footer-wrapper …

WWW ‘24 | EarnMore: 如何利用强化学习来处理可定制股票池中的投资组合管理问题

WWW 24 | EarnMore: 如何利用强化学习来处理可定制股票池中的投资组合管理问题 原创 QuantML QuantML 2024-04-16 09:04 上海 Content 本文主要探讨了如何利用强化学习&#xff08;Reinforcement Learning, RL&#xff09;来处理可定制股票池&#xff08;Customizable Stock …

关于RA8900CE时钟芯片的使用注意事项

在快节奏的现代社会&#xff0c;时间变得越来越宝贵。对于时钟的电子设计&#xff0c;高精度且低功耗逐渐成为主流。我们就有一个汽车显示屏的时钟显示项目&#xff0c;要求时钟一天的误差控制在1s以内。要想达到此要求&#xff0c;则必须满足晶振的频率偏差PPM<1/60/60/24*…

【Hadoop大数据技术】——Sqoop数据迁移(学习笔记)

&#x1f4d6; 前言&#xff1a;在实际开发中&#xff0c;有时候需要将HDFS或Hive上的数据导出到传统关系型数据库中&#xff08;如MySQL、Oracle等&#xff09;&#xff0c;或者将传统关系型数据库中的数据导入到HDFS或Hive上&#xff0c;如果通过人工手动进行数据迁移的话&am…

微博聚类文本分析和可视化

本文使用python抓取微博数据并对微博文本分析和可视化&#xff0c;LDA&#xff08;树图&#xff09;、关系图、词云、时间趋势&#xff08;折线图&#xff09;、热度地图、词典情感分析&#xff08;饼图和3D柱状图&#xff09;、词向量神经网络情感分析、tfidf聚类、词向量聚类…

go语言并发实战——日志收集系统(四) 利用tail包实现对日志文件的实时监控

Linux中的tail命令 tail 命令是一个在 Unix/Linux 操作系统上用来显示文件末尾内容的命令。它可以显示文件的最后几行内容&#xff0c;默认情况下显示文件的最后 10 行。tail 命令 非常有用&#xff0c;特别是在我们查看日志文件或者监视文件变化时。 基本用法如下&#xff1a…

搭建sql-lab出现的php不兼容

下载不了的时候&#xff0c;直接打开该网址下载5.xphp版本&#xff0c;解压到C:\php_studyv8\phpstudy\phpstudy_pro\Extensions\php&#xff08;可能路径都不一样&#xff0c;找到Extensions\php放到该目录下&#xff09;

Excel模板导入、导出工具类

1.引入maven依赖&#xff0c;利用hutool的excel读取 Hutool-poi对excel读取、写入 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency> <depen…

期权小知识科普

期权的交易时间 上交所期权合约的交易时间为每个交易日9:15至9:25、9:30至11:30、13&#xff1a;00至15:00。 其中&#xff0c;9:15至9:25为开盘集合竞价时间&#xff0c;14:57-15:00为收盘集合竞价时间&#xff0c;其余时段为连续竞价时间&#xff0c;交易所规则另有规定的除…

后台管理系统加水印(react)

效果 代码图片 代码 window.waterMark function (config) {var defaultConfig {content: 我是水印,fontSize: 16px,opacity: 0.3,rotate: -15,color: #ADADAD,modalId: J_waterMarkModalByXHMAndDHL,};config Object.assign({}, defaultConfig, config);var existMarkModal…

Hadoop3:大数据的基本介绍

一、什么是大数据 1、大数据的4v特点 Volume&#xff08;大量&#xff09; Velocity&#xff08;高速&#xff09; Variety&#xff08;多样&#xff09; Value&#xff08;低价值密度&#xff09; 2、大数据部门间的工作岗位 第三部分&#xff0c;其实就是JavaWeb 二、…

李沐53_语言模型——自学笔记

语言模型 1.预测文本序列出现的概率 2.应用在做预训练模型 3.生成文本&#xff0c;给定前面几个词&#xff0c;不断生成后续文本 4.判断多个序列中哪个更常见 真实数据集的统计 《时光机器》数据集构建词表&#xff0c; 并打印前10个最常用的&#xff08;频率最高的&…

4.4 @ControllerAdvice全局数据处理

顾名思义&#xff0c;&#xff20;ControllerAdvice 就是&#xff20;Controller 增强版。&#xff20;ControllerAdvice 主要用来处理全 局数据 ,一般搭配&#xff20;ExceptionHandler、&#xff20;ModelAttribute 及&#xff20;InitBinder 使用。 1. 全局异常处理&#x…

密文字段模糊检索方案

代码地址: https://github.com/zuiyu-main/EncryptDemo https://mp.weixin.qq.com/s/cXOg1tiMtJz2eibDZmXHUQ 在个别特殊领域中&#xff0c;数据的安全问题是非常的重要的&#xff0c;所以需要数据库存储的数据是需要加密存储的。所以也就引申出来本文这个问题&#xff0c;加密…

【C语言__动态内存管理__复习篇6】

目录 前言 一、动态内存管理 二、动态内存函数 2.1 malloc 2.2 free 2.3 calloc 2.4 realloc 三、动态内存常见的6个使用错误 3.1 接收malloc/calloc返回的参数后未及时检查是否为NULL 3.2 越界访问动态内存空间 3.3 对非动态开辟的内存使用free释放 3.4 使用free只释放了…

STM32学习和实践笔记(17):STM32外部中断(EXTI)的整体介绍

1.外部中断介绍 1.1 EXTI简介 STM32F10x外部中断/事件控制器&#xff08;EXTI&#xff09;包含多达 20 个用于产生事件/中断请求的边沿检测器。&#xff08;事件与中断的区别&#xff0c;可参看STM32---中断与事件的区别_中断和事件的区别-CSDN博客&#xff09; 具体有哪些&a…