/// <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(); }
/// <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); } }