当前位置: 首页 > news >正文

软件设计师2016下半年下午——KMP算法和装饰设计模式

下面是提供的代码的逐行注释,以及对next数组在KMP算法中的作用的解释:

#include <iostream>
#include <vector>
using namespace std;void buildNextArray(const char* pattern, vector<int>& next) {int m = strlen(pattern);    // 获取模式串的长度int j = 0;next[0] = 0;  // 第一个字符的next值始终为0for (int i = 1; i < m; i++) {while (j > 0 && pattern[i] != pattern[j])j = next[j - 1];  // 回溯到前一个字符的next值if (pattern[i] == pattern[j])j++;next[i] = j;}
}int KMP(const char* text, const char* pattern) {int n = strlen(text);  // 获取文本串的长度int m = strlen(pattern);  // 获取模式串的长度vector<int> next(m);  // 创建next数组并初始化buildNextArray(pattern, next);  // 构建next数组int i = 0, j = 0;while (i < n) {if (pattern[j] == text[i]) {i++;j++;if (j == m) {return i - j;  // 匹配成功,返回起始位置}} else {if (j != 0) {j = next[j - 1];  // 回溯到前一个字符的next值} else {i++;}}}return -1;  // 未找到匹配
}int main() {char str[] = "bacbababadababacambabacaddababacasdsd";char ptr[] = "ababaca";int result = KMP(str, ptr);if (result != -1) {cout << "Pattern found at index " << result << endl;} else {cout << "Pattern not found in the text." << endl;}return 0;
}
  • next数组在KMP算法中的作用是,它保存了每个字符对应的"最长相等前缀后缀长度"。这个信息帮助算法避免在不匹配时重复比较已经匹配的部分。next数组中的值告诉算法在不匹配时应该将模式串向后滑动多远,从而最大程度地减少比较操作的次数,提高匹配效率。

算法理解

好的,下面我将用一个比喻来解释KMP算法:

想象你正在阅读一本英语书,但你的英语水平有限,只能阅读英语中的一部分文字。你希望在这本书中找到一个特定的单词,比如 “HELLO”。

Naïve Approach:
在一本书中查找单词的朴素方法是从第一页开始,逐页翻阅,每次比较一页上的文字是否与单词匹配。如果不匹配,就翻到下一页再次尝试。这个过程需要不断地翻页和比较,可能需要很长时间才能找到单词。

KMP算法:
现在,你拥有一本字典,其中列出了各种英语单词以及它们的发音。你可以在字典中查找 “HELLO”,并得到 “HELLO” 这个单词的发音。然后,你可以在书中查找一个特定单词,比如 “HELLO”,并试着匹配发音而不是文字。

现在,当你在书中找到一段文字时,你可以直接比较这段文字的发音是否与 “HELLO” 的发音相匹配,而不需要一页一页翻阅。如果不匹配,你可以使用发音字典的信息,跳过一些文字,以减少不匹配的次数。这样,你可以更快地找到 “HELLO”。

KMP算法就像使用发音字典一样,它通过预处理模式字符串(单词)来构建一个跳转表(next数组),这个表告诉你在不匹配时应该跳过多远,以减少比较的次数。这使得KMP算法能够更高效地在文本中查找模式,特别是当模式很长时。

下面是你提供的代码,并在需要的地方填上合适的代码,同时提供相关的解释:

