コード例 #1
0
        public static SuffixTree Create(string word, char canonizationChar = '$')
        {
            var tree = new SuffixTree(word);

            tree.Build(canonizationChar);
            return(tree);
        }
コード例 #2
0
        public void Contains_Simple_OnLongString_ShouldReturnTrue()
        {
            var s  = "olbafuynhfcxzqhnebecxjrfwfttwrxvgujqxaxuaukbflddcrptlvyoaxuwzlwmoeljnxgmsleapkyzodhtymxuvlchoomsuodicehnzyebqtgsqeplinthhnalituxrisknsyjszuaatwoulznpjbvjmhytqgaqmctqvwgxailhproehwctldlagpjqaawdbialginqmweqrcopiqfnludmjuxkqlsgrydzyhecoojgmspowoykgghnbudhujnmyhqxbkfggxxprgfhraksfylcveevxvlxpzxkcqtkchasarbusvqzimvvfsvredhjykpqyyysyxbzwsuqahpjcroqvhysaynfheehppinszvwmyqlmymyqngrqzuefojczpoqcgbkvkmfpipdoetqxtdigphjhkxuwzieqirlvapypdysohfydtxzppfuufcreorhpsyydvvvsproofmuucwqqtskzieegstlokqkvjbssfythoenpbhlhnnsgknlapaigdwvrvsnyrhxhuzqkzoakldexmvnuvqscxmrysnuumawqrldjbtbmnhytvmmyykdaxuvqifecczafafzewmuplebvkxseatwsxwatbszboybwzhgfdtsjpxckknalqvgwuwwretocfaphnyuoyvnxbtabosfewkfrlbbeiduuidlogxfdacbplkbkpljvthltjjrlxbtejpdqjddnnsfhsljjfvmsjigyxmhjeqfcmmzzqpsxmnkuwlhhvcrtxskfmyieoctweswpkplcnjiqmtjjdloobapntxqmducnkabjcutinyhhekioybfokektjerdojqfvyalkvpqsznlvqvrswhelvburtkzdcceqehyqndhlcvkbieceazmuanqiauhkyhcbcckeydaevunddkwlntezctepnfrchvquxgtsnupoiwneengszjggwxkmahlbiwzsbyryqasufdsaaigulgwjqepccwesmbcfpoymrsjrbqwzjpjmbexpjloxdtwxqbdmggreurdcohfpgbchhrthdopewrsyfindsvrexpkkooxkmzxklsalyfuxscwthbfdbeghnpowbjxcedzogidsrdnjimcybbxmwpdiwnihhgylpsbukpsjtbkktylouakffurdfmpsnndtjcvjkbviezyqdgvhdcllibfbniafffwebrmyvbryjnomzgiglecxjntcvcrngwrvhefqaswhpynyzqwdpvewmjlpndtihwebjqolymkytrtidajqrdyvqzhcsvlvfvqspskkttqjsotdqkcdwzmdxxuevpvcrsijxskruaajrqaqgcarbxfrwerhddeetidequujlxmyaaoriomkhdmqaitbzbvhmnhmuntueqwueagpomwdhturmpwkyszjiwwlucqbhqbxgibuqmghvlrrbypswfsxkhgwjcndjnqblxargeegkzmhlahbahsfecevnpbxqdbuamjffddctbcedlcptoynjiuypvbgeatatnxztxsxvjrihxmoeeqmghwxxdyzrczljthnteqrfrquhvlssswndmdwxcfzrhcszffqdnjmqyjnywrurbsyavdxcwwtjsttcbsnvrpgiqlswqdcqmxjxwoebxjwlhlxbjuxuacdwktlivrfmncnqosxecfccutmikgwkeprlrkdfcinqgeeeompsmpcvxvnopzmrnuvdljcxjurxmliveisyfqsnpxsokkefgdujosxckvrkgeavugntchvztxkdqeiwyluxxgptyuuligmgfjcwcynffbgysjewlaaglqjuujjxytrphnfwncbkgkwswhcvliseqyifouatvszslptxqnhawzjhgfyorphndgksqdeoqohsqvwctwofrvqqpsnfisbcpluhesurrihkxvpugeitmatignbqqqldkdwqzaggxmitqlzobbuqccoeddmsdtjvywnbiiwkbidkjrofmbxjlnzfryzgxjbwgiaxbahchovroigmraoofyuzqheonmrfpskgciitjtxjzbhlpsohvysrwdwviirlxpvemizykpykhipjwhmqxoiwtevhyddyrigooibzrshqmbypvthubgozvhinzmntadmkfplledvglacrbeghcofvsddhokjhyfcqwwhbwjlkafilmaezpwezzgzgajpxhxcgwmcieilzlfrsxjlagjbjryhbrznmsfushtydgfsizclunncsbzpktmkmhmacicjuqhqaozwtihtcokd";
            var t  = s.Substring(s.Length / 2, s.Length / 50);
            var st = SuffixTree.Build(s);

            Assert.IsTrue(st.Contains(t));
        }
コード例 #3
0
        public void Contains_OnNonRepeated_ShouldReturnFalse()
        {
            var s  = "abcdefghijklmnpqrst";
            var t  = "rstb";
            var st = SuffixTree.Build(s);

            Assert.IsFalse(st.Contains(t));
        }
コード例 #4
0
        public void Contains_OnNonRepeated_ShouldReturnTrue()
        {
            var s  = "abcdefghijklmnpqrst";
            var t  = s.Substring(3, 6);
            var st = SuffixTree.Build(s);

            Assert.IsTrue(st.Contains(t));
        }
