/// <summary>
        /// 测试方法,测试 BinarySearchST。
        /// </summary>
        /// <param name="st">用于测试的符号表。</param>
        public static void Test(BinarySearchST <string, int> st)
        {
            var test = "S E A R C H E X A M P L E";
            var keys = test.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            var n    = keys.Length;

            for (var i = 0; i < n; i++)
            {
                st.Put(keys[i], i);
            }

            Console.WriteLine("size = " + st.Size());
            Console.WriteLine("min = " + st.Min());
            Console.WriteLine("max = " + st.Max());
            Console.WriteLine();

            Console.WriteLine("Testing Keys()");
            Console.WriteLine("-----------------------------------");
            foreach (var s in st.Keys())
            {
                Console.WriteLine(s + " " + st.Get(s));
            }
            Console.WriteLine();

            Console.WriteLine("Testing Select()");
            Console.WriteLine("-----------------------------------");
            for (var i = 0; i < st.Size(); i++) // 循环条件不能有 '='
            {
                Console.WriteLine(i + " " + st.Select(i));
            }
            Console.WriteLine();

            Console.WriteLine("key Rank Floor Ceil");
            Console.WriteLine("-----------------------------------");
            for (var i = 'A'; i <= 'Z'; i++)
            {
                var s = i + "";
                Console.WriteLine($"{s} {st.Rank(s)} {st.Floor(s)} {st.Ceiling(s)}");
            }
            Console.WriteLine();

            for (var i = 0; i < st.Size() / 2; i++)
            {
                st.DeleteMin();
            }
            Console.WriteLine("After deleting the smallest " + st.Size() / 2 + " keys");
            Console.WriteLine("-----------------------------------");
            foreach (var s in st.Keys())
            {
                Console.WriteLine(s + " " + st.Get(s));
            }
            Console.WriteLine();

            while (!st.IsEmpty())
            {
                st.Delete(st.Select(st.Size() / 2));
            }
            Console.WriteLine("After deleting the remaining keys");
            Console.WriteLine("-----------------------------------");
            // 异常处理
            try
            {
                foreach (var s in st.Keys())
                {
                    Console.WriteLine(s + " " + st.Get(s));
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.Message);
            }
            Console.WriteLine();

            Console.WriteLine("After adding back N keys");
            Console.WriteLine("-----------------------------------");
            for (var i = 0; i < n; i++)
            {
                st.Put(keys[i], i);
            }
            foreach (var s in st.Keys())
            {
                Console.WriteLine(s + " " + st.Get(s));
            }
            Console.WriteLine();
        }
Example #2
0
        /// <summary>
        /// 找到同时存在于字典和输入文件的单词并统计频率,
        /// 分别按照频率降序和字典升序输出。
        /// </summary>
        /// <param name="filename">输入文件。</param>
        /// <param name="dictionaryFile">字典文件。</param>
        public static void LookUpDictionary(string filename, string dictionaryFile, int minLength)
        {
            // 初始化字典
            var sr         = new StreamReader(File.OpenRead(dictionaryFile));
            var words      = sr.ReadToEnd().Split(new char[] { ' ', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
            var dictionary = new BinarySearchST <string, int>();

            for (var i = 0; i < words.Length; i++)
            {
                if (words[i].Length > minLength)
                {
                    dictionary.Put(words[i], i);
                }
            }
            sr.Close();

            // 读入单词
            var srFile = new StreamReader(File.OpenRead(filename));
            var inputs = srFile.ReadToEnd().Split(new char[] { ' ', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);

            srFile.Close();

            var stDictionary = new BinarySearchST <int, string>();
            var stFrequency  = new BinarySearchST <string, int>();

            foreach (var s in inputs)
            {
                if (stFrequency.Contains(s))
                {
                    stFrequency.Put(s, stFrequency.Get(s) + 1);
                }
                else if (dictionary.Contains(s))
                {
                    stFrequency.Put(s, 1);
                    stDictionary.Put(dictionary.Get(s), s);
                }
            }

            // 输出字典序
            Console.WriteLine("Alphabet");
            foreach (var i in stDictionary.Keys())
            {
                var s = stDictionary.Get(i);
                Console.WriteLine(s + "\t" + stFrequency.Get(s));
            }

            // 频率序
            Console.WriteLine("Frequency");
            var n = stFrequency.Size();

            for (var i = 0; i < n; i++)
            {
                var max = "";
                stFrequency.Put(max, 0);
                foreach (var s in stFrequency.Keys())
                {
                    if (stFrequency.Get(s) > stFrequency.Get(max))
                    {
                        max = s;
                    }
                }
                Console.WriteLine(max + "\t" + stFrequency.Get(max));
                stFrequency.Delete(max);
            }
        }