Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package ru.favarish;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Map;
- public class Lab5 extends Lab4{
- private static final int DEBUG_MODE = 1;
- public static void main(String[] args) throws IOException {
- String strFile = readCodeFile(FILE_NAME);
- Map<String, Integer> frequencyDictionary = counterSingle(strFile);
- ArrayList<Shennon> probabilitySingle = probabilityMapCalculate(frequencyDictionary);
- // Сортируем вероятности для кодирования Шеннона
- Collections.sort(probabilitySingle);
- // Кодируем символы методом Шеннона
- shennonRecursiveStart(probabilitySingle);
- if (DEBUG_MODE == 1) {
- for (Shennon elem : probabilitySingle) {
- System.out.println(elem);
- }
- System.out.println();
- }
- String codingFile = coding(strFile, getCodeMap(probabilitySingle));
- for (int i = 1; i <= 3; i++) {
- System.out.println("Entropy for " + i + "th symbol(s) = " + (shennon(probabilityCalculate(counterUniversal(codingFile, i))) / i) + " "
- + "Redundancy = " + (Shennon.getRedundancy(probabilitySingle) - (shennon(probabilityCalculate(counterUniversal(codingFile, i))) / i)));
- System.out.println();;
- if (DEBUG_MODE == 1) {
- System.out.println("Количество уникальных элементов: " + counterUniversal(strFile, i).size());
- }
- }
- System.out.println("Средняя длина кодового слова = " + Shennon.getRedundancy(probabilitySingle));
- if (DEBUG_MODE == 1) {
- System.out.println("GLOBAL_COUNT=" + GLOBAL_COUNT);
- }
- }
- /**
- * Метод для запуска рекурсивного кодирования Шеннона
- * @param probability
- */
- private static void shennonRecursiveStart(ArrayList<Shennon> probability) {
- double difference = Math.abs(sum(0, probability.size() - 1, probability) - sum(probability.size() - 1, probability.size(), probability));
- int tempCenter = 0;
- for (int i = 0; i < probability.size(); i++) {
- double newDifference = Math.abs(sum(0, i, probability) - sum(i + 1, probability.size(), probability));
- if (newDifference < difference) {
- tempCenter = i;
- difference = newDifference;
- }
- }
- int center1 = 0;
- for (int i = 0; i < tempCenter; i++) {
- double newDifference = Math.abs(sum(0, i, probability) - sum(i + 1, tempCenter, probability));
- if (newDifference < difference) {
- center1 = i;
- difference = newDifference;
- }
- }
- int center2 = tempCenter;
- for (int i = tempCenter; i < probability.size(); i++) {
- double newDifference = Math.abs(sum(tempCenter + 1, i, probability) - sum(i + 1, probability.size(), probability));
- if (newDifference < difference) {
- center2 = i;
- difference = newDifference;
- }
- }
- if (DEBUG_MODE == 1) {
- System.out.println("tempCenter=" + tempCenter);
- System.out.println("1 часть с " + 0 + " по " + center1 + "; 2 часть с " + (center1 + 1) + " по " + tempCenter + "; "
- + "3 часть с " + (tempCenter + 1) + " по " + center2 + "; 4 часть с " + (center2 + 1) + " по " + probability.size());
- }
- shennonCoding(0, center1, probability, "0");
- shennonCoding(center1 + 1, tempCenter, probability, "1");
- shennonCoding(tempCenter + 1, center2, probability, "2");
- shennonCoding(center2 + 1, probability.size() - 1, probability, "3");
- }
- /**
- * Рекурсивный метод подсчета кодов Шеннона
- * @param start
- * @param finish
- * @param probability
- * @param code
- */
- public static void shennonCoding(int start, int finish, ArrayList<Shennon> probability, String code) {
- if (DEBUG_MODE == 1) {
- System.out.println("start=" + start + " finish=" + finish);
- }
- addCodeInDiapason(start, finish, probability, code);
- if (finish - start == 0) {
- addCodeInDiapason(start, finish, probability, code);
- return;
- }
- if (finish - start == 1) {
- addCodeInDiapason(start, start, probability, "0");
- addCodeInDiapason(finish, finish, probability, "1");
- return;
- }
- if (finish - start > 1) {
- double difference = Math.abs(sum(start, finish - 1, probability) - sum(finish - 1, finish, probability));
- int tempCenter = start;
- for (int i = start; i < finish; i++) {
- double newDifference = Math.abs(sum(start, i, probability) - sum(i + 1, finish, probability));
- if (newDifference < difference) {
- tempCenter = i;
- difference = newDifference;
- }
- }
- int center1 = start;
- for (int i = start; i < tempCenter; i++) {
- double newDifference = Math.abs(sum(start, i, probability) - sum(i + 1, tempCenter, probability));
- if (newDifference < difference) {
- center1 = i;
- difference = newDifference;
- }
- }
- int center2 = tempCenter;
- for (int i = tempCenter; i < finish; i++) {
- double newDifference = Math.abs(sum(tempCenter + 1, i, probability) - sum(i + 1, finish, probability));
- if (newDifference < difference) {
- center2 = i;
- difference = newDifference;
- }
- }
- if (DEBUG_MODE == 1) {
- System.out.println("tempCenter=" + tempCenter);
- System.out.println("1 часть с " + start + " по " + center1 + "; 2 часть с " + (center1 + 1) + " по " + tempCenter + "; "
- + "3 часть с " + (tempCenter + 1) + " по " + center2 + "; 4 часть с " + (center2 + 1) + " по " + finish);
- }
- shennonCoding(start, center1, probability, "0");
- shennonCoding(center1 + 1, tempCenter, probability, "1");
- shennonCoding(tempCenter + 1, center2, probability, "2");
- shennonCoding(center2 + 1, finish, probability, "3");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment