算法分析 KMP算法中next值的计算、0/1背包问题

5.6.1 KMP算法中next值的计算


        设模式的长度为m。用蛮力法求解 KMP算法中的 next值时,next[0]可直接给出,计算next[j](1<=j<=m-1)则需要在 T[0] …T[j-1]中分别取长度为j-1、..、2、1的真前缀和真后缀并比较是否相等,最坏情况下的时间代价是:

但实际上,只需将模式扫描一遍,就能够在线性时间内求得模式的next值。
        因为T[0]既没有真前缀也没有真后缀,因此 next[0]=-1。假设已经计算出next[0],next[1],...,next[j], 如何计算 next[j+1]呢?设 k=next[j], 则 T[0]...T[k-1]=T[j-k]...T[j-1],这意味着 T[0]...T[k-1]是T[0]···T[j-1]的真前缀,同时 T[j-k]...T[j-1]是 T[0]...T[j-1]的真后缀。为了计算 next[j+1],比较 T[k]和T[j],可能出现两种情况:
(1) T[k]=T[j]:说明 T[0]~T[k-1]T[k]=T[j-k]~T[j-1]-T[j], 如图5-15所示。由next值的义,next[j+1]=k+1。

(2) T[k]≠T[j]:此时要找出 T[0]...T[j-1]的真前缀和真后缀相等的第2大子串,由
于T[0]...T[j-1]的真前缀和真后缀相等的最大子串是 T[0]...T[k-1], 而 next[k]的值为T[0].…T[k一1]的真前缀和真后缀相等的最大子串的长度,则 T[0].…T[next[k]-1]即T[0]...T[j-1]的真前缀和真后缀相等的第2大子串,如图5-16所示。令 k=next[k], 再比较T[k]和T[j],此时仍会出现两种情况。当T[k]=T[j]时,与情况(1)类似,此时,next[j+1]=k+1;当T[k]≠T[j]时, 与情况(2)类似,再找出 T[0]...T[k-1]的真前级和真后级相等的最大子串,重复(2)的过程,直至 T[k]=T[j],或 next[k]=-1, 说明T[0]..…T[j-1]不存在真前缀和真后缀相等的子串,此时,next[j+1]=0.

例如,模式 T="abaababc"的next值计算如下。
j=0时,next[0]=-1
j=1时,k=next[0]=-1, next[1]=0
j=2时, k=next[1]=0, T[0]≠T[1];k=next[k]=next[0]=-1.next[2]=0
j=3时,k=next[2]=0, T[0]=T[2]; next[3]=k+1=0+1=1
j=4时, k=next[3]=1, T[1]≠T[3];k=next[k]=next[1]=0, T[0]=T[3], next[4]=k+1=1
j=5时,k=next[4]=1, T[1]=T[4],next[5]=k+1=1+1=2
j=6时,k=next[5]=2, T[2]=T[5],next[6]=k+1=2+1=3
j=7时, k=next[6]=3, T[3]≠T[6];k=next[k]=next[3]=1, T[1]=T[6], next[7]=k+1=2

        基于以上想法,在线性时间内求得模式next值的程序如下。

void GetNext(char T[ ], int next[]){

int j= 0,k=-1;
next[0]=-1;
while (T[j]!='\0') 
{

if (k== -1) {next[++j]= 0;k=0;}
else if (T[j] == T[k])
{

k++;next[++j]= k;

}
else k= next[k];
}
}

5.6.2  0/1 背包问题


【问题】给定几个重量为(w1,w2, .…,wn)、价值为(V1,V2,...,Vn)的物品和一个容量为C的背包,0/1背包问题(0/1 knapsack problem)是求这些物品的一个最有价值的子集,并且要能够装到背包中。


应用实例
有几项可投资的项目,每个项目需要投入资金si,可获利润为Vi,现有可用资金总数为M,应选择哪些项目来投资,可获得最大利润。


【想法】用蛮力法解决0/1背包问题,需要考虑给定n个物品集合的所有子集,找出有总重量不超过背包容量的子集,计算每个可能子集的总价值,然后找到价值最大的子集。例如,给定4个物品的重量为(7,3,4,5),价值为(42, 12,40,25),和一个容量为10的背包,表5-3给出了蛮力法求解0/1背包问题的过程

【算法】 蛮力法求解0/1背包问题的算法用伪代码描述如下。
算法:蛮力法求解 0/1 背包问题
输人:重量(W1, W2, …,Wn),价值(V1, V2,…,Vn),背包容量C
输出:装人背包的物品编号
1. 初始化最大价值 maxValue=0;结果子集S=非空;
2.对集合(1,2, …,n)的每一个子集T,执行下述操作:
2.1 初始化背包的价值value=0;背包的重量 weight=0;
2.2对子集T的每一个元素j执行下述操作:
2.2.1如果 weight+wj < C, 则 weight= weight+ wj, value=value+vj ;
2.2.2 否则,转步骤2考查下一个子集;
2.3 如果 maxValue < value, 则 maxValue=value; S=T;
3.输出子集S中的各元素;
【算法分析】 对于具有n个元素的集合,其子集数量是2^n,所以,无论生成子集的算
法效率有多高,蛮力法求解0/1背包问题的时间下限是Ω(2^n)。

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

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

相关文章

解析Linux键盘组合键产生信号的完整过程:从硬件中断到信号发送

前言 每一个了解Linux的都知道这样一个知识&#xff0c;CtrlC组合键能够终止一个进程。 个人了解进程相关知识之后知道&#xff0c;一个进程被终止只会有有三种情况&#xff1a; 代码运行完毕&#xff0c;结果正确代码运行完毕&#xff0c;结果不正确代码运行异常&#xff…

鸿蒙OpenHarmony【基于Hi3516DV300开发板(时钟应用开发)】

概述 本文将介绍如何快速搭建基于OpenHarmony标准系统&#xff08;Hi3516DV300开发板&#xff09;的应用开发环境&#xff0c;并基于一个时钟APP示例逐步展示应用的创建、开发、调试和安装等流程。示例代码可以通过本链接获取。 时钟App是一款显示实时时间的应用&#xff0c;…

【GDPU】数据结构实验十 哈夫曼编码

【实验内容】 1、假设用于通信的电文仅由8个字母 {a, b, c, d, e, f, g, h} 构成&#xff0c;它们在电文中出现的概率分别为{ 0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10 }&#xff0c;试为这8个字母设计哈夫曼编码。 提示:包含两个过程:&#xff08;1&#xff09;构建…

【iOS】——浅析CALayer

文章目录 一、CALayer介绍二、UIview与CALayer1.区别2.联系 三、CALayer的使用1.初始化方法2.常用属性 四.CALayer坐标系1.position属性和anchorPoint属性2.position和anchorPoint的关系3.position、anchorPoint和frame的关系 五、CALayerDelegate六、CALayer绘图机制1.绘图流程…

利用Jenkins完成Android项目打包

问题和思路 目前存在的问题 打包操作由开发人员完成&#xff0c;这样开发进度容易被打断。 解决问题的思路 将打包操作交测试/产品/开发人员来完成&#xff0c;主要是测试/开发。 按照以上的思路&#xff0c;那么JenkinsGradle的解决方案是比较经济的&#xff0c;实现起来…

鸿蒙内核源码分析(互斥锁篇) | 互斥锁比自旋锁丰满多了

内核中哪些地方会用到互斥锁?看图: 图中是内核有关模块对互斥锁初始化,有文件,有内存,用消息队列等等,使用面非常的广.其实在给内核源码加注的过程中,会看到大量的自旋锁和互斥锁,它们的存在有序的保证了内核和应用程序的正常运行.是非常基础和重要的功能. 概述 自旋锁 和…

5.7 线程

进程&#xff1a;解耦稳定&#xff0c;内容之间是不相关的&#xff0c;通信不便利&#xff0c;理论上进程的软硬件的切换时间以及创建开销非常大。--------》资源共享线程实现 线程的问题&#xff1a;本质就是不解耦&#xff0c;一个出问题别的就很有可能出问题&#xff0c;同…

Scanner中next()、nextInt()、nextLine()、hasNext()、hasNextInt()的使用方法及注意事项

目录 1、next()、nextInt()、nextLine()的使用方法及区分 2、循环时如何使用hasNext方法 3、用hasNextInt()作为判断下一个输入是否为数字需要配合next()方法使用 1、next()、nextInt()、nextLine()的使用方法及区分 三者简单定义 next()&#xff1a;此方法遇见第一个有效字符…

使用AIGC生成软件类图表

文章目录 如何使用 AI 生成软件类图表什么是 MermaidMermaid 的图片如何保存&#xff1f;mermaid.liveDraw.io Mermaid可以画什么图&#xff1f;流程图时序图 / 序列图类图状态图甘特图实体关系图 / ER图 如何使用 AI 生成软件类图表 ChatGPT 大语言模型不能直接生成各类图表。…

