【问题标题】:determine strings that satisfy hamming distance matrix确定满足汉明距离矩阵的字符串
【发布时间】:2014-12-04 19:16:49
【问题描述】:

我正在尝试从汉明距离矩阵创建字符串列表。每个字符串的长度必须为 20 个字符,包含 4 个字母(A、B、C、D)。例如,假设我有以下汉明距离矩阵:

   S1 S2 S3
S1  0  5 12
S2  5  0 14
S3 12 14  0

从这个矩阵我需要创建 3 个字符串,例如:

S1 = "ABBBBAAAAAAAAAABBBBB"
S2 = "BAAAAAAAAAAAAAABBBBB"
S3 = "CBBBABBBBBBBBBBBBBBB"

我手动创建了这些字符串,但我需要为代表 100 个字符串的汉明距离矩阵执行此操作,手动操作不切实际。任何人都可以提出一个可以做到这一点的算法吗?

谢谢,克里斯

【问题讨论】:

    标签: string algorithm matrix hamming-distance


    【解决方案1】:

    这是一个有趣的练习。 :-)

    以下octave 脚本随机生成n 长度为len 的字符串。随后,它计算所有这些字符串之间的汉明距离。

    接下来要做的是成对比较字符串。例如,如果您搜索[5 12 14],您会发现表N 包含分隔为512 的字符串以及分隔为1214 的字符串。下一个挑战当然是找到一个电路,其中512 分开的电路可以与1214 分开的电路放在一起,使得电路“闭合” .

    % 我们生成 n 个长度为 len 的字符串 n=50; 长度=20; % 我们有一个大小为 4 (ABCD) 的分类变量 猫=4; % 我们要生成与以下汉明距离矩阵对应的字符串 搜索=[5 12 14]; %搜索=[10 12 14 14 14 16]; S=方形(搜索); % 请注意,我们生成的每个字符串都是完全随机的。如果您需要小距离,那么引入 % 字符串之间的相关性 X=兰迪(cat-1,n,len); % 计算汉明距离 t=pdist(X,'汉明')*len; % 我们必须在其中找到我们的小矩阵 S 的大矩阵 Y=正方形(t); % 如果存在的话,以下所有内容都可能被 submatrix(Y,S) 之类的东西替换 R=零(大小(S),大小(Y)); 对于 j = 1:大小(S) M=零(大小(Y),大小(S)); 对于 i = 1:大小(Y) M(i,:)=ismember(S(j,:),Y(i,:)); 结束 R(j,:)=全部(M'); 结束 [x,y]=查找(R); % A 将是一组单元格,其中包含将构成我们的子矩阵的列/行的索引 A = accumarray(x,y,[], @(v) {sort(v).'}); % 例如,如果距离 5 根本没有出现,我们已经可以退出 if (sum(cellfun(@isempty,A)) > 0) printf("没有匹配项\n"); 返回 万一 % 我们现在将获得所有可能的子矩阵,其中包含“搜索”中的值 C = 单元格(1,数字(A)); [C{:}] = ndgrid(A{:}); N = cell2mat( cellfun(@(v)v(:), C, 'UniformOutput',false) ); N = 唯一(排序(N,2),“行”); printf("找到 %i 个潜在匹配项(但包含重复项)\n", size(N,1)); % 我们现在正在进一步过滤(删除重复项) [f,g]=模式(N,2); h=g==1; N=N(h,:); printf("找到 %i 个潜在匹配\n", size(N,1)); M=零(大小(N),大小(搜索,2)); 对于 i = 1:大小(N) f=N(i,:); M(i,:)=正方形(Y(f,f))'; 结束 F=正方形(S)'; % 现在我们忘记了错误的排列,所以对于搜索 > 3 你需要过滤掉这些! M = 排序(M,2); F = 排序(F,2); % 从(大)表 M 中取出排序后的搜索字符串 % 我们搜索那些“关闭”电路的 D=ismember(M,F,'rows'); mf=查找(D); 如果 (mf) 匹配=大小(mf,1); printf("找到 %i 个匹配项\n", 匹配项); 对于 i = 1:匹配 r=mf(i); printf("我们返回匹配 %i (现在只检查排列)\n", r); t=N(r,:)'; str=X(t,:); check=squareform(pdist(str,'hamming')*len); 字符串=字符(str+64) 查看 结束 别的 printf("没有匹配项\n"); 万一

    它会生成如下字符串:

    ABAACCBCACABBABBAABA ABACCCBCACBABAABACBA CABBCBBBABCBBACAAACC

    【讨论】:

    • 谢谢安妮!此方法确实有效,但 Octave 在尝试处理更多字符串(11 个字符串)时会引发“内存不足”错误。第一次使用 Octave 所以可能是我的无知,但具体使用:search =[0 0 3 3 5 5 5 3 8 8 0 3 3 5 5 5 3 8 8 3 3 5 5 5 3 8 8 3 2 2 2 3 8 8 5 5 5 6 8 11 0 0 3 9 8 0 3 9 8 3 9 8 8 5 8] n=10000(我使用了较低的 n,但返回“没有匹配项”)。
    • @ChrisUofR。如果您想要 100 个带有您指定的汉明距离矩阵的字符串(或仅稍大一点),则此算法很有用。为此,您必须运行此算法 > 100 次。它不会每次都找到一组字符串;你必须运行它几次,直到它运行。使用 11x11 的矩阵,它将创建一个巨大的搜索空间。您将需要为此找到优化的算法。此外,当前的随机生成器很少遇到诸如 0、2 和 3 之类的距离。因此,您还需要使用与 randi 不同的先验来提供它。
    • 此外,您必须小心从哪里获取大型矩阵。像search=[10 0 0] 这样小的矩阵已经无法解:S_1S_2 不同,与 S_3 相同。但是S_2S_3是一样的,导致矛盾。
    • 非常感谢您的帮助。我看到我的措辞令人困惑。我需要满足 100x100 汉明距离矩阵的 100 个字符串。
    • @ChrisUofR 我首先会找到一种方法来检查这个 100x100 汉明距离矩阵是否实际上是可解的。我认为这个问题本身已经值得一个单独的问题。 :-)
    猜你喜欢
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 2016-09-22
    • 1970-01-01
    • 2011-06-14
    相关资源
    最近更新 更多