Подсчитываются вероятности появления символов первичного алфавита в исходном тексте (если они незаданы заранее)Символы первичного алфавита m1 выписывают в порядке убывания вероятностей.Последние n0 символов объединяют в новый символ, вероятность которого равна суммарной вероятностиэтих символов, удаляют эти символы и вставляют новый символ в список остальных на соответствующееместо (по вероятности). n0 вычисляется из системы: , где a — целое число, m1 и m2 — мощность первичного и вторичного алфавита соответственно.Последние m2 символов снова объединяют в один и вставляют его в соответствующей позиции,предварительно удалив символы, вошедшие в объединение.Предыдущий шаг повторяют до тех пор, пока сумма всех m2 символов не станет равной 1.Этот процесс можно представить как построение дерева, корень которого — символ с вероятностью 1,получившийся при объединении символов из последнего шага, его m2 потомков — символы из предыдущегошага и т. д.Каждые m2 элементов, стоящих на одном уровне, нумеруются от 0 до m2-1. Коды получаются из путей (отпервого потомка корня и до листка). При декодировании можно использовать то же самое дерево,считывается по одной цифре и делается шаг по дереву, пока не достигается лист — тогда выводится символ,стоящий в листе и производится возврат в корень.Построение дерева ХаффманаБинарное дерево, соответствующее коду Хаффмана, называют деревом Хаффмана.Задача построения кода Хаффмана равносильна задаче построения соответствующего ему дерева.Общая схема построения дерева Хаффмана:Составим список кодируемых символов (при этом будем рассматривать каждый символ как одноэлементноебинарное дерево, вес которого равен весу символа).Из списка выберем 2 узла с наименьшим весом (под весом можно понимать частоту использования символа— чем чаще используется, тем больше весит).Сформируем новый узел и присоединим к нему, в качестве дочерних, два узла выбранных из списка. Приэтом вес сформированного узла положим равным сумме весов дочерних узлов.Добавим сформированный узел к списку.Если в списке больше одного узла, то повторить 2-5.Пример реализацииПример реализации алгоритма Хаффмана на языке// скомпилируйте и введите java HuffmanTest class Tree { public Tree child0; // потомки "0" и "1" public Tree child1; public boolean leaf; // признак листового дерева public int character; // входной символ public int weight; // вес этого символа public Tree() {} public Tree(int character, int weight, boolean leaf) { this.leaf = leaf; this.character = character; this.weight = weight; } /* Обход дерева с генерацией кодов 1. "Распечатать" листовое дерево и записать код Хаффмана в массив 2. Рекурсивно обойти левое поддерево (с генерированием кода). 3. Рекурсивно обойти правое поддерево. */ public void traverse(String code, Huffman h) { if (leaf) { System.out.println((char)character +" "+ weight +" "+ code); h.code[character] = code; } if ( child0 != null) child0.traverse(code + "0", h); if ( child1 != null) child1.traverse(code + "1", h); } } class Huffman { public static final int ALPHABETSIZE = 256; Tree[] tree = new Tree[ALPHABETSIZE]; // рабочий массив деревьев int weights[] = new int[ALPHABETSIZE]; //
Табличные процессоры относятся к диалоговым системам, построенным по принципу меню: из списка возможных действий пользователь выбирает то, что ему необходимо. Табличные процессоры обеспечивают:· ввод, хранение и корректировку большого количества данных;· автоматическое обновление результатов вычислений при изменении исходных данных;· дружественный интерфейс;· наглядность и естественную форму документов, представляемых пользователю на экране.В зависимости от вида табличного процессора пользователю доступны различные функции. Как правило, обязательный набор включает следующие основные типы функций:1) для формул при вычислениях:· математические, тригонометрические, включая функции суммирования, произведения, извлечения квадратного корня, логарифмическую и т.п.;· логические функции типа IF (если);· статистические функции средней арифметической и определения количества всех значений в заданном диапазоне клеток;2) текстовые функции, позволяющие отработать некоторым образом текстовые значения клеток, например, отразить только первые три символа текстовой строки;3) финансовые функции для выполнения основных финансовых операций, таких, как определения величины амортизации, величины платежей за инвестиции, начисления процентов и т.п.;4) функции даты и времени;5) функции сгруппированных данных, например, сортировка данных по различным критериям.На основе табличных данных средствами табличного процессора можно проводить графический анализ данных с использованием разнообразных графиков и диаграмм.Возможности табличных процессоров определяются, с одной стороны, характеристиками собственно пакета прикладных программ, а с другой – техническими характеристиками ПК: объемом таблицы (допустимым количеством строк и столбцов), требуемым минимальным объемом оперативной памяти, минимально необходимым объемом дисковой памяти. Основными понятиями табличного процессора Excel являются:· книга – это файл, используемый для обработки и хранения данных, состоящий из отдельных листов;· лист – разделен на строки и столбцы и служит основой для выполнения вычислений. Рабочий лист состоит из 256 столбцов и 65536 строк;· ячейка – область, определяемая пересечением столбца и строки электронной таблицы (ЭТ);· текущая (активная) ячейка – ячейка ЭТ, в которой в данный момент находится курсор;· адрес ячейки определяется названием (номером) столбца и номером строки;· блок ячеек (диапазон) – группа смежных ячеек, определяемая адресом верхней левой и нижней правой ячеек в прямоугольнике, образуемом блоком. Например, D4:F13;· ссылка – ссылка указывает на ячейку или диапазон ячеек листа, которые требуется использовать в формуле;· абсолютная ссылка – это ссылка, не изменяющаяся при копировании формулы в другую ячейку;· относительная ссылка – это ссылка, автоматически изменяющаяся при копировании в соответствии с положением формулы.· формула – это конструкция, начинающаяся со знака “=”, состоящая из математических операторов, значений, ссылок на ячейки и имен функций, при этом результатом выполнения формулы является некоторое новое значение.
,
где a — целое число, m1 и m2 — мощность первичного и вторичного алфавита соответственно.Последние m2 символов снова объединяют в один и вставляют его в соответствующей позиции,предварительно удалив символы, вошедшие в объединение.Предыдущий шаг повторяют до тех пор, пока сумма всех m2 символов не станет равной 1.Этот процесс можно представить как построение дерева, корень которого — символ с вероятностью 1,получившийся при объединении символов из последнего шага, его m2 потомков — символы из предыдущегошага и т. д.Каждые m2 элементов, стоящих на одном уровне, нумеруются от 0 до m2-1. Коды получаются из путей (отпервого потомка корня и до листка). При декодировании можно использовать то же самое дерево,считывается по одной цифре и делается шаг по дереву, пока не достигается лист — тогда выводится символ,стоящий в листе и производится возврат в корень.Построение дерева ХаффманаБинарное дерево, соответствующее коду Хаффмана, называют деревом Хаффмана.Задача построения кода Хаффмана равносильна задаче построения соответствующего ему дерева.Общая схема построения дерева Хаффмана:Составим список кодируемых символов (при этом будем рассматривать каждый символ как одноэлементноебинарное дерево, вес которого равен весу символа).Из списка выберем 2 узла с наименьшим весом (под весом можно понимать частоту использования символа— чем чаще используется, тем больше весит).Сформируем новый узел и присоединим к нему, в качестве дочерних, два узла выбранных из списка. Приэтом вес сформированного узла положим равным сумме весов дочерних узлов.Добавим сформированный узел к списку.Если в списке больше одного узла, то повторить 2-5.Пример реализацииПример реализации алгоритма Хаффмана на языке// скомпилируйте и введите java HuffmanTest class Tree { public Tree child0; // потомки "0" и "1" public Tree child1; public boolean leaf; // признак листового дерева public int character; // входной символ public int weight; // вес этого символа public Tree() {} public Tree(int character, int weight, boolean leaf) { this.leaf = leaf; this.character = character; this.weight = weight; } /* Обход дерева с генерацией кодов 1. "Распечатать" листовое дерево и записать код Хаффмана в массив 2. Рекурсивно обойти левое поддерево (с генерированием кода). 3. Рекурсивно обойти правое поддерево. */ public void traverse(String code, Huffman h) { if (leaf) { System.out.println((char)character +" "+ weight +" "+ code); h.code[character] = code; } if ( child0 != null) child0.traverse(code + "0", h); if ( child1 != null) child1.traverse(code + "1", h); } } class Huffman { public static final int ALPHABETSIZE = 256; Tree[] tree = new Tree[ALPHABETSIZE]; // рабочий массив деревьев int weights[] = new int[ALPHABETSIZE]; //