linux系统下产生Segmentation fault 与 Segmentation fault (core dumped)!!!

最近在学习的过程中&#xff0c;遇到了Segment fault&#xff08;段错误&#xff09;的问题&#xff0c;经过一番查找资料&#xff0c;学到了一些相关知识&#xff0c;这里做一个梳理&#xff0c;以防以后在遇到类似的问题&#xff0c;并且希望能够帮助到大家一丝丝&#xff01…

python中numpy库使用

array数组 生成array数组 将list转化为array数组 import numpy as np np.array([1,2],typenp.int32)其中dtype定义的是元素类型&#xff0c;np.int32指32位的整形 如果直接定义dtypeint 默认的是32位整形。 zeors和ones方法 zeros()方法&#xff0c;该方法和ones()类似&a…

有什么方便实用的成人口语外教软件?6个软件教你快速进行口语练习

有什么方便实用的成人口语外教软件&#xff1f;6个软件教你快速进行口语练习 口语能力在语言学习中占据着重要的位置&#xff0c;因为它直接关系到我们与他人进行交流和沟通的效果。为了提高口语能力&#xff0c;很多成人选择通过外教软件进行口语练习&#xff0c;这些软件提供…

GNU Radio FFT模块结合stream to vector应用及Rotator频偏模块使用

文章目录 前言一、FFT 模块应用1、stream to vector 介绍2、创建 grc 图测试3、运行结果 二、频偏模块1、Rotator 简介2、创建 grc 图测试3、运行结果 前言 写个博客记录一下自己的蠢劲儿&#xff0c;之前我想用 FFT 模块做一些信号分析的东西&#xff0c;官方的 FFT 模块必须…

营销5.0时代,企业的痛如何解?

进入营销5.0阶段之后&#xff0c;许多企业都需解决连接客户效能低下的问题。针对这个问题&#xff0c;产品经理、软件开发公司包括个人开发者&#xff0c;要怎么找到有效的“解药”&#xff1f; 营销不仅每年都在变化&#xff0c;甚至每天都在变化。 ——现代营销学之父&…

【再探】设计模式—适配器、装饰及外观模式

结构型设计模式是用于设计对象和类之间关系的一组设计模式。一共有7种&#xff1a;适配器模式、装饰器模式、外观模式、桥接模式、组合模式、享元模式及代理模式。 1 适配器模式 需求&#xff1a;在软件维护阶段&#xff0c;已存在的方法与目标接口不匹配&#xff0c;需要个中…

论文阅读:RHO-1:Not All Tokens Are What You Need 选择你需要的 Tokens 参与训练

论文链接&#xff1a;https://arxiv.org/abs/2404.07965 以往的语言模型预训练方法对所有训练 token 统一采用 next-token 预测损失。作者认为“并非语料库中的所有 token 对语言模型训练都同样重要”&#xff0c;这是对这一规范的挑战。作者的初步分析深入研究了语言模型的 t…

记录一个练手的js逆向password

很明显 请求加密了password 全局搜索 有个加密函数(搜不到的可以搜临近的其他的关键字 或者url参数) 搜索的时候一定要仔细分析 我就没有仔细分析 我搞了好久 又是xhr又是hook的(还没hook到) 我当时也是疏忽了 我寻思这个也不是js文件 直到后来 我怎么也找不到 我就猜想 不…

代码随想录算法训练营DAY44|C++动态规划Part6|完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ

文章目录 完全背包理论基础完全背包问题的定义与01背包的核心区别为什么完全背包的循环顺序可以互换&#xff1f;CPP代码 ⭐️518.零钱兑换II思路CPP代码 ⭐️377. 组合总和 Ⅳ思路CPP代码 扩展题 完全背包理论基础 卡码网第52题 文章链接&#xff1a;完全背包理论基础 视频链接…

【数据结构与算法】力扣 102. 二叉树的层序遍历

题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a; root [3,9,20,null,null,15,7] 输出&#xff1a; [[3],[9,20],[15,7]]示例 2&#x…

上证50etf期权到底该怎么玩?

今天期权懂带你了解上证50etf期权到底该怎么玩&#xff1f;ETF期权是一种股票市场上的金融衍生品&#xff0c;它是在交易所上市交易的期权合约&#xff0c;其标的资产是某个特定的交易所交易基金&#xff08;ETF&#xff09;&#xff0c;如上证50指数ETF或沪深300指数ETF等。 上…