class Invoice {public void printInvoice() {System.out.println("This is the content of the invoice!");}
}class Decorator extends Invoice {protected Invoice ticket;public Decorator(Invoice t) {ticket = t;}public void printInvoice() {if (ticket != null) {ticket.printInvoice(); // (1) 调用包装的发票对象的打印方法}}
}class HeadDecorator extends Decorator {public HeadDecorator(Invoice t) {super(t);}public void printInvoice() {System.out.println("This is the header of the invoice!");super.printInvoice(); // (2) 调用父类的打印方法,以便在头部之后继续打印}
}class FootDecorator extends Decorator {public FootDecorator(Invoice t) {super(t);}public void printInvoice() {super.printInvoice(); // (3) 调用父类的打印方法,以便在底部之前继续打印System.out.println("This is the footnote of the invoice!");}
}public class Test {public static void main(String[] args) {Invoice t = new Invoice();Invoice ticket;// (4) 创建一个嵌套的装饰器链:头部 -> 原始发票 -> 底部ticket = new FootDecorator(new HeadDecorator(t));ticket.printInvoice(); // 输出装饰的结果System.out.println("------------------");// (5) 创建另一个嵌套的装饰器链:头部 -> 原始发票 -> 底部ticket = new HeadDecorator(new FootDecorator(t));ticket.printInvoice(); // 输出不同顺序的装饰结果}
}

逐行解释:

  1. ticket.printInvoice();Decorator 类的 printInvoice 方法中,调用包装的发票对象的打印方法,以实现在原始发票内容之上添加额外的内容。

  2. super.printInvoice();HeadDecorator 类的 printInvoice 方法中,调用父类的打印方法,以便在头部之后继续打印原始发票内容。

  3. super.printInvoice();FootDecorator 类的 printInvoice 方法中,调用父类的打印方法,以便在底部之前继续打印原始发票内容。

  4. 创建一个嵌套的装饰器链,先添加底部装饰器,然后再添加头部装饰器,最后包装了原始的 t 发票对象,以实现底部内容、原始内容和头部内容的顺序。

  5. 创建另一个嵌套的装饰器链,先添加头部装饰器,然后再添加底部装饰器,不同于第一个链的顺序。

这样,装饰模式允许以不同的顺序组合装饰器,以实现不同的打印顺序和输出结果。

相关文章:

软件设计师2016下半年下午——KMP算法和装饰设计模式

下面是提供的代码的逐行注释&#xff0c;以及对next数组在KMP算法中的作用的解释&#xff1a; #include <iostream> #include <vector> using namespace std;void buildNextArray(const char* pattern, vector<int>& next) {int m strlen(pattern); …...

Android Studio run main()方法报错

在studio中想要测试某个功能直接执行main()方法报错如下&#xff1a; * What went wrong: A problem occurred configuring project :app. > Could not create task :app: **** .main().> SourceSet with name main not found.解决方案&#xff1a; 执行run ** main() w…...

CM3D2 汉化杂记

老物难找资源&#xff0c;于是尝试自己汉化&#xff0c;皆源于有一个好的汉化插件。 资源&#xff1a;LMMT 工具&#xff1a;CM3D2.SubtitleDumper.exe&#xff0c;有道翻译(可以翻译文档)&#xff0c;Libreoffice(文档、表格) cmd&#xff08;资源管理器的结果可以拖进去&…...

分类预测 | Matlab实现SMA-KELM黏菌优化算法优化核极限学习机分类预测

分类预测 | Matlab实现SMA-KELM黏菌优化算法优化核极限学习机分类预测 目录 分类预测 | Matlab实现SMA-KELM黏菌优化算法优化核极限学习机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SMA-KELM黏菌优化算法优化核极限学习机分类预测(完整源码和数…...

linux的环境安装以及部署前后端分离后台接口

⭐⭐ linux专栏&#xff1a;linux专栏 ⭐⭐ 个人主页&#xff1a;个人主页 目录 一.linux安装环境 1.1 jdk和tomcat的安装配置 1.1.1 解压jdk和tomcat的安装包 解压jdk安装包 解压tomcat安装包 1.2 jdk环境变量配置 1.3 tomcat启动 1.4 MySQL的安装 二.部署前后端分离…...

解决mysql数据库root用户看不到库

第一种方式&#xff1a; 1.首先停止MySQL服务&#xff1a;service mysqld stop 2.加参数启动mysql&#xff1a;/usr/bin/mysqld_safe --skip-grant-tables & 然后就可以无任何限制的访问mysql了 3.root用户登陆系统&#xff1a;mysql -u root -p mysql 4.切换数据库&#…...

【LeetCode】117. 填充每个节点的下一个右侧节点指针 II

117. 填充每个节点的下一个右侧节点指针 II 难度&#xff1a;中等 题目 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; }填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c…...

《研发效能(DevOps)工程师》课程简介(三)丨IDCF

在研发效能领域中&#xff0c;【开发与交付】的学习重点在于掌握高效的开发工具和框架&#xff0c;了解敏捷开发方法&#xff0c;掌握持续集成与持续交付技术&#xff0c;以及如何保证应用程序的安全性和合规性等方面。 由国家工业和信息化部教育与考试中心颁发的职业技术证书…...

主动激活木马加密流量分析

概述 在网络攻击中&#xff0c;木马病毒通常会使用监听某个端口的方式&#xff0c;或者直接连接C2地址、域名的方式来建立通信&#xff0c;完成命令与控制。而APT攻击中&#xff0c;攻击者为了更高级的潜伏隐蔽需求&#xff0c;其部署的木马或后门&#xff0c;会采用对网卡流量…...

关于单片机CPU如何控制相关引脚

目录 1、相关的单片机结构 2、通过LED的实例解释 1、相关的单片机结构 在寄存器中每一块都有一根导线与引脚对应&#xff0c;通过cpu改变寄存器内的数据&#xff08;0或1&#xff09;&#xff0c;通过驱动器来控制对于的引脚。 2、通过LED的实例解释 如图所示&#xff0c;芯片…...

[概述] 获取点云数据的仪器

这里所说的获取点云的仪器指的是可以获取场景中物体距离信息的相关设备&#xff0c;下面分别从测距原理以及适用场景来进行介绍。 一、三角测距法 三角测距原理 就是利用三角形的几何关系来测量物体的距离。想象一下&#xff0c;你站在一个地方&#xff0c;你的朋友站在另一…...

路由器基础(八):策略路由配置

在实际网络应用中&#xff0c;策略路由也是一种重要的技术手段。尽管 在考试并不注重策略路由&#xff0c;但是实际上应用较多&#xff0c;建议考生除了掌握基本的静态路由协议IP route-static, 动态路由协议RIP 、OSPF的基础配置外&#xff0c;还要掌握如何配置策略路由。…...

Java 零碎知识点

目录 [多线程]创建多线程的三种方式 [网络编程]一、重点概念1、TCP/IP网络模型2、IP 对象3、端口号4、协议UDP(User Datagram Protocol)TCP(Transmission Control Protocol) 二、UDP 通信三、TCP 通信 [前端][Vue]一、Vue3项目创建响应式函数父子通信父传子子传父 跨层组件通信…...

多模态论文阅读之BLIP

BLIP泛读 TitleMotivationContributionModel Title BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation Motivation 模型角度&#xff1a;clip albef等要么采用encoder-base model 要么采用encoder-decoder model.…...

OpenCV实战——OpenCV.js介绍

OpenCV实战——OpenCV.js介绍 0. 前言1. OpenCV.js 简介2. 网页编写3. 调用 OpenCV.js 库4. 完整代码相关链接 0. 前言 本节介绍如何使用 JavaScript 通过 OpenCV 开发计算机视觉算法。在 OpenCV.js 之前&#xff0c;如果想要在 Web 上执行一些计算机视觉任务&#xff0c;必须…...

qt5工程打包成可执行exe程序

一、编译生成.exe 1.1、在release模式下编译生成.exe 1.2、建一个空白文件夹package&#xff0c;再将在release模式下生成的.exe文件复制到新建的文件夹中package。 1.3、打开QT5的命令行 1.4、用命令行进入新建文件夹package&#xff0c;使用windeployqt对生成的exe文件进行动…...

Qt之基于QCustomPlot绘制直方图(Histogram),叠加正态分布曲线

一.效果 二.原理 1.正态分布 高斯分布(Gaussian distribution),又名正态分布(Normal distribution),也称"常态分布",也就是说,在正常的状态下,一般的事物,都会符合这样的分布规律。 比如人的身高为一个随机变量,特别高的人比较少,特别矮的也很少,大部分都…...

232.用栈实现队列

原题链接&#xff1a;232.用栈实现队列 思路 主要是要注意栈和队列的数据结构的区别&#xff0c;一个是后进先出&#xff0c; 一个是先进先出 如果要用栈模拟队列的先进先出&#xff0c;那就得使用另一个辅助空间来存储栈的栈顶元素&#xff0c;然后把栈最底部的元素弹出&…...

C51--项目--感应开关盖垃圾桶

1、项目概述 功能描述&#xff1a; 检测靠近时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c;2s后关盖。 发生震动时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c;2s后关盖。 按下按键时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c;2s后关盖。 硬件说明…...

基于单片机设计的太阳能跟踪器

一、前言 随着对可再生能源的需求不断增长&#xff0c;太阳能作为一种清洁、可持续的能源形式&#xff0c;受到越来越多的关注和应用。太阳能光板通常固定在一个固定的角度上&#xff0c;这限制了它们对太阳光的接收效率。为了充分利用太阳能资源&#xff0c;提高太阳能光板的…...

通过用量看板深度分析,回顾团队月度大模型API开销明细

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过用量看板深度分析&#xff0c;回顾团队月度大模型API开销明细 对于团队管理者而言&#xff0c;清晰、透明地掌握大模型API的使…...

AI Agent Harness Engineering 与组织结构重塑:未来公司将变成什么样

AI Agent Harness Engineering 与组织结构重塑:未来公司将变成什么样 摘要/引言 你有没有在深夜刷到过这样的“科技黑话式”创业视频?创始人拍着桌子喊:“我们公司90%的活都是AI干的!产品上线从3个月缩短到3天!利润率翻了10倍!”旁边的工位要么是空的,要么坐着手忙脚乱…...

产品经理必懂的博弈论:如何用帕累托最优和纳什均衡设计用户激励与平台规则

产品经理必懂的博弈论&#xff1a;如何用帕累托最优和纳什均衡设计用户激励与平台规则 在互联网产品的世界里&#xff0c;每天都有无数场看不见的博弈正在上演——司机与乘客的匹配、商家与消费者的互动、创作者与平台的共生。这些看似复杂的商业行为背后&#xff0c;往往遵循着…...

网络排障利器netstat:从TCP状态机到实战故障排查

1. 网络排障的“听诊器”&#xff1a;为什么是netstat&#xff1f;在服务器运维、后端开发或者日常处理网络问题的过程中&#xff0c;我们经常会遇到一些让人头疼的场景&#xff1a;服务端口明明启动了&#xff0c;客户端却死活连不上&#xff1b;服务器负载莫名飙升&#xff0…...

如何通过WindowResizer精准掌控Windows窗口尺寸布局

如何通过WindowResizer精准掌控Windows窗口尺寸布局 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 在现代多任务工作环境中&#xff0c;Windows窗口尺寸的灵活性直接关系到工作效…...

Sparse4D v3 去噪模块实战:手把手教你用PyTorch实现3D时序目标检测中的噪声抑制

Sparse4D v3去噪模块深度解析&#xff1a;从理论到PyTorch实战 1. 三维目标检测中的噪声挑战与去噪机制演进 在自动驾驶和机器人感知领域&#xff0c;三维目标检测系统面临着复杂的噪声环境。传感器噪声、遮挡、光照变化以及物体外观多样性等因素&#xff0c;都会在检测过程中引…...

MCUXpresso for VS Code集成J-Link脚本的三种工程化方法详解

1. 项目概述&#xff1a;为什么要在IDE里折腾脚本&#xff1f;如果你是一位使用NXP MCU的嵌入式开发者&#xff0c;大概率对MCUXpresso IDE和SEGGER J-Link调试器这对黄金搭档不陌生。在传统的MCUXpresso IDE&#xff08;基于Eclipse&#xff09;里&#xff0c;通过图形界面配置…...

深度解析SacreBLEU:5个实战技巧提升机器翻译评估效率

深度解析SacreBLEU&#xff1a;5个实战技巧提升机器翻译评估效率 【免费下载链接】sacrebleu Reference BLEU implementation that auto-downloads test sets and reports a version string to facilitate cross-lab comparisons 项目地址: https://gitcode.com/gh_mirrors/s…...

如何快速提升Windows性能:终极系统优化完整指南

如何快速提升Windows性能&#xff1a;终极系统优化完整指南 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-zh_CN …...

中国科学技术大学学位论文LaTeX模板:5个高效排版技巧与终极指南

中国科学技术大学学位论文LaTeX模板&#xff1a;5个高效排版技巧与终极指南 【免费下载链接】ustcthesis LaTeX template for USTC thesis 项目地址: https://gitcode.com/gh_mirrors/us/ustcthesis 如果你正在准备中国科学技术大学的学位论文&#xff0c;那么ustcthesi…...