public void RandomTest(int alphabet, string pattern)
        {
            var occurences   = new List <int>();
            var milliseconds = new List <long>();
            var rnd          = new Random();

            foreach (var textLength in TextLengths)
            {
                var sb   = new StringBuilder();
                var algo = new StringMatchingAlgorithm(sb, pattern, 0);
                var sw   = Stopwatch.StartNew();
                var occ  = 0;
                for (var i = 0; i < textLength; ++i)
                {
                    sb.Append((char)('a' + rnd.Next() % alphabet));
                    if (algo.CheckForMatch(i + 1))
                    {
                        occ++;
                    }
                }
                sw.Stop();
                occurences.Add(occ);
                milliseconds.Add(sw.ElapsedMilliseconds);
            }
            for (var i = 0; i < TextLengths.Length; ++i)
            {
                Console.WriteLine("Text length: {0}, Occurences count: {1}, Elapsed ms: {2}",
                                  TextLengths[i], occurences[i], milliseconds[i]);
            }
        }
예제 #2
0
        public void TestWithBackTrack()
        {
            var          sb      = new StringBuilder("abacab");
            const string pattern = "aba";
            var          algo    = new StringMatchingAlgorithm(sb, pattern, 0);

            for (var i = 0; i < sb.Length; i++)
            {
                algo.CheckForMatch(i + 1);
            }
            var abacabState = algo.State;

            sb.Append('a');
            Assert.That(algo.CheckForMatch(sb.Length), Is.True);
            sb.Remove(sb.Length - 1, 1);

            algo.State = abacabState;
            sb.Append('a');
            Assert.That(algo.CheckForMatch(sb.Length), Is.True);
            sb.Remove(sb.Length - 1, 1);

            algo.State = abacabState;
            sb.Append('c');
            Assert.That(algo.CheckForMatch(sb.Length), Is.False);
        }
        private void DoTest(string inputFile, string outputFile)
        {
            var outputData = File.ReadAllLines(outputFile);
            var result     = outputData[0] == "0"
                ? new int[] {}
                : outputData[1]
            .Split(null as char[], StringSplitOptions.RemoveEmptyEntries)
            .Select(int.Parse)
            .ToArray();

            Console.WriteLine("Testing file: {0}", inputFile);
            var inputData  = File.ReadAllLines(inputFile);
            var sb         = new StringBuilder();
            var algo       = new StringMatchingAlgorithm(sb, inputData[1], 0);
            var occurences = new List <int>();
            var sw         = Stopwatch.StartNew();

            for (var i = 0; i < inputData[0].Length; ++i)
            {
                sb.Append(inputData[0][i]);
                if (algo.CheckForMatch(i + 1))
                {
                    occurences.Add(i - inputData[1].Length + 2);
                }
            }
            sw.Stop();
            Assert.That(occurences, Is.EquivalentTo(result));
            Console.WriteLine("\tText length: {0}\n\tPattern length: {1}\n\tOccurences found: {2}\n\tElapsed milliseconds: {3}\n", inputData[0].Length, inputData[1].Length, occurences.Count, sw.ElapsedMilliseconds);
        }
예제 #4
0
        public Catcher([NotNull] StringBuilder text, int i, int j, RationalNumber e, bool detectEqual, int timeToLive)
        {
            I                = i;
            J                = j;
            stateStack       = new Stack <CatcherState>();
            this.text        = text;
            this.e           = e;
            this.detectEqual = detectEqual;
            this.timeToLive  = timeToLive;
            RemoveTime       = -1;
            h                = new RationalNumber(j - i + 1, 2);
            var pattern = text.ToString(i, h.Ceil());

            stringMatchingAlgorithm = new StringMatchingAlgorithm(text, pattern, i + 1);
        }
예제 #5
0
        public void Test(string text, string pattern, int[] expectedOccurences)
        {
            var sb        = new StringBuilder();
            var algorithm = new StringMatchingAlgorithm(sb, pattern, 0);

            var occurences = new List <int>();

            for (var i = 0; i < text.Length; ++i)
            {
                sb.Append(text[i]);
                if (algorithm.CheckForMatch(i + 1))
                {
                    occurences.Add(i);
                }
            }
            Assert.That(occurences, Is.EquivalentTo(expectedOccurences));
        }