最长公共子序列(LCS)和最优二叉搜索树

算法:动态规划——最长公共子序列 文章目录一、动态规划概念1. 动态规划步骤最长公共子序列问题题目示例分析代码(递归)查表打印最长公共子序列 一、动态规划概念 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法解这类问题,则分解得到的子问题数目太多,以至于最后解决原问题需要耗费指数时间。 然而,不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多 阅读详情

最长公共子序列-------

比较两个串的相似度有这样一种方法:寻找第三个串S3,它的所有序列也都出现在S1 和S2中,且在三个串中出现的次序都相同,但不要求连续出现,可以找到的S3越长就可以认为S1S2相似度越大, 这就是**最长公共子序列**的问题

形式化定义如下:给定一个序列X= {x1,x2..xm},另一个序列Z= {z1,z2,..zk}满足如下条件时称为X的子序列:存在一个严格递增的X的下表序列<i1,i2..ik>对所有j = 1,2,3..k满足 xij = zj。

例如 Z= <B,C,D,B>是X= <A,B,C,B,D,A,B>的一个子序列给定两个序列X和Y,如果Z既是X的子序列也是Y的子序列,则为X和Y的公共子序列

如X= <A,B,C,B,D,A,B>,Y= <B,A,C,F,D,B>,Z= <B,C,D,B>是公共子序列最长公共子序列问题:给定两个序列X,Y求X和Y长度最长的公共子序列(LCS问题)

S1:刻画最长公共子序列

LCS问题具有最优子结构性质,子问题的自然分类对应两个输入序列的”前缀”对;

前缀的严谨定义是:给定一个序列X= {x1,x2..xm},对i = 0,1,...,m定义X的第i前缀为Xi = <x1,x2...xi>

LCS的最优子结构:

令X = <x1,x2...xm>, Y = <y1,y2,..yn>为两个序列,Z = <z1,z2..zk>为X和Y的任意LCS

1、如果xm = yn, 则zk = xm = yn且 Zk-1是 Xm-1 和Yn-1的一个LCS

2、如果xm != yn,那么zk != xm意味着Z是Xm-1和Y的一个LCS

3、如果xm != yn,那么zk != yn意味着Z是X和Yn-1的一个LCS

S2:一个递归解

要求解一个或两个子问题如果xm = yn只要求Xm-1 和Yn-1的一个LCS,然后把xm加到最后如果不等,就要求两个子问题Xm-1和Y的一个LCS,X和Yn-1的一个LCS,找出比较长的一个先从递归的容易思考的角度去想定义c[i , j]表示Xi 和Yj的LCS的长度,如果i = 0 || j = 0,那么LCS长度肯定为0 ,可以得到:

0 i==0|| j==0

c[i , j] = c[i-1 , j-1]+1 i,j>0 && xi = yj

max(c[i, j-1], c[i-1 , j]) i,j>0&&xi!=yj


S3:计算LCS的长度

将递归思想用动态规划实现接受两个序列为输入,将c[i , j]的值保存在表 c[0..m, 0..n]中,并按行主次序计算,过程还维护一个表格b[1..m, 1..n]帮助构造最优解 “X”为 X序列退一步的,‘Y’为Y序列退一步的, ‘D’表示两者最后一个一样,递归找前面的伪代码如下:

```LCS(X,Y)

{ m = X.length; n = Y.length;

let b[1..m, 1..n] and c[0..m, 0..n]be new tables; //一方长度为0时,公共子串长为0

for(int i = 1;i<=m;i++) c[i,0] = 0;

for(int i = 1;i<=n;i++) c[0,i] = 0;

for(int i = 1;i<=m;i++)

for(int j = 1;j<=n;j++)

{ if(xi == yj)//最后一个相等

{c[i , j] = c[i-1, j-1]+1; b[i,j] = 'D';}

else if(c[i-1, j]>= c[i, j-1])//X序列退一个与当前Y找的公共串长

{c[i , j] = c[i-1,j]; b[i,j] ='X';}

else {c[i , j] = c[i, j-1]; b[i,j] = 'Y';}

}

return c[], b[];

}```

