算法分析 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.mfbz.cn/a/599109.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库事务隔离级别及mysql实现方案

1、数据库的并发问题 以下几个概念是事务隔离级别要实际解决的问题&#xff0c;所以需要搞清楚都是什么意思。 脏读&#xff1a;读到了其他事务未提交的数据&#xff0c; 不可重复读&#xff1a;在一个事务内&#xff0c;多次读取的同一批数据出现不一致的情况。 幻读&…

CTK库编译-01

地址 官网地址&#xff1a;Commontk github地址&#xff1a;https://github.com/commontk/CTK 编译环境 Qt套件&#xff1a; IDE&#xff1a;VS2022 使用vs2022 文件->打开->cmake 修改根目录下的CMakeLists.txt 默认只编译core模块&#xff0c;所以需要把部分模块…

无偏扭曲区域采样在可微分渲染中的应用

图1. 可微渲染计算光传输方程的导数。为了处理可见性的存在&#xff0c;最近的基于物理的可微渲染器需要显式地找到边界点[Li等人2018; Zhang等人2020]&#xff0c;或者通过启发式方法近似边界贡献[Loubet等人2019]。我们从第一原理出发&#xff0c;开发了一个无偏估计器&#…

阿里巴巴alibaba国际站API接口:商品详情和关键词搜索商品列表

阿里巴巴国际站&#xff08;Alibaba.com&#xff09;提供了API接口供开发者使用&#xff0c;以实现与平台的数据交互。然而&#xff0c;由于API的详细内容和调用方式可能会随着时间和平台更新而发生变化&#xff0c;以下是一个概述和一般性的指导&#xff0c;关于如何使用阿里巴…

企业邮箱是什么?怎么注册一个企业邮箱?

企业邮箱是什么&#xff1f;有什么特征&#xff1f;企业邮箱的特征就是以企业域名为后缀。企业通过企业邮箱能够提升自身的品牌形象&#xff0c;还能够提高员工的工作效率。作为企业的管理者来说&#xff0c;应该如何注册一个企业邮箱呢&#xff1f;小编今天就为您介绍下企业邮…

期权怎么开户?

今天期权懂带你了解期权怎么开户&#xff1f;近年来&#xff0c;随着股市的持续低迷&#xff0c;市场交易痛点越发明显的氛围中&#xff0c;所以有人看到了双向交易的期权。 期权怎么开户&#xff1f; 1、首先是证券账户内的资金需要满足50万保留20个交易日&#xff1b; 2、其…

Transformer详解:从放弃到入门(二)

多头注意力 上篇文章中我们了解了词编码和位置编码&#xff0c;接下来我们介绍Transformer中的核心模块——多头注意力。 自注意力 首先回顾下注意力机制&#xff0c;注意力机制允许模型为序列中不同的元素分配不同的权重。而自注意力中的"自"表示输入序列中的输入相…

相机内存卡格式化怎么恢复?恢复数据的3个方法

相机内存卡格式化后&#xff0c;许多用户都曾面临过照片丢失的困境。这些照片可能具有极高的纪念价值&#xff0c;也可能包含着重要的信息。因此如何有效地恢复这些照片变得至关重要。本文将详细介绍三种实用的恢复方法&#xff0c;帮助您找回那些珍贵的影像。 下面分享几个实…

RS2103XH 功能和参数介绍及规格书

RS2103XH 是一款单刀双掷&#xff08;SPDT&#xff09;模拟开关芯片&#xff0c;主要用于各种模拟信号的切换和控制。下面是一些其主要的功能和参数介绍&#xff1a; 主要功能特点&#xff1a; 模拟信号切换&#xff1a;能够连接和断开模拟信号路径&#xff0c;提供灵活的信号路…

经典面试题之滑动窗口专题

