Beispiel #1
0
        public static List <TileMatch> GreedyStringTiling(string P, string T, int minLength)
        {
            List <TileMatch> tiles = new List <TileMatch>();
            int        maxMatch    = 0;
            List <int> markP       = new List <int>();
            List <int> markT       = new List <int>();

            do
            {
                List <TileMatch> matches = new List <TileMatch>();
                maxMatch = minLength;
                for (int i = 0; i < P.Length; i++)
                {
                    for (int k = 0; k < T.Length; k++)
                    {
                        int    j = 0;
                        string m = "";
                        while (k + j < T.Length && i + j < P.Length && P[i + j] == T[k + j] && markP.IndexOf(i + j) < 0 && markT.IndexOf(k + j) < 0)
                        {
                            m += T[k + j];
                            j++;
                        }

                        if (j == maxMatch)
                        {
                            TileMatch match = new TileMatch();
                            match.p     = i;
                            match.t     = k;
                            match.match = m;
                            matches.Add(match);
                        }
                        else if (j > maxMatch)
                        {
                            matches.Clear();
                            TileMatch match = new TileMatch();
                            match.p     = i;
                            match.t     = k;
                            match.match = m;
                            matches.Add(match);
                            maxMatch = j;
                        }
                    }
                }

                foreach (TileMatch m in matches)
                {
                    bool flag = true;
                    for (int i = 0; i < maxMatch; i++)
                    {
                        if (markP.IndexOf(m.p + i) >= 0 || markT.IndexOf(m.t + i) >= 0)
                        {
                            flag = false;
                            break;
                        }
                    }

                    if (!flag)
                    {
                        continue;
                    }

                    for (int i = 0; i < maxMatch; i++)
                    {
                        markT.Add(m.t + i);
                        markP.Add(m.p + i);
                    }

                    tiles.Add(m);
                }
            } while (maxMatch > minLength);
            return(tiles);
        }
Beispiel #2
0
        public static List <TileMatch> SequenceAlignmentMethod(string P, string T)
        {
            List <TileMatch> tiles = new List <TileMatch>();

            List <List <int> > matrix = new List <List <int> >();

            int t = 0;
            int d = -1, m = 1, g = 2;

            for (int i = 0; i <= P.Length; i++)
            {
                matrix.Add(new List <int>());
                matrix[i].Add(0);
                for (int j = 1; j <= T.Length; j++)
                {
                    if (i == 0)
                    {
                        matrix[i].Add(0);
                        continue;
                    }

                    int max = 0;

                    int value = matrix[i - 1][j - 1] + (P[i - 1] == T[j - 1] ? m : d);
                    if (value > max)
                    {
                        max = value;
                    }

                    value = matrix[i - 1][j] + g;
                    if (value > max)
                    {
                        max = value;
                    }

                    value = matrix[i][j - 1] + g;
                    if (value > max)
                    {
                        max = value;
                    }
                    matrix[i].Add(max);
                }
            }
            List <TileMatch> p = new List <TileMatch>();

            for (int i = P.Length; i >= 0; i--)
            {
                int max = 0, k = 0;
                for (int j = 0; j <= T.Length; j++)
                {
                    if (matrix[i][j] > max)
                    {
                        max = matrix[i][j];
                        k   = j;
                    }
                }

                if (k > max)
                {
                    k = max;
                }
                if ((i != 0 && k != 0 && matrix[i][k] != 0))
                {
                    TileMatch match = new TileMatch();
                    match.match = "";

                    /*match.p = i;
                     * match.t = k;
                     * p.Add(match);
                     * */
                    while (i >= 0 && k >= 0)
                    {
                        if (i != 0 && k != 0 && matrix[i][k] != 0)
                        {
                            match.match += P[i - 1];
                            i--;
                            k--;
                        }
                        else
                        {
                            break;
                        }
                    }
                    match.p = i;
                    match.t = k;
                    tiles.Add(match);
                    continue;
                }
                else if (k != 0 && matrix[i][k] == 0)
                {
                    //p.Add(p[i-1]);
                    continue;
                }
            }

            return(tiles);
        }