S4:构造LCS

```Print_Lcs(b, X, i, j)

{ if(i==0||j==0) return;

if(b[i,j]=='D') {Print_Lcs(b,X,i-1,j-1); print xi;}

else if(b[i,j]=='X')Print_Lcs(b,X,i-1,j);

else Print_Lcs(b,X,i,j-1);

}

```起始调用是 (b, X, X.length, Y.length)


最优二叉搜索树

-----------

给定一个n个不同关键字的已排序的序列K=<k1, k2,..kn>,用这些关键字构造一颗二叉搜索树。对每个关键字ki都有一个概率pi表示其搜索频率,有些要搜索的值可能不在k中,因此还有n+1个“伪关键字”d0, d1,d2..dn,d0 表示小于k1的值, dn表示大于kn的值,伪关键字di表示所有在关键字ki ki+1之间的值,每个伪关键字也有对应的qi。通常ki是内部的点,di是叶节点

对一颗搜索树搜索一次的期望为 E[T] = (depth(ki)+1)*pi(i = 1...n 的和)+ (depth(di)+1)*qi(i = 0...n求和) 

搜索代价最小的树就是最优二叉搜索树 

S1:最优二叉搜索树的结构

一棵最优二叉树包含的子树必然是作为实例的最优结构

S2:一个递归算法

子问题域为求解包含关键字ki..kj的最优二叉搜索树,i>=1&& j>=i-1&&j<=n(j = i-1时子树不包含实际关键字,只包含伪关键字)。定义e[i,j]为包含关键字ki..kj的最优二叉搜索中进行一次搜索的期望代价,最终希望计算出e[1,n]j=i-1的情况最简单,子树只包含伪关键字di-1, e[i, i-1] = qi-1j>=i时,需要从ki...kj中选择一个根节点kr,然后构造一颗包含ki...kr-1的最优二叉搜索树做左子树,kr+1...kj的最优二叉搜索树做右子树。

当一颗子树成为一个结点的子树时,每个结点的深度都增加了1,期望搜索代价的增加值应为所有概率之和对于包含ki...kj的子树,所有概率之和为 w(i,j) = (pl)(l从i到j)+ql(l从i-1到j)因此,若kr为包含关键字ki...kj的最优二叉搜索树的根节点,e[i,j] = pr + e[i,r-1]+w(i,r-1)+e[r+1,j]+w(r+1,j),又 w(i,j) = w(i,r-1)+pr+w(r+1,j)所以e[i,j] = e[i, r-1]+e[r+1,j]+w(i,j)直观上就是左子树的右子树的加上增量

qi-i j=i-1  

e[i,j] = 

min{e[i,r-1]+e[r+1,j]+w(i,j)} i<=j

S3:计算最优二叉搜索回溯的期望搜索代价

用 root[i,j]来记录这个子树的根对j>=i w[i,j] = w[i, j-1]+pj+qj伪代码如下:

```Optimal_BST(p,q,n)

{ let e[1..n+1, 0..n], w[1..n+1,0..n] root[1..n,1..n]be new tables;

for(i=1;i<=n+1;i++)

{ e[i,i-1] = qi-1; w[i,i-1] = qi-1;}

for(l=1;l<=n;l++)

for(i=1;i<=n-l+1;i++)

{ j = i+l-1;

e[i,j] = 1000000000;

w[i,j] = w[i,j-1]+pj+qj;

for(int r = i;r<=j;r++)

{ t = e[i,r-1]+e[r+1,j]+w[i,j];

if(t<e[i,j]) {e[i,j] = t; root[i,j] = r;}

} }

}```

