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

news2025/1/12 15:57:01

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.coloradmin.cn/o/1648844.html

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

相关文章

2024------MySQL数据库基础知识点总结

-- 最好的选择不是最明智的&#xff0c;而是最勇敢的&#xff0c;最能体现我们真实意愿的选择。 MySQL数据库基础知识点总结 一、概念 数据库&#xff1a;DataBase&#xff0c;简称DB。按照一定格式存储数据的一些文件的组合顾名思义: 存储数据的仓库&#xff0c;实际上就是一…

Java初识继承

继承 文章目录 继承为什么需要继承继承中变量的访问特点继承中方法的访问特点继承的优缺点 概念:在Java中&#xff0c;继承是面向对象编程的一个基本特性。它允许我们定义一个新类&#xff0c;它从另一个已经存在的类继承其属性和方法。被继承的类称为父类或超类&#xff0c;新…

Linux进程——Linux进程与进程优先级

前言&#xff1a;在上一篇了解完一部分常见的进程状态后&#xff0c;我们先来把剩下的进程状态了解一下&#xff0c;再来进入进程优先级的学习&#xff01; 如果对前面Linux进程不太熟悉可以先阅读&#xff1a; Linux进程 本篇主要内容&#xff1a; 僵尸进程和孤儿进程 Linux进…

63-HDMI转VGA电路设计

视频链接 HDMI转VGA电路设计01_哔哩哔哩_bilibili HDMI转VGA电路设计 HDMI电路设计&#xff08;参考第13课&#xff09; VGA电路设计&#xff08;参考第15课&#xff09; DP转VGA电路设计&#xff08;参考第75课&#xff09; 1、HDMI转VGA转换器 2、HDMI转VGA简介 1、解…

融知财经:期货风险有多大,期货风险进行控制的方法

期货价格变化远大于股票市场&#xff0c;其风险也大于股票市场&#xff0c;当然其预期收益机会相对较高&#xff0c;因此期货更适合激进型投资者。在期货投资市场中&#xff0c;除了市场外的常见风险外&#xff0c;转型期投资者的投机心理和杠杆效应会增加期货的交易风险&#…

获取波形极值与间距并显示

获取并显示波形的极值与极值间距 1、流程 1、通过signal.find_peaks获取极大值 2、获取极大值下标 3、获取极大值对应的值 4、获取极大值的下标间距(就是隔多远有一个极大值) 5、获取极大值间距的标准差、方差、均值、最大值 6、图形展示波形图并标记极大值2、效果图 3、示…

铜价飙升,慧能泰HUSB332F带你狂飙

铜价&#xff0c;近期涨的很飘&#xff0c;涨到怀疑人生。继黄金后&#xff0c;铜成了另一个疯涨的明星&#xff01;作为电线电缆生产不可或缺的原材料&#xff0c;铜的身价暴涨直接拉响了成本警报&#xff0c;压缩了企业的利润空间。众多电线电缆制造商面临着严峻的挑战与考验…

嵌入式学习<1>:建立工程、GPIO

嵌入式学习_part1 本部分笔记用于学习记录&#xff0c;笔记源头 >>b站江科大_STM32入门教程 建立工程、GPIO 开发环境&#xff1a;keil MDK、STM32F103C8T6 1 &#xff09;建立工程 &#xff08;1&#xff09;基于寄存器开发、基于标准库 或者 基于HAL库开发; &…

【Python】字典题

题目&#xff1a;输入一段文本&#xff0c;统计每个字符的个数 in_inputinput(“输入&#xff1a;”) dic{} for char in in_input: if char in dic: dic[char]1 # 字典添加键值对的方法&#xff0c;给字典给键和值的方法 else: dic[char]1 print(dic) for key,value in dic.i…

Elastic 通过 AI 驱动的安全分析改变 SIEM 游戏

作者&#xff1a;Santosh Krishnan, Jennifer Ellard 借助由搜索 AI 提供支持的新攻击发现功能&#xff0c;优先考虑攻击&#xff0c;而不是警报。 传统的安全信息与事件管理系统&#xff08;SIEM&#xff09;在很大程度上依赖屏幕背后的人类才能取得成功。警报、仪表盘、威胁…