class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {// 长度最小的子数组 // 大于等于 targetint min_len INT32_MAX;// 总和int sum 0;int start 0; // 起点for(int i 0; i< nums.size(); i) {sum nums[i];while(sum > targe…

京东淘宝1688商品采集商品数据抓取API

item_get-获得淘宝商品详情 item_search 关键字搜索商品 公共参数 请求地址: taobao/item_search 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&a…

安卓自动化脚本制作流程详解!

在移动应用日益普及的今天&#xff0c;安卓自动化脚本制作成为了开发者提高工作效率、减少重复劳动的重要手段&#xff0c;本文将详细介绍安卓自动化脚本的制作流程&#xff0c;并通过五段源代码的实例&#xff0c;帮助读者更好地理解和掌握这一过程。 一、安卓自动化脚本制作…

Vector Laboratories|用于生物偶联疗法BioDesign™ dPEG® Linker连接平台

术语dPEG代表“离散PEG&#xff08;discrete PEG&#xff09;”&#xff0c;这是一种均一的、单分子量&#xff08;MW&#xff09;、高纯度的新一代聚乙二醇聚合物。Vector Laboratorie采用其受专利保护的专有生产工艺&#xff0c;可生产提供适合于各种应用场景&#xff0c;具有…

卸载系统自带APP

Firefly RK3588 android 12自动多个系统软件&#xff0c;无法从UI界面进行手动删除。因此&#xff0c;考虑使用shell指令进行处理。 系统自动APP大多都安装在system/app目录下&#xff0c;且该目录多为只读。因此采用如下步骤&#xff0c; //Shell su adb shell su //重新挂载…

食品饮料-冲饮市场线上发展现状:香飘飘品牌监控数据分析

近期&#xff0c;老国货品牌香飘飘在国内备受关注&#xff0c;起因是某网友在日本华人超市内看到香飘飘Meco果汁茶产品包装统一增加了几组“海洋不是日本的下水道”、“请日本政客豪饮核污水”、“地球可以没有日本但不能没有海洋”等中日双语标语&#xff0c;正大光明讽刺日本…

Xinstall:专业的APP全渠道统计服务商,助力广告数据分析

在移动互联网时代&#xff0c;APP已成为企业营销的重要阵地。然而&#xff0c;随着竞争加剧&#xff0c;广告主们面临着如何精准衡量广告投放效果、优化投放策略等挑战。这时&#xff0c;专业的APP全渠道统计服务商——Xinstall便成为了广告主们的得力助手。 Xinstall作为国内…

2024最新行业领域名词解释大全

2024最新行业领域名词解释大全 &#x1f680; 大家好&#xff01;我是你们的老朋友猫头虎&#x1f42f;。今天要为大家带来2024年最新的行业领域名词解释大全&#xff01;在这个信息爆炸的时代&#xff0c;准确了解不同领域的行业动态、工作机会和职业前景至关重要。下面我会分…

创建操作手册知识库的终极指南

在繁忙的工作中&#xff0c;有一个方便好用的操作手册知识库能帮我们节省大量时间&#xff0c;避免走弯路。那么&#xff0c;如何创建这样一个知识库呢&#xff1f;下面就给大家讲解一下简单易学的创建步骤。 一、明确目标与需求 在创建操作手册知识库之前&#xff0c;首先要明…

Vue + Element-plus 快速入门

1. 构建项目 npm init vuelatest # 可选项一路回车&#xff0c;使用默认NO,按提示执行3条命令 cd 项目名 npm install npm run dev 2. 下载element-plus npm install element-plus --save 3.替换main.js import { createApp } from vue import ElementPlus from element-plu…

解决问题:Docker证书到期(Error grabbing logs: rpc error: code = Unknown)导致无法查看日志

问题描述 Docker查看日志时portainer报错信息如下&#xff1a; Error grabbing logs: rpc error: code Unknown desc warning: incomplete log stream. some logs could not be retrieved for the following reasons: node klf9fdsjjt5tb0w4hxgr4s231 is not available报错…
最新文章