算法学习之二——用DP和备忘录算法求解最长公共子序列问题 问题定义: 最长公共子序列:给定两个序列X={x1,x2,……xn},Y={y1,y2……,ym},如果X的子序列存在一个严格递增的下标序列{,,……},使得对于所有的j=1,2……,k,有=,则称产生的数组为对应的公共子序列。 如果公共子序列的长度最大,我们就称之为最长公共子序列,并求出LCS的长度(最优值)和对应的子序列(最优解)。 我们将和所对应的长度存储在数组里,并记录为c[i][j 阅读详情

相关推荐

动态规划的证明题

动态规划一般用来解决最优解问题,且一般要求这样的问题具有最优子结构和重叠子问题。 证明一个动态规划问题的成立往往在于求证其具有最优子结构:该问题的最优解包含子问题的最优解。 最优子结构的证明步骤: 做出选择,划分子问题,假设该问题最优解成立,而子问题的解不是最优解,反证,利用子问题的最优解推出与该问题最优解矛盾,得证。 下面请看几个实例证明: 1.钢条切割问题 证明:我们不妨选择n英寸长的最优解...

qq_36684096的博客 3180

最长公共子序列(LCS)

区分子序列和子串子序列:给,也可以说从给定序列中选取几个元素的结果(有顺序)。子串:给定串中组成的子序列为该串的子串。举例: (最长公共子序列不唯一,但序列长度是相同的)

Zhang_Qin123的博客 3293

算法(五)- 动态规划

算法(五)- 动态规划一、二项式系数问题导入与例子二、矩阵连乘动态规划性质典型例子三、最长公共子序列(LCS)公共子序列四、0-1背包问题 一、二项式系数 问题导入与例子 如图会有多组重复计算。 如上,r=0和n=r时都不用算。 如下,每列都可以多算最后一个 从左至右,从上往下 二、矩阵连乘 多种划分方式,找出最小的一种 算法复杂性:O(n3) 动态规划性质 典型例子 三、最长公共子序列(LCS) 分为连续不断型和间隔型。 公共子序列 公共子序列是不唯一

zxq997997的博客 1082

求所有最大公共子序列的算法实现

最近看了很多关于LCS(Longestcommonsubsequenceproblem,最长公共子序列)的文章,大部分问题都只是求出最大公共子序列的长度,或者打印处其中的任意一个最大子序列即可,但是如何快速的打印出所有的最大长度子序列?这个问题好像看到的不多。本文给出了传统的DP(dynamicprogramming,动态规划)算法进行求解的过程,并用c语言实现。另外参考一篇论文实现了其中...

weixin_30654419的博客 400

OpenWebUI外部模型配置异常排查与修复指南

本文详细解析了OpenWebUI外部模型配置异常的常见问题及解决方案,包括隐藏字符、数据库锁死等典型现象。通过错误日志分析和数据库修复实战指南,帮助开发者快速定位并解决配置问题,确保OpenWebUI与第三方大模型的稳定连接。

weixin_29205061的博客 311

第七章-分布式搜索引擎-ES:全文查询、分词查询、精确查询、地理坐标查询、组合查询(bool、funtion_score)以及RestApi

111

weixin_36580930的博客 1632

最长公共子序列—C语言

这个系列的内容均出自《算法设计与问题求解》,有兴趣的可以去看原版书。 输出: 4C(x,y) = 0 当 i=0, j=0时 C(i-1,j-1)+1 当i,j>0,Xi=Yi时 max{C(i-1, j), C(i, j-1)} 当i,j>0, Xi!=Yj时#include<stdio.h> #include<string.h>#define MAX 100 int lcs

yuhushangwei的专栏 7475

记录:rk3568适配开源GPU驱动(panfrost)

摘要:本文介绍了在RK3568芯片上移植Mali-G52 GPU驱动的过程。主要包括内核dts文件修改和内核配置调整两部分。

xuesong10210的博客 2237

北航软件算法C3--动态规划

上述证明可以用剪切粘贴法:如果存在子树Ti’,其期望搜索代价比Ti小,那就将Ti从T中删除,将Ti’粘贴上去,从而得到一棵期望搜索次数比T还小的树,与T的最优性不符。dp[i][j]表示str1中,[0,i]的子串和str2中,[0,j]的子串的公共部分长度,必须以str1【i】和str2【j】作为结尾。在【i,j】区间选点r作为根结点,在所有的r里,找到期望搜索代价最小的那一个。,例如,Pi表示结点Ki的搜索频率,则问题就具象为了求搜索次数的最小期望值。定义dp【i,j】保存【i,j】的最小代价和;

zxy13149285776的博客 1023

SPL06气压温度传感器SPI驱动与补偿算法详解

气压传感器与温度传感器是嵌入式环境感知系统的核心组件,其测量精度高度依赖于MEMS芯片的校准参数与非线性补偿机制。SPL06作为集成式高精度数字传感器,采用24位Σ-Δ ADC与片内补偿引擎,需结合唯一出厂校准系数(即‘芯片指纹’)进行多阶数学修正,才能将原始ADC值转化为符合计量要求的帕斯卡(Pa)与摄氏度(℃)物理量。该过程涵盖SPI通信协议解析、寄存器时序控制、大端数据拼接、二进制补码处理及浮点/定点混合运算等典型嵌入式工程实践。广泛应用于无人机高度计、智能穿戴海拔监测与IoT气象终端中。

weixin_34640289的博客 143

AI Agent Harness自动化漏洞扫描

本文要介绍的AI Agent Harness自动化漏洞扫描方案,正是为了解决传统漏扫的上述痛点而生。漏洞检出率提升35%以上,逻辑漏洞检出率从不足30%提升到92%误报率从27%降到3%以下,人工复核成本降低90%支持自定义业务系统、IoT、工控等多场景资产扫描,适配成本降低80%内置反馈学习机制,扫描效果越用越好AI Agent是指具备自主感知、决策、行动能力的大模型驱动程序,它可以根据给定的目标,自主调用工具、规划步骤、完成任务。

AI 原生应用开发的博客 473

动态规划【实战篇】

最长公共子序列、0-1背包问题、流水作业调度、最优二叉搜索树:

aimat2020的博客 294

【linux】linux 出现一个网卡绑定多个ip怎么处理

我的原因是我使用了dhcp,这个会自动分配ip, 将 BOOTPROTO 参数由 dhcp 改为 static,并移除或注释掉与动态分配地址 10.0.2.15 相关的配置行(如果存在)。执行后,您可以再次使用 ip -4 a 或 ifconfig 命令确认 IP 地址已被移除。输出可以看出,您的虚拟机(k8s003)中存在一个名为 enp0s3 的网卡绑定了多个 IPv4 地址。对于某些 Linux 发行版(如 Ubuntu、Debian),您可能需要编辑网络接口的配置文件来移除多余的 IP 地址。

九师兄 297

【算法设计与分析】动态规划

本文摘要:动态规划是解决优化问题的核心算法技术,通过分解重叠子问题并保存中间结果来避免重复计算。文章重点讲解了矩阵连乘问题,展示了如何设计状态转移方程(m[i][j]表示计算Aᵢ到Aⱼ的最小代价)和实现自底向上的DP解法。典型示例显示,不同括号化顺序可能导致10倍的性能差异。文中还提供了Python实现代码,包括递归解法与DP解法的对比,突出DP将指数复杂度降为O(n³)的优势。该案例体现了动态规划的最优子结构和重叠子问题两大核心特征。

m0_72516377的博客 697

绿米Aqara S1【妙控开关 S1E】版本降级或升级自定义固件的方法

绿米Aqara S1【妙控开关 S1E】版本降级或升级自定义固件的方法

LeeKwen的专栏 2171

【SigmaStudio】自定义算法组件之XML编写规范(一)

SigmaStudio生成自定义算法组件时,需要XML和DLB文件,本文主要记录XML文件的编码规范

liang_song的博客 1140

算法导论复习(六)| 动态规划

利用动态规划求解最优化问题。重点是动态规划的特点(主要是最优子结构性)和作表的技巧。

brilliantgby_id的博客 2049

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数据结构与算法分析:专题内容——动态规划2之例题讲解(代码详解+万字长文+算法导论+力扣题)

在生物应用中,经常需要比较两个(或多个)不同生物体的 DNA。一个 DNA 串由一串称为碱基(base)的分子组成,碱基有腺嘌呤、鸟嘌呤、胞嘧啶和胸腺嘧啶 4 种类型。我们用英文单词首字母表示 4 种碱基,这样就可以将一个 DNA 串表示为有限集{A,C,G,T}上的一个字符串(参见附录 C 中对字符串的定义)。例如,某种生物的 DNA 可能为Si=S_{\mathrm{i}}=Si​=ACCGGTOGAGTGCGGGAGCGGGGGGGGGGGGGGGGG 另一种生物的 DNA 可能为S2=GTCGTTC

梅见十柒的博客 1358

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

算法导论第十五章

15.1 15.1-1 证明: ​ T(n) = 1+\(\sum_0^{n-1}T(j)\) ​ 令S(n) = \(\sum_0^nT(j)\) ​ 则S(n) - S(n-1) = 1 + S(n-1) ​ S(n) = \(2^{n+1}\)-1 ​ T(n) = \(2^n\) 15.1-2 长度i 1 2 3 4 价格pi 1 4 6.5 4 价格密度 1 2 6.5...

weixin_30344131的博客 125

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

算法导论-上课笔记6:平摊分析/最长公共子序列/最优二叉搜索树

平摊分析并不涉及概率,可以保证最坏情况下每个操作的平均性能

我是一只小嵩鼠 1295

LCS,给你一个不一样的模糊匹配

目录 什么是LCS 为什么说需要LCS来解决模糊匹配 实现原理 1. 什么是LCS LCS(longest-common-subsequence problem),又名最长公共子序列问题 给定两个序列X和Y,如果Z既是X的子序列,也是Y的子序列,我们称它为X和Y的公共子序列 比如X={A,B,C,D,E,F,G} Y={T,A,C,M,G},那么Z={A,C,G},就是其最长公共子序列 复制...

weixin_34235105的博客 341

动态规划算法基本概念及思维导图-最长公共子序列(python)

动态规划算法的相关内容,以及最长公共子序列问题的python代码,思维导图如下

dududonut的博客 1291

【算法学习】动态规划算法(2)

文章目录4. 最长公共子序列步骤1:刻画最长公共子序列的特征步骤2:一个递归解步骤3:计算LCS的长度步骤4:构造LCS算法改进5. 最优二叉搜索树步骤1:最优二叉搜索树的结构步骤2:一个递归算法步骤3:计算最优二叉搜索树的期望搜索代价 4. 最长公共子序列 在生物应用中,经常需要比较两个(或多个)不同生物体的DNA。一个DNA由一串称为碱基 base 的分支组成,碱基有腺嘌呤、鸟嘌呤、胞嘧啶、胸腺嘧啶四种类型。我们用英文单词首字母表示四种碱基,这样就可以将一个DNA串表示为有限集 {A,C,G,T}\{

memcpy0的博客 644

【算法分析与设计】动态规划(下)

计算机算法分析与设计中有关动态规划讲解的下半部分,主要包括最长公共子序列、最大子段和、凸多边形最优三角剖分、图像压缩、电路布线、流水作业调度、投资问题、0-1背包问题、最优二叉搜索树和本章小结

東方緋想天 890

算法导论(八)——动态规划&贪婪算法

算法导论(八)——动态规划&贪婪算法 【主要参考资料:MIT算法导论视频,《数据结构,算法与应用,c++语言描述》】 动态规划方法通常用来求解最优化问题,从可行解中寻找具有最优值的解,得到的是问题的一个最优解(an optimal solution)。 求解的问题需具备要素:最优子结构和子问题重叠。算法对每个子问题只求解一次,将其解保存在一个表格,从而无需每次求解一个子问题时都重新计算,避免

u010385790的博客 1397
上一篇: 矩阵链乘法和动态规划原理
下一篇: setw的使用和判断两数互质
BeforeEasy
博客等级 码龄10年 92粉丝 207原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值