DCEP数字人民币:中国法定区块链中数字货币

一、背景 作为全球第二大经济体&#xff0c;中国在数字货币领域的发展一直备受关注。近年来&#xff0c;中国政府积极推动数字货币的研究和试点工作&#xff0c;逐步开放数字货币交易试点&#xff0c;并计划推出中国唯一合法数字货币——数字人民币&#xff08;RMB Coin&#…

tcping的安装,ping和tcping的区别

ping和tcping的区别 功能不同&#xff1a; Ping&#xff1a;Ping是一种基于ICMP协议的网络工具&#xff0c;用于测试主机之间的连通性。它发送ICMP回显请求&#xff08;Echo Request&#xff09;到目标主机&#xff0c;并等待目标主机返回ICMP回显应答&#xff08;Echo Reply…

【Unity】使用Resources.LoadAll读取文件的顺序问题

最近在做客户的一个项目&#xff0c;其中的一个模块使用到了照片&#xff0c;但是发现了一个很严重的问题。当你在使用Unity的时候&#xff0c;它竟然不按照顺序读取&#xff1f;这个机器人是不是逻辑有问题&#xff1f;如下图&#xff1a; 名字脱敏了哈。。。 照片比较多&…

订单超时自动取消的实践方案

1、定时任务方案 方案流程&#xff1a; 每隔 30 秒查询数据库&#xff0c;取出最近的 N 条未支付的订单。 遍历查询出来的订单列表&#xff0c;判断当前时间减去订单的创建时间是否超过了支付超时时间&#xff0c;如果超时则对该订单执行取消操作。 定时任务方案工程实现相…

DAPP开发:揭秘DAPP软件开发的秘密

随着区块链技术的飞速发展&#xff0c;DAPP&#xff08;去中心化应用&#xff09;的开发逐渐成为了一个热门话题。在本文中&#xff0c;我们将探讨如何从零开始开发DAPP软件&#xff0c;并深入思考DAPP开发中的关键问题。 一、了解DAPP开发的基础知识 在开始开发DAPP之前&…

Web3:下一代互联网的科技进化

随着科技的不断演进&#xff0c;互联网已经成为了我们生活中不可或缺的一部分。而在Web3时代&#xff0c;我们将会见证互联网进化的下一个阶段。本文将探讨Web3作为下一代互联网的科技进化&#xff0c;以及它所带来的重要变革和影响。 传统互联网的局限性 传统互联网存在诸多…

绘画作品3d数字云展厅提升大众的艺术鉴赏和欣赏能力

3D虚拟展厅作为未来艺术的展示途径&#xff0c;正逐渐成为文化创意产业蓬勃发展的重要引擎。这一创新形式不仅打破了传统艺术展览的局限性&#xff0c;更以其独特的魅力吸引着全球观众的目光。 3D虚拟艺术品展厅以其独特的魅力&#xff0c;助力提升大众的艺术鉴赏和欣赏能力。观…

开发组合php+mysql 人才招聘小程序源码搭建 招聘平台系统源码+详细图文搭建部署教程

随着互联网的快速发展&#xff0c;传统的招聘方式已经不能满足企业和求职者的需求。为了提高招聘效率&#xff0c;降低招聘成本&#xff0c;越来越多的人开始关注人才招聘小程序、在线招聘平台。分享一个人才招聘小程序源码及搭建&#xff0c;让招聘更加高效便捷。系统是运营级…

Android getevent命令详细分析

在调试Android 的输入事件时&#xff0c;经常使用 “getevent -lrt” 命令&#xff0c;来确认驱动上报数据是否正常。从源码的角度来详细的分析一下getevent 这个程序。 首先用ls命令来看一下getevent lrwxr-xr-x 1 root shell 7 2023-11-20 10:08 system/bin/getevent -> …

视频号小店是普通人的机会吗?看完你就明白了!

大家好&#xff0c;我是电商小V 视频号小店是普通人的机会吗&#xff1f;我可以很确定的说&#xff1a;视频号小店就是普通人的机会&#xff0c;并且是很大的机会&#xff0c; 首先就是视频号小店这个项目还没有自然流量的入口&#xff0c;是一个还没有完全开放私域电商的平台&…