Example #1
0
 // almost same as FindInParfOfText_Prepared
 private Task <bool> FindInParfOfText(string text, int begin, int end)
 {
     return(Task.Run(() =>
     {
         Node_Parallel current = root;
         for (int i = begin; i < end; ++i)
         {
             current = current.GetTransition(text[i]);
             if (current.IsTerminal || current.GetPressedSuffixLink() != root)
             {
                 return true;
             }
         }
         return false;
     }));
 }
Example #2
0
        // almost same as IsOneOfStringsInText_Prepared
        public bool IsOneOfStringsInText(string text)
        {
            int maxThreadNumber   = 3;
            int possibleFullParts = (int)Math.Ceiling((double)text.Length / maxWordLength);

            if (possibleFullParts >= 3)
            {
                int divideToParts      = Math.Min(possibleFullParts - 1, maxThreadNumber);
                int subpartsInEachPart = (int)Math.Ceiling((double)(possibleFullParts + divideToParts - 1) / divideToParts);

                Task <bool>[] t = new Task <bool> [divideToParts];

                for (int i = 0; i < divideToParts; ++i)
                {
                    t[i] = FindInParfOfText(
                        text,
                        i * (subpartsInEachPart - 1) * maxWordLength,
                        Math.Min(text.Length, (i + 1) * (subpartsInEachPart - 1) * maxWordLength + maxWordLength)
                        );
                }
                Task.WaitAll(t);
                return(t.Any(x => x.Result == true));
            }
            else
            {
                Node_Parallel current = root;
                for (int i = 0; i < text.Length; ++i)
                {
                    current = current.GetTransition(text[i]);
                    if (current.IsTerminal || current.GetPressedSuffixLink() != root)
                    {
                        return(true);
                    }
                }
                return(false);
            }
        }