以蛮力方式

时间:2016-05-14 11:05:37

标签: algorithm matching exponential

我有一个关于匹配的问题。它陈述如下。

我有一个由两个字符{l,h}组成的序列。

  1. 字符l可以映射到{1,2,3}中的数字。 (l代表低)
  2. 字符h可以映射到{4,5,6}的数字。 (h代表高位)
  3. 例如,我有一个长度为6的序列(我称之为原始序列)。它是[h,l,h,l,h,l]。 可以通过上述映射规则将该序列转换为详细序列。详细的序列可以是[6,1,5,2,4,3]。对于长度= 6的序列,有6 ^ 3个详细序列。

    我通过计算成对差异从详细序列中获得差异序列。例如,我的详细序列是[6,1,5,2,4,3],那么相应的差异序列是[6-1,1-5,5-2,2-4,4-3] = [ 5,-4,3,-2,1]。因此,差异序列的条目的最大值是5,由6减1得到,并且它的最小值是-5,由1减6得到。

    现在,我有一个由长度= 5的 m 差异序列组成的数据库。 我的查询序列是长度= 6的原始序列。我想找到:

    m 差异序列中,相应的原始序列可以是我的查询序列。如果它们不存在,程序将返回null set。如果它们存在,程序将返回由它们组成的集合。

    例如,对于差异序列[5,-4,3,-2,1],其对应的原始序列可以是[h,l,h,l,h,l]。因此,如果[5,-4,3, - ,我的查询序列是[h,l,h,l,h,l],[5,-4,3,-2,1]将在返回的集合中。 2,1]在数据库中。

    对于我的实际问题,查询序列的长度= n。数据库由长度= n-1的 m 差分序列组成。

    蛮力方法可以如下: 对于输入的原始序列,枚举其3 ^ n个详细序列并获得3 ^ n个差异序列。对于每个差异序列,检查它是否存在于数据库中 蛮力将采取O(3 ^ n)。我知道这个指数运行时间并不好。

    我希望有一个更快的算法。近似算法对我来说也很好。

    非常感谢你。

1 个答案:

答案 0 :(得分:0)

每个差异序列可以从最多四个h-1序列创建。

因此,预处理数据库以构建从h-1序列到您感兴趣的差异序列的索引。

例如:

[1, -1, 0, 2, -1]

这必须来自以下其中一个序列:

[3 2 3 3 1 2] -> l l l l l l 
[4 3 4 4 2 3] -> h l h h l l
[5 4 5 5 3 4] -> h h h h l h
[6 5 6 6 4 5] -> h h h h h h

您可以通过启动1到6的特定序列并应用差异来生成它们。有时序列会下溢或溢出1..6的合法范围,然后你可以放弃这种可能性。

构建此索引的时间为O(mn),并使用额外的O(mn)空间。构建之后,您可以使用索引有效地查询特定的h-1序列。