Aaaaa988

Untitled

Mar 21st, 2021
512
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package ru.favarish;
  2.  
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.Collections;
  6. import java.util.Map;
  7.  
  8. public class Lab5 extends Lab4{
  9.  
  10.     private static final int DEBUG_MODE = 1;
  11.  
  12.     public static void main(String[] args) throws IOException {
  13.  
  14.         String strFile = readCodeFile(FILE_NAME);
  15.  
  16.         Map<String, Integer> frequencyDictionary = counterSingle(strFile);
  17.  
  18.         ArrayList<Shennon> probabilitySingle = probabilityMapCalculate(frequencyDictionary);
  19.  
  20.         // Сортируем вероятности для кодирования Шеннона
  21.         Collections.sort(probabilitySingle);
  22.  
  23.         // Кодируем символы методом Шеннона
  24.         shennonRecursiveStart(probabilitySingle);
  25.  
  26.         if (DEBUG_MODE == 1) {
  27.             for (Shennon elem : probabilitySingle) {
  28.                 System.out.println(elem);
  29.             }
  30.             System.out.println();
  31.         }
  32.  
  33.         String codingFile = coding(strFile, getCodeMap(probabilitySingle));
  34.  
  35.         for (int i = 1; i <= 3; i++) {
  36.             System.out.println("Entropy for " + i + "th symbol(s) = " + (shennon(probabilityCalculate(counterUniversal(codingFile, i))) / i) + " "
  37.                     + "Redundancy = " + (Shennon.getRedundancy(probabilitySingle) - (shennon(probabilityCalculate(counterUniversal(codingFile, i))) / i)));
  38.             System.out.println();;
  39.  
  40.             if (DEBUG_MODE == 1) {
  41.                 System.out.println("Количество уникальных элементов: " + counterUniversal(strFile, i).size());
  42.             }
  43.         }
  44.  
  45.         System.out.println("Средняя длина кодового слова = " + Shennon.getRedundancy(probabilitySingle));
  46.  
  47.         if (DEBUG_MODE == 1) {
  48.             System.out.println("GLOBAL_COUNT=" + GLOBAL_COUNT);
  49.         }
  50.     }
  51.  
  52.     /**
  53.      * Метод для запуска рекурсивного кодирования Шеннона
  54.      * @param probability
  55.      */
  56.     private static void shennonRecursiveStart(ArrayList<Shennon> probability) {
  57.         double difference = Math.abs(sum(0, probability.size() - 1, probability) - sum(probability.size() - 1, probability.size(), probability));
  58.  
  59.         int tempCenter = 0;
  60.         for (int i = 0; i < probability.size(); i++) {
  61.             double newDifference = Math.abs(sum(0, i, probability) - sum(i + 1, probability.size(), probability));
  62.             if (newDifference < difference) {
  63.                 tempCenter = i;
  64.                 difference = newDifference;
  65.             }
  66.         }
  67.  
  68.         int center1 = 0;
  69.         for (int i = 0; i < tempCenter; i++) {
  70.             double newDifference = Math.abs(sum(0, i, probability) - sum(i + 1, tempCenter, probability));
  71.             if (newDifference < difference) {
  72.                 center1 = i;
  73.                 difference = newDifference;
  74.             }
  75.         }
  76.  
  77.         int center2 = tempCenter;
  78.         for (int i = tempCenter; i < probability.size(); i++) {
  79.             double newDifference = Math.abs(sum(tempCenter + 1, i, probability) - sum(i + 1, probability.size(), probability));
  80.             if (newDifference < difference) {
  81.                 center2 = i;
  82.                 difference = newDifference;
  83.             }
  84.         }
  85.  
  86.         if (DEBUG_MODE == 1) {
  87.             System.out.println("tempCenter=" + tempCenter);
  88.             System.out.println("1 часть с " + 0 + " по " + center1 + "; 2 часть с " + (center1 + 1) + " по " + tempCenter + "; "
  89.                     + "3 часть с " + (tempCenter + 1) + " по " + center2 + "; 4 часть с " + (center2 + 1) + " по " + probability.size());
  90.         }
  91.  
  92.         shennonCoding(0, center1, probability, "0");
  93.         shennonCoding(center1 + 1, tempCenter, probability, "1");
  94.         shennonCoding(tempCenter + 1, center2, probability, "2");
  95.         shennonCoding(center2 + 1, probability.size() - 1, probability, "3");
  96.     }
  97.  
  98.  
  99.     /**
  100.      * Рекурсивный метод подсчета кодов Шеннона
  101.      * @param start
  102.      * @param finish
  103.      * @param probability
  104.      * @param code
  105.      */
  106.     public static void shennonCoding(int start, int finish, ArrayList<Shennon> probability, String code) {
  107.         if (DEBUG_MODE == 1) {
  108.             System.out.println("start=" + start + " finish=" + finish);
  109.         }
  110.  
  111.         addCodeInDiapason(start, finish, probability, code);
  112.         if (finish - start == 0) {
  113.             addCodeInDiapason(start, finish, probability, code);
  114.             return;
  115.         }
  116.         if (finish - start == 1) {
  117.             addCodeInDiapason(start, start, probability, "0");
  118.             addCodeInDiapason(finish, finish, probability, "1");
  119.             return;
  120.         }
  121.         if (finish - start > 1) {
  122.  
  123.             double difference = Math.abs(sum(start, finish - 1, probability) - sum(finish - 1, finish, probability));
  124.  
  125.             int tempCenter = start;
  126.             for (int i = start; i < finish; i++) {
  127.                 double newDifference = Math.abs(sum(start, i, probability) - sum(i + 1, finish, probability));
  128.                 if (newDifference < difference) {
  129.                     tempCenter = i;
  130.                     difference = newDifference;
  131.                 }
  132.             }
  133.  
  134.             int center1 = start;
  135.             for (int i = start; i < tempCenter; i++) {
  136.                 double newDifference = Math.abs(sum(start, i, probability) - sum(i + 1, tempCenter, probability));
  137.                 if (newDifference < difference) {
  138.                     center1 = i;
  139.                     difference = newDifference;
  140.                 }
  141.             }
  142.  
  143.             int center2 = tempCenter;
  144.             for (int i = tempCenter; i < finish; i++) {
  145.                 double newDifference = Math.abs(sum(tempCenter + 1, i, probability) - sum(i + 1, finish, probability));
  146.                 if (newDifference < difference) {
  147.                     center2 = i;
  148.                     difference = newDifference;
  149.                 }
  150.             }
  151.  
  152.             if (DEBUG_MODE == 1) {
  153.                 System.out.println("tempCenter=" + tempCenter);
  154.                 System.out.println("1 часть с " + start + " по " + center1 + "; 2 часть с " + (center1 + 1) + " по " + tempCenter + "; "
  155.                 + "3 часть с " + (tempCenter + 1) + " по " + center2 + "; 4 часть с " + (center2 + 1) + " по " + finish);
  156.             }
  157.  
  158.             shennonCoding(start, center1, probability, "0");
  159.             shennonCoding(center1 + 1, tempCenter, probability, "1");
  160.             shennonCoding(tempCenter + 1, center2, probability, "2");
  161.             shennonCoding(center2 + 1, finish, probability, "3");
  162.         }
  163.  
  164.     }
  165. }
RAW Paste Data