예제 #1
0
        private static void MergeCandidate(List <CandidateRec> K, ref int k, int i, EquivalenceClass[] E, int p)
        {
            int          r = 0;
            CandidateRec c = K[0];

            do
            {
                int j = E[p].Number;
                int s = -1;
                for (int l = r; l <= k; l++)
                {
                    if (K[l].b <j && K[l + 1].b> j)
                    {
                        s = l;
                        break;
                    }
                }
                if (s >= 0)
                {
                    if (K[s + 1].b > j)
                    {
                        K[r] = c;
                        r    = s + 1;
                        c    = new CandidateRec()
                        {
                            a = i, b = j, prev = K[s]
                        };
                    }
                    if (s == k)
                    {
                        K.Add(K[k + 1]);
                        k = k + 1;
                        break;
                    }
                }
                if (E[p].Last)
                {
                    break;
                }
                else
                {
                    p = p + 1;
                }
            } while (true);
            K[r] = c;
        }
예제 #2
0
        private static int[] CreateLastCommonSubsequency(List <string> O, List <string> A)
        {
            int m = O.Count;
            int n = A.Count;

            char[] ignore = new char[] { ' ', '\t' };

            List <LineHash> V = new List <LineHash>(n);

            V.AddRange(A.Select((x, i) => new LineHash()
            {
                Number = i + 1, Line = x.DiffHash(ignore)
            }));
            V.Sort((x, y) =>
            {
                int r = x.Line.CompareTo(y.Line);
                if (r == 0)
                {
                    r = x.Number.CompareTo(y.Number);
                }
                return(r);
            });

            EquivalenceClass[] E = new EquivalenceClass[n + 1];
            E[0] = new EquivalenceClass()
            {
                Number = 0, Last = true
            };
            for (int j = 1; j < n; j++)
            {
                E[j] = new EquivalenceClass()
                {
                    Number = V[j - 1].Number, Last = V[j - 1].Line.CompareTo(V[j].Line) != 0
                };
            }
            E[n] = new EquivalenceClass()
            {
                Number = V[n - 1].Number, Last = true
            };

            int[] P = new int[m];
            for (int i = 0; i < m; i++)
            {
                string key = O[i].DiffHash(ignore);
                int    j   = V.FindIndex(x => x.Line.CompareTo(key) == 0);
                if (j >= 0 && E[j].Last)
                {
                    P[i] = j + 1;
                }
                else
                {
                    P[i] = 0;
                }
            }

            List <CandidateRec> K = new List <CandidateRec>();

            K.Add(new CandidateRec()
            {
                a = 0, b = 0, prev = null
            });
            K.Add(new CandidateRec()
            {
                a = m + 1, b = n + 1, prev = null
            });
            int k = 0;

            for (int i = 0; i < m; i++)
            {
                if (P[i] != 0)
                {
                    MergeCandidate(K, ref k, i + 1, E, P[i]);
                }
            }

            int[] J = new int[m + 1];
            for (int i = 0; i <= m; i++)
            {
                J[i] = 0;
            }

            CandidateRec c = K[k];

            do
            {
                J[c.a] = c.b;
                c      = c.prev;
            } while (c != null);

            for (int i = 0; i < m; i++)
            {
                int j = J[i + 1];
                if (j != 0 && O[i].DiffHash(ignore).CompareTo(A[j - 1].DiffHash(ignore)) != 0)
                {
                    J[i + 1] = 0;
                }
            }

            return(J);
        }
예제 #3
0
 private static void MergeCandidate(List<CandidateRec> K, ref int k, int i, EquivalenceClass[] E, int p)
 {
     int r = 0;
     CandidateRec c = K[0];
     do
     {
         int j = E[p].Number;
         int s = -1;
         for (int l = r; l <= k; l++)
         {
             if (K[l].b < j && K[l + 1].b > j)
             {
                 s = l;
                 break;
             }
         }
         if (s >= 0)
         {
             if (K[s + 1].b > j)
             {
                 K[r] = c;
                 r = s + 1;
                 c = new CandidateRec() { a = i, b = j, prev = K[s] };
             }
             if (s == k)
             {
                 K.Add(K[k + 1]);
                 k = k + 1;
                 break;
             }
         }
         if (E[p].Last)
         {
             break;
         }
         else
         {
             p = p + 1;
         }
     } while (true);
     K[r] = c;
 }