最优子序列双射算法(optimal subsequence bijection OSB)

introduction

最近在做关于骨架匹配的东西,在骨架匹配中很重要的一点就是将相同类型的骨架点匹配在一起:

如上图所示,骨架匹配的关键就是将图中 1 2 3 ....      A  B  C  D ...         a  b  c  d ...等这些点按同类型聚合起来,马头对应马头,马尾对应马尾。注意到,在上面一排第一个骨架图中有一个异常点“9”,它与另外两个骨架图中的任意一个节点都不对应。

我们将问题简化一下,将骨架节点简化成实数序列,考虑如下两个序列:a={1 2 3 5}   b={1 2 3 4 5} ,现在让你将两个序列匹配起来,你给的结果是什么?注意到b序列中存在一个异常点"4",a中没有任何一个数字与它对应,我想正常人给出的匹配结果应当是:(1 1) (2 2) (3 3) (5 5),b序列中的4被跳过。实际上所谓的匹配最终得到的结果两个匹配的序列之间的“距离”达到最小,而跳过某一序列的一个元素无疑会增加量序列之间的距离,于是OSB算法为跳过的元素会增加额外的“距离”,或者说额外的“惩罚”,这里的距离指的是两个序列之间的相似程度,这个相似程度根据需求不同而不同,如果是纯的实数序列,那两个数之差的绝对值即可认为是两元素的距离,所有元素距离只和认为是序列距离,在其他情况下可能会有更多的距离表示。

本文将介绍一种叫做"最优子序列双射"的算法专门处理这种存在异常点的序列的匹配问题,在数据挖掘等领域使用十分广泛。

首先我们考虑下什么叫所谓的匹配,匹配好坏的度量是什么?当a={1 2 3 5}  和 b={1 2 3 4 5}做匹配的时候,最终的匹配结果应当是两个序列对应元素很相似,也就是得到的序列“距离”最短,这里的距离只是相似度的度量,并非欧氏空间中的距离。所有最优匹配也就是实现序列距离最近的匹配。下面介绍OSB算法如何实现最短距离的匹配。

首先假设有两个序列  a={a1 a2 ... am}    b={b1 b2 ... bn}   注意到两个序列不等长,定义两个元素之间的距离为d,在原文献中距离d没有特别的规定,这里不妨认为实数abs(ai-bj)为两元素的距离,表示为d(ai-bj),最优子序列双射(OSB)算法的实现是在一个无环有向图中寻找最短距离实现的,有向图的节点为序列对(ai,bj),对 a={a1 a2 ... am}    b={b1 b2 ... bn}两个序列而言,有向图的节点就有m*n个,节点(ai,bj)与节点(ak-bl)之间的边长(权值)为:

式子中的C就是上文提到的跳过某个元素的额外距离或者额外惩罚,可以看到,在有向图中寻找最短路径的话,只要往右下的方向一个个过去,带有C的一项就为0,一旦横竖两个方向有跳过某个元素,路径长度就会产生C的整数倍的额外距离。那C的具体值怎么算呢,文献中给出了一个式子:

下面以一个简单到无耻的例子展示OSB算法:

计算得C=(1+6^(1/2))/3   三分之一加上根号六      大约一点多不到2

a={1 2 4}    b={1 4}

有向图的所有节点为:(1 1)   (1 4)  (2 1)  (2 4)  (4 1)   (4 4)

有向图中找最短路径:

最短路径为(1 1)到(4 4 )那条,于是匹配结果为 1对1  4对4     中间的2被跳过

最优子序列双射算法(optimal subsequence bijection OSB),布布扣,bubuko.com

时间: 2024-08-09 02:07:53

最优子序列双射算法(optimal subsequence bijection OSB)的相关文章

最优灵活体系结构(Optimal Flexible Architecture,OFA)

最优灵活体系结构(Optimal Flexible Architecture,简称OFA) OFA其实就是一种Oracle的一种规范,其意义就是用一种统一的给文件和文件夹的规则,和文件存放目录的规则做一个约定.这样,我们不管是安装多个版本的Oracle Database也好,因为目录规范,命名规范,这样软件不会冲突,方便管理,文件也方便查找.通过遵循OFA的指导,使得整个系统可以更加灵活 Advantages of Multiple Oracle Homes and OFA When you i

最大子序列求和算法二三

