Advertisement
Guest User

Untitled

a guest
Mar 30th, 2020
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.19 KB | None | 0 0
  1. import java.io.File;
  2. import java.io.FileNotFoundException;
  3. import java.util.Scanner;
  4. import java.util.ArrayList;
  5.  
  6. class Huffman_wartosc
  7. {
  8.    
  9.     int ile;
  10.     char znak;
  11.     boolean czy_z;
  12.     int zsum;
  13.    
  14.     Huffman_wartosc lewy;
  15.     Huffman_wartosc prawy;
  16.    
  17.     public Huffman_wartosc()
  18.     {
  19.         ile = 0;
  20.         znak = '~';
  21.         czy_z = false;
  22.         zsum = 0;
  23.         lewy = null;
  24.         prawy = null;
  25.     }
  26.    
  27.     public Huffman_wartosc(int a, char z, boolean czy, int sum)
  28.     {
  29.         ile = a;
  30.         znak = z;
  31.         czy_z = czy;
  32.         zsum = sum;
  33.         lewy = null;
  34.         prawy = null;
  35.     }
  36.    
  37.     public Huffman_wartosc(int a, char z, boolean czy, int sum, Huffman_wartosc l, Huffman_wartosc p)
  38.     {
  39.         ile = a;
  40.         znak = z;
  41.         czy_z = czy;
  42.         zsum = sum;
  43.         lewy = l;
  44.         prawy = p;
  45.     }
  46.    
  47.  
  48. }
  49.  
  50. class wynik
  51. {
  52.     char z;
  53.     int ilez;
  54.     String kod;
  55.    
  56.     public wynik(int a, char b, String c)
  57.     {
  58.         z = b;
  59.         ilez = a;
  60.         kod = c;
  61.     }
  62. }
  63.  
  64.  
  65.  
  66. public class huffman {
  67.    
  68.     public static int extract_min(ArrayList<Huffman_wartosc> tabela)
  69.     {
  70.         int pozycja_min = 0;
  71.         int min = 0;
  72.         if(tabela.get(0).czy_z){ min=tabela.get(0).zsum;}
  73.         else{min=tabela.get(0).ile;}
  74.        
  75.         for(int x=0; x<tabela.size(); x++)
  76.         {
  77.        
  78.            
  79.             if(tabela.get(x).czy_z)
  80.             {
  81.                 if(tabela.get(x).zsum<min) {min = tabela.get(x).zsum; pozycja_min = x;}
  82.             }
  83.             else
  84.             {
  85.                 if(tabela.get(x).ile<min) {min = tabela.get(x).ile; pozycja_min = x;}
  86.             }
  87.         }
  88.        
  89.        
  90.         return pozycja_min;
  91.     }
  92.    
  93.     public static void odczytaj_wynik(Huffman_wartosc ojciec, String kod)
  94.     {
  95.         if (ojciec.lewy == null && ojciec.prawy == null && !ojciec.czy_z)
  96.         {
  97.             System.out.println(ojciec.znak+"--"+ojciec.ile+"--"+ kod);
  98.         }
  99.        
  100.         if (ojciec.lewy != null) {odczytaj_wynik(ojciec.lewy, kod + '0');}
  101.         if (ojciec.prawy != null) {odczytaj_wynik(ojciec.prawy, kod + '1');}
  102.        
  103.        
  104.     }
  105.    
  106.  
  107.  
  108.     public static void main(String[] args) throws FileNotFoundException{
  109.        
  110.         Huffman_wartosc tablica[] = new Huffman_wartosc[255];
  111.        
  112.         File plik = new File("tekst2");
  113.         Scanner odczyt = new Scanner(plik);
  114.        
  115.         String zdanie = odczyt.nextLine();
  116.         //System.out.println(zdanie.length());
  117.         int[] ile = new int[zdanie.length()];    
  118.         //Konwertuje zdanie na to by skladalo sie z poszczegolnych znakow
  119.         //gdzie kazdy bedzie rozpatrywany osobno
  120.         char zdanie_z_charow[] = zdanie.toCharArray();  
  121.          
  122.  
  123.        
  124.         for(int i = 0; i <zdanie.length(); i++) {  
  125.             ile[i] = 1;  
  126.             for(int j = i+1; j <zdanie.length(); j++) {  
  127.                 if(zdanie_z_charow[i] == zdanie_z_charow[j]) {  
  128.                     ile[i]++;  
  129.                      
  130.                     //Ustawiamy na pozycje j-ta znak "~" ktory liczymy ze nie wystepuje
  131.                     //w naszym zdaniu aby sie naliczal kilkuktrotnie a tylko 1 raz
  132.                     zdanie_z_charow[j] = '~';  
  133.                 }  
  134.             }  
  135.         }  
  136.        
  137.        
  138.         //Zadeklarowanie nowych tablic w celu przedstawienia
  139.         // danych w klarowniejszy sposób
  140.        
  141.         char znak[] = new char[255];
  142.         int ileznak[] = new int[255];
  143.         int wypelniacz = 0;
  144.        
  145.         for(int i = 0; i <ile.length; i++)
  146.         {  
  147.             if(zdanie_z_charow[i] != ' ' && zdanie_z_charow[i] != '~')
  148.             {
  149.                 znak[wypelniacz] = zdanie_z_charow[i];
  150.                 ileznak[wypelniacz] = ile[i];
  151.                 wypelniacz++;
  152.                 //System.out.println(zdanie_z_charow[i] + "-" + ile[i]);  
  153.             }
  154.                
  155.         }
  156.        
  157.         System.out.println("Znaki i pod nimi ich liczba wystapien");  
  158.         for(int i=0; i<wypelniacz; i++)
  159.         {
  160.             System.out.print(""+znak[i]+"   ");
  161.         }
  162.         System.out.print("\n");
  163.         for(int i=0; i<wypelniacz; i++)
  164.         {
  165.             System.out.print(""+ileznak[i]+"   ");
  166.         }
  167.        
  168.         //Sortowanie tablicy wg ilosci znaków
  169.         // aby pozniej bylo latwiej extractowac minimum
  170.  
  171.         for (int i=1; i<wypelniacz; i++)
  172.         {
  173.             int klucz = ileznak[i];
  174.             char znakklucza = znak[i];
  175.             int j = i - 1;
  176.            
  177.             while (j >= 0 && ileznak[j] > klucz)
  178.             {
  179.                 ileznak[j+1] = ileznak[j];
  180.                 znak[j+1] = znak[j];
  181.                 j = j - 1;
  182.             }
  183.             ileznak[j+1] = klucz;
  184.             znak[j+1] = znakklucza;
  185.         }
  186.        
  187.  
  188.         System.out.println("\n-------------------------------------------------------------------------------------------------------------------------------------------------------");
  189.         System.out.println("Posortowane znaki i liczba ich wystapien po liczbie znakow");
  190.         for(int i=0; i<wypelniacz; i++)
  191.         {
  192.             System.out.print(""+znak[i]+"   ");
  193.         }
  194.         System.out.print("\n");
  195.         for(int i=0; i<wypelniacz; i++)
  196.         {
  197.             System.out.print(""+ileznak[i]+"   ");
  198.         }
  199.         System.out.println("\n-------------------------------------------------------------------------------------------------------------------------------------------------------");
  200.  
  201.  
  202.         // Na nowo moze troche naokolo robione
  203.         // ale deklaracja zmiennych w postaci tablicy Huffman_wartosci
  204.         // ktore zawieraja znak, ileznak, i jesli to wezel typu z to sume wystapien jego synow
  205.         // oraz moze zawierac lewego jak i prawego syna
  206.        
  207.         ArrayList<Huffman_wartosc> zbior = new ArrayList<Huffman_wartosc>();
  208.        
  209. //        Huffman_wartosc nowa = new Huffman_wartosc(11,'z',false,21);
  210. //        System.out.print(""+nowa.ile+"  "+nowa.znak+"  "+nowa.czy_z+"  "+nowa.zsum);
  211.        
  212.    
  213.         for(int i=0; i<wypelniacz; i++)
  214.         {
  215.             zbior.add( new Huffman_wartosc(ileznak[i],znak[i],false,0));
  216.         }
  217.        
  218. //        System.out.println(extract_min(zbior));
  219.        
  220.        
  221.         Huffman_wartosc a;
  222.         Huffman_wartosc b;
  223.         Huffman_wartosc z;
  224.         int najmniejsza = 1;
  225.         int korzen = 0;
  226.         int sumaznakow = 0;
  227.        
  228.         for (int i=0; i<zbior.size(); i++)
  229.         {
  230.             korzen = korzen + zbior.get(i).ile;
  231.         }
  232.        
  233.         System.out.println(korzen);
  234.        
  235.         while(korzen > sumaznakow )
  236.         {
  237.             najmniejsza = extract_min(zbior);
  238.             a = zbior.get(najmniejsza);
  239.             zbior.remove(najmniejsza);
  240.            
  241.             najmniejsza = extract_min(zbior);
  242.             b = zbior.get(najmniejsza);
  243.             zbior.remove(najmniejsza);
  244.            
  245.             if(b.czy_z && a.czy_z)
  246.             {
  247.                 sumaznakow = a.zsum + b.zsum;
  248.             }
  249.             else if(b.czy_z)
  250.             {
  251.                 sumaznakow = a.ile+b.zsum;
  252.             }
  253.             else if (a.czy_z)
  254.             {
  255.                 sumaznakow = a.zsum + b.ile;
  256.             }
  257.             else
  258.             {
  259.                 sumaznakow = a.ile+b.ile;
  260.             }
  261.            
  262.             zbior.add( new Huffman_wartosc(0,' ',true,sumaznakow,a,b));
  263.            
  264.         }
  265.        
  266.        //ArrayList<wynik> tabela_wynikow = new ArrayList<wynik>();
  267.        
  268.         odczytaj_wynik(zbior.get(0),"");
  269.  
  270.        
  271. //        for (int i=0; i<zbior.size(); i++)
  272. //        {
  273. //          System.out.print(""+zbior.get(i).ile+"  "+zbior.get(i).znak+"  "+zbior.get(i).czy_z+"  "+zbior.get(i).zsum+"\n");
  274. //        }
  275.    
  276.     }
  277.    
  278.  
  279. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement