寻找连续重复序列的算法

2024-04-09

我正在寻找一种算法,可以在基因组序列中找到短串联重复。

基本上,给定一个非常长的字符串,它只能包含 4 个字符“ATCG”,我需要找到彼此相邻的 2-5 个字符长之间的短重复。

前任: TACATGAGATCATGATGATGATGATGGAGCTGTGAGATC 会给嘎嘎嘎嘎或 ATG 重复 3 次

该算法需要扩展到 100 万个字符的字符串,因此我试图尽可能接近线性运行时间。

我当前的算法: 由于重复长度可以是 2-5 个字符,因此我逐个字符检查字符串,看看第 N 个字符是否与第 N+X 个字符相同,其中 X 为 2 到 5。每个 X 都有一个按顺序计数的计数器匹配并在不匹配时重置,当 X = 计数器时我们知道是否有重复。然后可以手动检查后续重复。


你正在看着每一个给你的角色O(n),因为您比较每个字符的下一个 (maximum) 五个字符,这给你一个常数c:

var data    = get_input();
var compare = { `A`, `T`, `G`, `A`, `T` }         // or whatever
var MAX_LOOKAHEAD = compare.length
var n
var c

for(n = data_array.length; n < size; i++) {       // Has runtime O(n)

  for(c = 0; c < MAX_LOOKAHEAD; c++) {            // Maximum O(c)

    if( compare[c] != data[i+c] ) {
      break;
    } else {
      report( "found match at position " + i )
    }

  }
}

很容易看出这个运行O(n*c)次。自从c非常小,可以忽略 - 而且我认为无法摆脱该常量 - 这导致总运行时间为O(n).

好消息:

您可以通过并行化来加快速度。例如。你可以把它分成k间隔并让多个线程通过给它们适当的开始和结束索引来为您完成工作。这可以给你一个线性加速比.

如果您这样做,请确保将交叉点视为特殊情况,因为如果您的间隔将一场比赛分成两部分,您可能会错过一场比赛。

E.g. n = 50000:

4个线程的分区:(n/10000) - 1 = 4。第 5 个线程不会有很多事情要做,因为它只是处理交叉点,这就是为什么我们不需要考虑它的 (在我们的例子中很小) 高架。

1                 10000               20000               40000               50000
|-------------------|-------------------|-------------------|-------------------|
| <-   thread 1  -> | <-   thread 2  -> | <-   thread 3  -> | <-   thread 4  -> |
                  |---|               |---|               |---|              
                    |___________________|___________________|
                                        |
                                     thread 5

它可能是这样的:

var data;
var compare = { `A`, `T`, `G`, `A`, `T` };
var MAX_LOOKAHEAD = compare.length;

thread_function(args[]) {

    var from = args[0];
    var to   = args[1];

    for(n = from ; n < to ; i++) {

      for(c = 0; c < MAX_LOOKAHEAD; c++) {
        if( compare[c] != data[i+c] ) {
          break;
        } else {
          report( "found match at position " + i )
        }
      }
    }
}

main() {
    var data_size     = 50000;
    var thread_count  = 4;
    var interval_size = data_size / ( thread_count + 1) ;

    var tid[]

    // This loop starts the threads for us:

    for( var i = 0; i < thread_count; i++ ) {
        var args = { interval_size * i, (interval_size * i) + interval_size };

        tid.add( create_thread( thread_function, args ) );
    }

    // And this handles the intersections:

    for( var i = 1; i < thread_count - 1; i++ ) {
        var args = { interval_size * i, (interval_size * i) + interval_size };

        from = (interval_size * i) - compare.length + 1;
        to   = (interval_size * i) + compare.length - 1;

        for(j = from; j < to ; j++) {

            for(k = 0; k < MAX_LOOKAHEAD; k++) {
                if( compare[k] != data[j+k] ) {
                    break;
                } else {
                    report( "found match at position " + j )
                }
            }
        }
    }

    wait_for_multiple_threads( tid );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

寻找连续重复序列的算法 的相关文章

  • 最慢的计算复杂度(Big-O)

    在这些算法中 我知道 Alg1 是最快的 因为它是 n 平方的 接下来是 Alg4 因为它是 n 的立方 然后 Alg2 可能是最慢的 因为它是 2 n 这应该具有非常差的性能 然而Alg3和Alg5在我的阅读速度方面还没有遇到过 这两种算
  • 为什么你可以在字符串上重载 __radd__ 而不是 __rmod__ ?

    在Python中 您可以覆盖右 和左 加法运算符
  • 寻找将集合映射到整数的双射函数

    对于任意两个序列 a b 其中 a a1 a2 an 且 b b1 b2 bn 0a b具有相同的元素 而不关心它们的顺序 例如 如果 a 1 1 2 3 b 2 1 3 1 c 3 2 1 3 则 f a f b f a f b 我知道有
  • 从 PHP 中的字符串中删除转义序列

    我正在使用一个已转义字符序列的 mysqldump 文件 我需要知道字符串的长度作为其数据库值 但转储中包含转义字符 这会增加字符串的长度 我用过stripslashes 它正确地取消转义单引号和双引号 但它不会触及 r n 我担心其中还有
  • 如何快速防止标签中出现孤儿?

    我有一个可以有一两行的标签 如果它有两行 我希望第二行至少有两个 或者可能三个 单词 而不仅仅是一个 关于如何使用 swift 实现这一点有什么想法吗 提前致谢 Daniel 编辑 我删除了我愚蠢的第一个想法 这些想法并没有真正的帮助 好吧
  • 为什么该字符串的长度比其中的字符数长?

    这段代码 string a abc string b A C Console WriteLine Length a 0 a Length Console WriteLine Length b 0 b Length outputs Lengt
  • Objective-C 使用字符串池吗?

    我知道Java https stackoverflow com questions 3801343 what is string pool in java and C http msdn microsoft com en us librar
  • C# 中单个 & 符号的第二个含义是什么?

    我在 C 中使用了单个与号 来表示 检查second条件语句即使第一个是false 但以下似乎是不同的意思 of 总而言之 谁能解释一下如何i 1在下面的例子中有效吗 List
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 关于在字典中查找所有有效单词的算法问题

    给定一个字典 只是一个字符串列表 您收到来自外部来源的未知数量的信件 给定字母串 您将如何列出您可以通过这些字母的任意组合组成的所有有效单词 来自字典 因此 如果您收到 applead 你应该找到apple bad pad lead等 我知
  • URL路径相似度/字符串相似度算法

    我的问题是我需要比较 URL 路径并推断它们是否相似 下面我提供了要处理的示例数据 GROUP 1 robots txt GROUP 2 bot html GROUP 3 phpMyAdmin 2 5 6 rc1 scripts setup
  • 为什么 Java 11 中对于空白字符串 String.strip() 比 String.trim() 快 5 倍

    我遇到过一个有趣的场景 因为某些原因strip 针对空白字符串 仅包含空格 明显快于trim 在Java 11中 基准 public class Test public static final String TEST STRING 3 w
  • 7 张牌扑克手牌评估器

    有谁知道评估 7 张牌扑克牌的快速算法吗 这比简单地暴力检查 7 张牌中每 21 个 5 张牌的组合更有效 Cheers Pete 我写了一篇JavaScript 核心评估方法仅使用位操作 因此速度非常快 考虑到这一点 查看 21 种组合还
  • 如何成功地用 XML 中的批处理替换文本

    我尝试使用批处理在 XML 页面中替换字符串 但无法成功完全替换它 我有这个批处理代码 echo off setlocal EnableDelayedExpansion set search logLevel 3 set replace l
  • 更改特定字符串的颜色

    有谁知道如果将特定单词输入文本区域 我如何更改它的颜色 例如 如果用户输入 你好我的朋友 它会动态地将 你好 更改为绿色 在google上花了很多时间 找不到任何相关的东西 谢谢 textareas 的设计目的不是选择性着色
  • 从另一列的子字符串创建列

    我有一个 Pandas 数据框对象 我想从现有列的子字符串创建新列 我的数据如下所示 Date variable want1 want2 want3 0 02 01 08 Australia Sydney A Australia Sydne
  • 清理 .txt 并计算最常见的单词

    我需要 1 从停用词列表中清除 txt 我将其放在单独的 txt中 2 之后我需要统计最常见的 25 个单词 这是我为第一部分想到的 usr bin python coding iso 8859 15 import re from coll
  • 为什么在 C# 中使用 String.Concat()?

    我想知道这个问题有一段时间了 为什么使用String Concat 而不是使用 操作员 我明白了String Format因为它是一个空洞使用 运算符并使您的代码看起来更好 例如 string one bob string two jim
  • toUpperCase() 方法什么时候创建一个新对象?

    public class Child public static void main String args String x new String ABC String y x toUpperCase System out println

随机推荐