コード例 #5
0
        public void Contains_InShortRandomString_ShouldReturnTrue()
        {
            const int CYCLES   = 2000,
                      STRLEN   = 200,
                      MATCHLEN = 20;

            var r = new Random();

            for (int i = 0; i < CYCLES; i++)
            {
                var s   = MakeRandomString(STRLEN);
                var ss  = s.Substring(r.Next(0, s.Length - MATCHLEN), MATCHLEN);
                var res = false;

                try
                {
                    res = SuffixTree.Build(s).Contains(ss);
                }
                catch (Exception e)
                {
                    throw new Exception($"\nString: \n{s}, \nSubstring: \n{ss}, Error message: {e.Message}", e);
                }

                Assert.IsTrue(res, $"\nString: \n{s}, \nSubstring: \n{ss}");
            }

            string MakeRandomString(int len)
            {
                const string SET = "abcdefghijklmnopqrstuvwxyz";
                var          res = new char[len];

                while (len-- > 0)
                {
                    res[len] = SET[r.Next(SET.Length)];
                }

                return(new string(res));
            }
        }
コード例 #6
0
        public void Build_ExpectsCorrectTree()
        {
            string         text = "banana";
            SuffixTreeNode root = SuffixTree.Build(text);

            CheckSuffixTreeProperties(root, text);

            Assert.IsTrue(root.IsRoot);
            Assert.IsFalse(root.IsLeaf);
            Assert.IsFalse(root.IsIntermediate);
            Assert.AreEqual(string.Empty, root.StringValue);
            Assert.AreEqual(-1, root.StartIndex);
            Assert.AreEqual(3, root.Children.Count);

            SuffixTreeNode rootChild1 = root.Children[0]; /* a */
            SuffixTreeNode rootChild2 = root.Children[1]; /* na */
            SuffixTreeNode rootChild3 = root.Children[2]; /* banana$ */

            Assert.IsTrue(rootChild1.IsIntermediate);
            Assert.IsFalse(rootChild1.IsRoot);
            Assert.IsFalse(rootChild1.IsLeaf);
            Assert.AreEqual("a", rootChild1.StringValue);
            Assert.AreEqual(-1, rootChild1.StartIndex);
            Assert.AreEqual(2, rootChild1.Children.Count);
            SuffixTreeNode childA1 = rootChild1.Children[0]; /* $ */
            SuffixTreeNode childA2 = rootChild1.Children[1]; /* na */

            Assert.IsFalse(childA1.IsIntermediate);
            Assert.IsFalse(childA1.IsRoot);
            Assert.IsTrue(childA1.IsLeaf);
            Assert.AreEqual("$", childA1.StringValue);
            Assert.AreEqual(5, childA1.StartIndex);
            Assert.AreEqual(0, childA1.Children.Count);
            Assert.IsTrue(childA2.IsIntermediate);
            Assert.IsFalse(childA2.IsRoot);
            Assert.IsFalse(childA2.IsLeaf);
            Assert.AreEqual("na", childA2.StringValue);
            Assert.AreEqual(-1, childA2.StartIndex);
            Assert.AreEqual(2, childA2.Children.Count);
            SuffixTreeNode childA2NA1 = childA2.Children[0]; /* $ */
            SuffixTreeNode childA2NA2 = childA2.Children[1]; /* na$ */

            Assert.IsFalse(childA2NA1.IsIntermediate);
            Assert.IsFalse(childA2NA1.IsRoot);
            Assert.IsTrue(childA2NA1.IsLeaf);
            Assert.AreEqual("$", childA2NA1.StringValue);
            Assert.AreEqual(3, childA2NA1.StartIndex);
            Assert.AreEqual(0, childA2NA1.Children.Count);
            Assert.IsFalse(childA2NA2.IsIntermediate);
            Assert.IsFalse(childA2NA2.IsRoot);
            Assert.IsTrue(childA2NA2.IsLeaf);
            Assert.AreEqual("na$", childA2NA2.StringValue);
            Assert.AreEqual(1, childA2NA2.StartIndex);
            Assert.AreEqual(0, childA2NA2.Children.Count);

            Assert.IsTrue(rootChild2.IsIntermediate);
            Assert.IsFalse(rootChild2.IsRoot);
            Assert.IsFalse(rootChild2.IsLeaf);
            Assert.AreEqual("na", rootChild2.StringValue);
            Assert.AreEqual(-1, rootChild2.StartIndex);
            Assert.AreEqual(2, rootChild2.Children.Count);
            SuffixTreeNode childNA1 = rootChild2.Children[0]; /* $ */
            SuffixTreeNode childNA2 = rootChild2.Children[1]; /* na$ */

            Assert.IsFalse(childNA1.IsIntermediate);
            Assert.IsFalse(childNA1.IsRoot);
            Assert.IsTrue(childNA1.IsLeaf);
            Assert.AreEqual("$", childNA1.StringValue);
            Assert.AreEqual(4, childNA1.StartIndex);
            Assert.AreEqual(0, childNA1.Children.Count);
            Assert.IsFalse(childNA2.IsIntermediate);
            Assert.IsFalse(childNA2.IsRoot);
            Assert.IsTrue(childNA2.IsLeaf);
            Assert.AreEqual("na$", childNA2.StringValue);
            Assert.AreEqual(2, childNA2.StartIndex);
            Assert.AreEqual(0, childNA2.Children.Count);

            Assert.IsFalse(rootChild3.IsIntermediate);
            Assert.IsFalse(rootChild3.IsRoot);
            Assert.IsTrue(rootChild3.IsLeaf);
            Assert.AreEqual("banana$", rootChild3.StringValue);
            Assert.AreEqual(0, rootChild3.StartIndex);
            Assert.AreEqual(0, rootChild3.Children.Count);
        }
コード例 #7
0
 public void Build_ShouldNotThrow(string treeContent)
 {
     Assert.DoesNotThrow(
         () => SuffixTree.Build(treeContent)
         );
 }