コード例 #1
0
ファイル: Program.cs プロジェクト: mdtimshin/ex.7
 /// <summary>
 /// Сортировка узлов дерева по убыванию
 /// </summary>
 static void sortTree()
 {
     for (int index = 0; index < tree.Count - 1; index++)
     {
         for (int index2 = index; index2 < tree.Count; index2++)
         {
             if (tree[index].frequency < tree[index2].frequency)
             {
                 huffmannTreeNode buf = tree[index];
                 tree[index]  = tree[index2];
                 tree[index2] = buf;
             }
         }
     }
 }
コード例 #2
0
ファイル: Program.cs プロジェクト: Anastasia520/Practika_7
 static void sortTree (List<huffmannTreeNode> tree)//сортировка по возрастанию
 {
         for (int index = 0; index < tree.Count - 1; index++)
         {
             for (int index2 = index; index2 < tree.Count; index2++)
             {
                 if (tree[index].frequency < tree[index2].frequency)
                 {
                     huffmannTreeNode buf = tree[index];
                     tree[index] = tree[index2];
                     tree[index2] = buf;
                 }
             }
         }  
 }
コード例 #3
0
ファイル: Program.cs プロジェクト: Anastasia520/Practika_7
        static void FillTree(List<huffmannTreeNode> tree, List<huffmannTreeNode> source, List<huffmannTreeNode> newRes)//реализация кода Хаффмана
        {
            while (tree.Count > 1)//заполнение итогового дерева
            {
                sortTree(tree);//сортируем

                for (int index = 0; index < source.Count; index++)//идем по длине изначального дерева
                {
                    if (tree[tree.Count - 2].text.Contains(source[index].text))//сравниваем предпоследний элемент в отсортированном дереве с изначальным(вспомогательным)
                    {
                        newRes[index] = new huffmannTreeNode(newRes[index].text, "0" + newRes[index].code, newRes[index].frequency);//если они сходятся по номеру частоты, то ставим ветку 0
                    }
                    else if (tree[tree.Count - 1].text.Contains(source[index].text))//иначе если последний элемент отсортир дерева = изначальному по номеру частоты, то ставим 1
                    {
                        newRes[index] = new huffmannTreeNode(newRes[index].text, "1" + newRes[index].code, newRes[index].frequency);//записываем в итоговое дерево результаты
                    }
                }

                tree[tree.Count - 2] = new huffmannTreeNode(tree[tree.Count - 2].text + tree[tree.Count - 1].text, "",
                    tree[tree.Count - 2].frequency + tree[tree.Count - 1].frequency);//в отсортированное дерево записываем сумму последнего и предпоседнего элементов по частотам на пред последнее место
                tree.RemoveAt(tree.Count - 1);//удаляем последний эл-т
            }
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: mdtimshin/ex.7
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("Введите количество символов во входном алфавите");
                int kolSymbol = int.Parse(Console.ReadLine());
                for (int i = 0; i < kolSymbol; i++)
                {
                    Console.WriteLine("Введите символ");
                    char symbol = char.Parse(Console.ReadLine());
                    Console.WriteLine("Введите частоту");
                    int frequency = int.Parse(Console.ReadLine());
                    freqs.Add(symbol, frequency);
                }
                foreach (KeyValuePair <char, int> Pair in freqs)
                {
                    source.Add(new huffmannTreeNode(Pair.Key.ToString(), "", Pair.Value));
                    tree.Add(new huffmannTreeNode(Pair.Key.ToString(), "", Pair.Value));
                    newRes.Add(new huffmannTreeNode(Pair.Key.ToString(), "", Pair.Value));
                }

                while (tree.Count > 1)
                {
                    sortTree();

                    for (int index = 0; index < source.Count; index++)
                    {
                        if (tree[tree.Count - 2].text.Contains(source[index].text))
                        {
                            newRes[index] = new huffmannTreeNode(newRes[index].text, "0" + newRes[index].code, newRes[index].frequency);
                        }
                        else if (tree[tree.Count - 1].text.Contains(source[index].text))
                        {
                            newRes[index] = new huffmannTreeNode(newRes[index].text, "1" + newRes[index].code, newRes[index].frequency);
                        }
                    }

                    tree[tree.Count - 2] = new huffmannTreeNode(tree[tree.Count - 2].text + tree[tree.Count - 1].text, "",
                                                                tree[tree.Count - 2].frequency + tree[tree.Count - 1].frequency);
                    tree.RemoveAt(tree.Count - 1);
                }
                SortedDictionary <string, string> codes = new SortedDictionary <string, string>();
                for (int index = 0; index < source.Count; index++)
                {
                    codes.Add(newRes[index].code, newRes[index].text);
                }
                Console.WriteLine("Список кодовых слов:");
                if (codes.Count > 1)
                {
                    foreach (KeyValuePair <string, string> keyValue in codes)
                    {
                        Console.WriteLine(keyValue.Value + " (" + keyValue.Key + ")");
                    }
                }
                else
                {
                    foreach (KeyValuePair <string, string> keyValue in codes)
                    {
                        Console.WriteLine(keyValue.Value + " ( 0 )");
                    }
                }
            }
            catch (System.ArgumentException)
            {
                Console.WriteLine("Вы уже добавили этот символ. Завершение работы программы");
            }
            catch (System.FormatException)
            {
                Console.WriteLine("Вы ввели не символ. Завершение работы программы");
            }
            Console.ReadKey();
        }