【问题标题】:Shortest unique subsequence that distinguish a set of strings区分一组字符串的最短唯一子序列
【发布时间】:2016-12-19 09:17:38
【问题描述】:

我有 N 个比特串(每个大小为 M)X1[0..M], ..., XN[0..M]。我需要伪代码/算法来找到每个给定字符串中唯一的最小长度子序列(不一定是连续的)。例如,

如果字符串为 011011, 011000, 010010 ,则每个字符串的子序列 [2,4] (11, 10, 01) 不同。或子序列 [2, 4, 5] (111, 100, 010) 。或子序列 [4, 5] (11, 00, 10)。
但不是子序列 [0, 1, 5] (011, 010, 010) ---> 在每个字符串中不是唯一的。

编辑:1 <= M <= 1000, 2 <= N <= 10.
编辑:目前,我的解决方案是这样的: 子序列的最小长度将在ceil(log2(N))N-1 之间。 所以,伪代码将是:

for i = ceil(log2(N)) to N-1 :  
    check all subsequence of size i
    if any subsequence distinguish all N strings, return i

第一步可以通过生成所有组合 mCi 来完成。 第二步可以通过提取所有 N 个字符串的子序列并检查它们是否都不同来完成。 但是这个算法目前是指数级的复杂度。我想知道是否有更好的算法。

编辑:不,这不是家庭作业。在采访中被问到。

【问题讨论】:

  • 这是什么应用程序?听起来像家庭作业。

标签: arrays algorithm substring subset bit


【解决方案1】:

我认为这样的事情会起作用:

第一:

create matriz A (mxm) and array B(m)
for each bit i from right to left, compute de decimal value of j word in A[i][j]
//that means A[i][j] holds the decimal value of word j until the i bit
in the same loop B[i] will hold if bit i from all words are the same.

如果 B[i] = true,则表示我们不需要看那个位置,因为它什么也没说。

create deque D//to check if there is equal elements
create array C(m)
for each position P in [0...M] where B[i] = false :


for each bit i = P ... 0

   for each word j
        C[j] = C[j]*2 + word[j][i] //word[j][i] = word j in bit i

    bool finished = true;
    for each e in C:
        if(D.count(e) > 0) {
             finished = false;
             break;
        }
        else{
            D.add(e)
        }
    }
    if(finished) return range(P...i);
    D.clear()

not possible;

这个算法的作用是:从有用的位置开始,它开始为它们创造单词的价值,并且在你能够将它们全部添加到双端队列中的那一刻(它们都是不同的),你就完成了寻找它们不同的范围(范围为 P - i + 1 大小)。

不管怎样,你必须对 B[i] = false 的所有 i 运行它,所以在最坏的情况下它应该运行大约 n³。

请注意,知道字符串的数量及其大小可以进行一些优化,例如:如果有 10 个大小为 3 的字符串,您知道它无法区分(因为没有不同的 10 个不同大小的二进制文件3)。给定字符串的数量,您只能搜索(连续或不连续)大小 ceil(log(number of strings))。例如,5 个字不能相差 1 位,也不能相差 2 位,但可以相差 3 位。

【讨论】:

  • 感谢您的回复。我有 2 个查询 - 1) 矩阵是否与单词矩阵相同? 2)看来这个答案只考虑连续的位范围。我需要一个也可以考虑比特子集的算法。例如,如果 M = 6,则一个子集可能是位 0,2,5 或 1,3 或 0,2,4,5 等。
  • 词矩阵表示一个向量 V,其中 V[i] = 词 i。你可以做一些事情,比如发现所有值都不相等的每一列,然后计算使所有单词不同所需的最小列数,然后你可以从位开始构建数字,直到它们都不同。
猜你喜欢
  • 2011-04-06
  • 2012-06-21
  • 1970-01-01
  • 2017-10-13
  • 2012-06-30
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多