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(); } }
public bool JestLisciem(Wezel wezel) { return (wezel.Lewy == null && wezel.Prawy == null); }