Aaaaa988

lab4

Mar 16th, 2021
588
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.HashMap;
  7. import java.util.Map;
  8.  
  9. public class Lab4 extends Lab3{
  10.     static final String FILE_NAME = "src/ru/favarish/Lab3.java";
  11.     static int GLOBAL_COUNT = 0;
  12.  
  13.     public static void main(String[] args) throws IOException {
  14.  
  15.         String strFile = readCodeFile(FILE_NAME);
  16.  
  17.         Map<String, Integer> frequencyDictionary = counterSingle("AAAAABBBBBCCCCCDDEEF");
  18.         Map<String, Integer> frequencyDictionaryPair = counterPair(strFile);
  19.  
  20.         ArrayList<Shennon> probabilitySingle = probabilityMapCalculate(frequencyDictionary);
  21.         ArrayList<Shennon> probabilityPair = probabilityMapCalculate(frequencyDictionaryPair);
  22.  
  23.         Collections.sort(probabilitySingle);
  24.         Collections.sort(probabilityPair);
  25.  
  26.         //todo не работает тут хз почему
  27.         shennonCoding(0, probabilitySingle.size() - 1, probabilitySingle, "");
  28.         shennonCoding(0, probabilityPair.size() - 1, probabilityPair, "");
  29.  
  30.         if (DEBUG_MODE == 1) {
  31.             for (Shennon elem : probabilitySingle) {
  32.                 System.out.println(elem);
  33.             }
  34.             System.out.println();
  35.             for (Shennon elem : probabilityPair) {
  36.                 System.out.println(elem);
  37.             }
  38.         }
  39.  
  40.         String newStrFile1 = coding(strFile, getCodeMap(probabilitySingle));
  41.  
  42.         Map<String, Integer> frequencyDictionaryShennon = counterSingle(newStrFile1);
  43.         Map<String, Integer> frequencyDictionaryPairShennon = counterPair(newStrFile1);
  44.         Map<String, Integer> frequencyDictionarythreeShennon = counterPair(newStrFile1);
  45.  
  46.         System.out.println("Entropy single symbols = " + shennon(probabilityCalculate(frequencyDictionaryShennon)));
  47.         System.out.println("Entropy pair symbols = " + shennon(probabilityCalculate(frequencyDictionaryPairShennon)) / 2);
  48.         System.out.println("Entropy three symbols = " + shennon(probabilityCalculate(frequencyDictionaryPairShennon)) / 3);
  49.  
  50.         System.out.println("GLOBAL_COUNT=" + GLOBAL_COUNT);
  51.  
  52.     }
  53.  
  54.     /**
  55.      * Метод возвращает закодирванную строку согласно кодам пришедшего листа
  56.      * @param strFile изначальный файл, который нужно закодировать
  57.      * @param list таблица кодов
  58.      * @return закодированный файл
  59.      */
  60.     private static String coding(String strFile, HashMap<String, String> list) {
  61.         StringBuilder result = new StringBuilder();
  62.  
  63.         for (int i = 0; i < strFile.length(); i++) {
  64.             String temp = String.valueOf(strFile.charAt(i));
  65.             result.append(list.get(temp));
  66.         }
  67.  
  68.         return String.valueOf(result);
  69.     }
  70.  
  71.     /**
  72.      * Получить мапу K=символ v=код по Шеннону
  73.      * @param list
  74.      * @return
  75.      */
  76.     private static HashMap<String, String> getCodeMap(ArrayList<Shennon> list) {
  77.         HashMap<String, String> result = new HashMap<>();
  78.  
  79.         for (Shennon elem : list) {
  80.             result.put(elem.getSymbol(), elem.getCode().toString());
  81.         }
  82.  
  83.         return result;
  84.     }
  85.  
  86.     /**
  87.      * Рекурсивный метод подсчета кодов Шеннона
  88.      * @param start
  89.      * @param finish
  90.      * @param probability
  91.      * @param code
  92.      */
  93.     public static void shennonCoding(int start, int finish, ArrayList<Shennon> probability, String code) {
  94.         if (code.equals("0")) {
  95.             System.out.println("0");
  96.         } else if (code.equals("1")) {
  97.             System.out.println("1");
  98.         }
  99.  
  100.         int center = 0;
  101.         if (finish - start >= 1) {
  102.             double difference = Math.abs(sum(start, finish - 1, probability) - sum(finish - 1, finish, probability));
  103.  
  104.             for (int i = start; i < finish; i++) {
  105.                 double newDifference = Math.abs(sum(start, i, probability) - sum(i + 1, finish, probability));
  106.                 if (newDifference < difference) {
  107.                     center = i;
  108.                     difference = newDifference;
  109.                 }
  110.             }
  111.  
  112.             shennonCoding(start, center, probability, "0");
  113.             addCodeInDiapason(start, finish, probability, "0");
  114.             shennonCoding(center + 1, finish, probability, "1");
  115.             addCodeInDiapason(start, finish, probability, "1");
  116. //            addCodeInDiapason(start, finish, probability, code);
  117.         }
  118.  
  119.     }
  120.  
  121.     /**
  122.      * Метод добавляет code к StringBuilder'у Shennon элемента ArrayList'а
  123.      * @param start стартовая позиция для добвления
  124.      * @param finish конечная позиция для добавления кода
  125.      * @param list лист типа Shennon
  126.      * @param code прибавляемый код
  127.      */
  128.     public static void addCodeInDiapason(int start, int finish, ArrayList<Shennon> list, String code) {
  129.         for (int i = start; i <= finish; i++) {
  130.             list.get(i).getCode().append(code);
  131.         }
  132.  
  133.         if (DEBUG_MODE == 1) {
  134.             GLOBAL_COUNT++;
  135.         }
  136.     }
  137.  
  138.     /**
  139.      * Метод суммирует вероятности из выбранного диапазона
  140.      * @param start стартовая позиция
  141.      * @param finish конечная позиция
  142.      * @param list
  143.      * @return сумму вероятностей в выбранном диапазоне
  144.      */
  145.     public static double sum(int start, int finish, ArrayList<Shennon> list) {
  146.         double result = 0;
  147.         for (int i = start; i < finish; i++) {
  148.             result += list.get(i).getProbability();
  149.         }
  150.  
  151.         return result;
  152.     }
  153.  
  154.  
  155.     /**
  156.      * Метод считает фактические вероятности
  157.      * @param frequencyDictionary
  158.      * @return мапа символа и его веростности
  159.      */
  160.     public static ArrayList<Shennon> probabilityMapCalculate(Map<String, Integer> frequencyDictionary) {
  161.         ArrayList<Shennon> probability = new ArrayList<>();
  162.         int generalCount = 0;
  163.  
  164.         for (Map.Entry<String, Integer> symbol : frequencyDictionary.entrySet()) {
  165.             generalCount += symbol.getValue();
  166.         }
  167.  
  168.         for (Map.Entry<String, Integer> symbol : frequencyDictionary.entrySet()) {
  169.             probability.add(new Shennon(symbol.getKey(), symbol.getValue().doubleValue() / generalCount));
  170.  
  171.             if (DEBUG_MODE == 1) {
  172.                 System.out.println(symbol.getKey() + " " + symbol.getValue() + " " + (symbol.getValue().doubleValue() / generalCount));
  173.             }
  174.         }
  175.  
  176.         return probability;
  177.     }
  178. }
  179.  
  180.  
  181. package ru.favarish;
  182.  
  183. public class Shennon implements Comparable<Shennon>{
  184.  
  185.     private String symbol;
  186.     private double probability;
  187.     private StringBuilder code;
  188.  
  189.     public Shennon(String symbol, double probability) {
  190.         this.symbol = symbol;
  191.         this.probability = probability;
  192.         this.code = new StringBuilder();
  193.     }
  194.  
  195.  
  196.     @Override
  197.     public int compareTo(Shennon o) {
  198.         double temp = o.probability - this.probability;
  199.         if (temp < 0) {
  200.             return -1;
  201.         } else if (temp > 0) {
  202.             return 1;
  203.         } else {
  204.             return 0;
  205.         }
  206.     }
  207.  
  208.     public String getSymbol() {
  209.         return symbol;
  210.     }
  211.  
  212.     public double getProbability() {
  213.         return probability;
  214.     }
  215.  
  216.     public StringBuilder getCode() {
  217.         return code;
  218.     }
  219.  
  220.     @Override
  221.     public String toString() {
  222.         return "Shennon{" +
  223.                 "symbol='" + symbol + '\'' +
  224.                 ", probability=" + probability +
  225.                 ", code=" + code +
  226.                 '}';
  227.     }
  228. }
  229.  
RAW Paste Data