最大子序列求和算法二 递归求解 递归求解:整个求解数组分成三部分,最大子序列可能出现在三个地方,左半部分,右半部分,跨越左右部分(包括左半部分最后一个元素,右半部分第一个元素) 分别对这三部分求解,不断的在每部分再分成三部分,递归求解 每一次递归跨越部分可以先算出,但是左,右半部分,需要不断递归,知道剩一个元素,然后回溯加上原来已经算出的跨越部分,最后返回max3(三个里面最大的一个) 时间复杂度计算 假设递归求解需要时间为T(N) ,N=1 时 T(1)=1 两个递归时间+两个for循环时间(

“最大子序列和”算法 java

maxSubSum分别是最大子序列和的4中java算法实现. 第一种算法运行时间为O(N^3),第二种算法运行时间为O(N^2),第三种算法运行时间为O(nlogn),第四种算法运行时间为线性N public class Test { public static void main(String[] args) { int[] a = {-2, 11, -4, 13, -5, -2};//最大子序列和为20 int[] b = {-6, 2, 4, -7, 5, 3, 2, -1, 6, -9,

hdu 1025 Constructing Roads In JGShining's Kingdom(最长上升子序列nlogn算法)

学习了最长上升子序列,刚开始学的n^2的方法,然后就超时了,肯定超的,最大值都是500000,平方之后都12位 了,所以又开始学nlogn算法,找到了学长党姐的博客orz,看到了rating是浮云...确实啊,这些不必太关 注,作为一个动力就可以啦.没必要看的太重,重要的事学习知识. 思路: 这道题目可以先对一行排序,然后对另一行求最长上升子序列... n^2算法: 序列a[n],设一个数组d[n]表示到n位的时候最长公共子序列(此序列包括n),所以呢 d[n]=max(d[j]+1,0<j<

《算法竞赛入门经典第二版》 P35 习题2-4 子序列的和(subsequence)

/* <算法竞赛入门经典第二版> P35 习题2-4: 输入两个正整数 n < m < 10^6,输出 (1/n)^2 + 1/(n+1)^2 +……+ 1/m^2,保留5位小数. 输入包含多组数据,结束标志为 m=n=0. 有错欢迎指出^_^ */ #include<stdio.h> int main() { int m,n,i,j=1; while(scanf("%d%d",&m,&n) != EOF) { double sum

最长不下降子序列nlogn算法详解

今天花了很长时间终于弄懂了这个算法……毕竟找一个好的讲解真的太难了,所以励志我要自己写一个好的讲解QAQ 这篇文章是在懂了这个问题n^2解决方案的基础上学习. 解决的问题:给定一个序列,求最长不下降子序列的长度(nlogn的算法没法求出具体的序列是什么) 定义:a[1..n]为原始序列,d[k]表示长度为k的不下降子序列末尾元素的最小值,len表示当前已知的最长子序列的长度. 初始化:d[1]=a[1]; len=1; (0个元素的时候特判一下) 现在我们已知最长的不下降子序列长度为1,末尾元素

最长上升子序列 (LIS算法(nlong(n)))

设 A[t]表示序列中的第t个数,F[t]表示从1到t这一段中以t结尾的最长上升子序列的长度,初始时设F [t] = 0(t = 1, 2, ..., len(A)).则有动态规划方程:F[t] = max{1, F[j] + 1} (j = 1, 2, ..., t - 1, 且A[j] < A[t]). 现在,我们仔细考虑计算F[t]时的情况.假设有两个元素A[x]和A[y],满足 (1)x < y < t (2)A[x] < A[y] < A[t] (3)F[x] =

最长上升子序列LIS(Longest Increasing Subsequence)

算法1:时间复杂度:O(n^2):我们依次遍历整个序列,每一次求出从第一个数到当前这个数的最长上升子序列,直至遍历到最后一个数字为止,然后再取dp数组里最大的那个即为整个序列的最长上升子序列.我们用dp[i]来存放序列1-i的最长上升子序列的长度,那么dp[i]=max(dp[j])+1,(j∈[1, i-1]); 显然dp[1]=1,我们从i=2开始遍历后面的元素即可. #include<iostream> #include<algorithm> #include<stri

最长公共子序列 [HDU 1159] Common Subsequence

Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23973    Accepted Submission(s): 10592 Problem Description A subsequence of a given sequence is the given sequence with some e