Esempio n. 1
0
        public void Buduj(string zrodlo)
        {
            // http://pl.wikipedia.org/wiki/Kodowanie_Huffmana

            // 1. Określ prawdopodobieństwo (lub częstość występowania) dla każdego symbolu ze zbioru S.
            for (int i = 0; i < zrodlo.Length; i++)
            {
                if (!Czestotliwosci.ContainsKey(zrodlo[i]))
                {
                    Czestotliwosci.Add(zrodlo[i], 0);
                }

                Czestotliwosci[zrodlo[i]]++;
            }

            // 2. Utwórz listę drzew binarnych, które w węzłach przechowują pary: symbol, prawdopodobieństwo. Na początku drzewa składają się wyłącznie z korzenia.
            foreach (KeyValuePair<char, int> LoopSymbol in Czestotliwosci)
            {
                _Wezly.Add(new Wezel() { Symbol = LoopSymbol.Key, Czestotliwosc = LoopSymbol.Value });
            }

            // 3. Dopóki na liście jest więcej niż jedno drzewo, powtarzaj
            while (_Wezly.Count > 1)
            {
                // Posortowanie wedlug czestotliwosci
                List<Wezel> PosortowaneWezly = _Wezly.OrderBy(node => node.Czestotliwosc).ToList<Wezel>();
                
                if (PosortowaneWezly.Count >= 2)
                {
                    List<Wezel> WzieteDwa = PosortowaneWezly.Take(2).ToList<Wezel>();

                    Wezel Rodzic = new Wezel()
                    {
                        Symbol = '*',
                        Czestotliwosc = WzieteDwa[0].Czestotliwosc + WzieteDwa[1].Czestotliwosc,
                        Lewy = WzieteDwa[0],
                        Prawy = WzieteDwa[1]
                    };

                    // Usuń z listy dwa drzewa o najmniejszym prawdopodobieństwie zapisanym w korzeniu.
                    _Wezly.Remove(WzieteDwa[0]);
                    _Wezly.Remove(WzieteDwa[1]);

                    // Wstaw nowe drzewo, w którego korzeniu jest suma prawdopodobieństw usuniętych drzew, natomiast one same stają się jego lewym i prawym poddrzewem. Korzeń drzewa nie przechowuje symbolu.
                    _Wezly.Add(Rodzic);
                }

                // Drzewo, które pozostanie na liście, jest nazywane drzewem Huffmana – prawdopodobieństwo zapisane w korzeniu jest równe 1, natomiast w liściach drzewa zapisane są symbole.
                this.Korzen = _Wezly.FirstOrDefault();
            }

        }
Esempio n. 2
0
 public bool JestLisciem(Wezel wezel)
 {
     return (wezel.Lewy == null && wezel.Prawy == null);
 }