解决遗传交叉问题的算法

时间:2011-06-24 22:08:30

标签: c# algorithm bioinformatics

我有一个对象列表,如:

class PairingStrand
{
   int startInt; // the start pos
   int endInt;   // the end pos
   int Index;    // the index of pairing
   int Strand;   // Strand is either "5" or "3"
}

每个位置(整数)只能与一个对象相关联。

Strand = 5的对象与具有相同“索引”和strand = 3的对象配对。

列表按每个对象的“startInt”排序。因此,不同的配对区域可以彼此交叉。

“CROSS-OVER”意味着两个区域重叠,但如果一个区域足够大以完全吞没另一个区域,则不会被视为“CROSS-OVER”。

例如......

{10~15 : 40~45} (startInt ~ endInt : startInd ~ endInx) 

交叉
{20~30 : 60~70}

然而,

{10~15 : 40~45} 

不被视为与

交叉
{20~25: 30~35}

我的问题是如何识别与列表中任何其他块没有任何交叉的最大块。块内允许交叉。 (换句话说,允许“交叉”但在块内不需要,而块之间不允许)

也许我没有非常清楚地描述这个问题。这是一个简单的例子:

列出如下:

obj1 (10~20, index 1, strand 5)
obj2 (25~30, index 2, strand 5)
obj3 (31~32, index 4, strand 5)
obj4 (33~34, index 4, strand 3)
obj5 (35~45, index 1, strand 3)
obj6 (50~55, index 2, strand3)
obj7 (60~80, index 3, strand 5)
obj8 (90~110, index 3, strand 3)

在处理之后,该函数应返回由(obj1 ~ obj6)组成的块。

提前致谢。

1 个答案:

答案 0 :(得分:0)

伪代码:

Dictionary<Index, Pairing> openPairings;
List<Index> possibilities;

foreach(pairing)
{
    if(openPairings.ContainsKey(pairing.Index))
    {
        // This is the closing of the pair
        // When there are no other open strands at the time of closing,
        // AND the pairing was in the possibilities list, it could be the largest
        if(possibilities.Contains(pairing.Index))
        {
            // The opening entry: openPairings[pairing.Index]
            // The closing pairing: pairing
            // Do your size check here to find the largest
        }
        openPairings.Remove(pairing.Index);
    }
    else
    {
        // This is the opening of the pair
        // There must be no other open pairings or there will be an overlap OR
        // the outer pairing is larger anyway, as it completely engulfs this pairing
        if(openPairings.IsEmpty)
            possibilities.Add(pairing.Index);
        openPairings.Add(pairing.Index, pairing);
    }
}