/// <summary> /// Returns a dictionary of chosen encoding bytes for each distinct T. /// </summary> public Dictionary <T, byte[]> Compress(T[] input) { var frequencies = computeFrequency(input); var minHeap = new BHeap <FrequencyWrap>(); foreach (var frequency in frequencies) { minHeap.Insert(new FrequencyWrap( frequency.Key, frequency.Value)); } while (minHeap.Count > 1) { var a = minHeap.Extract(); var b = minHeap.Extract(); var newNode = new FrequencyWrap( default(T), a.Frequency + b.Frequency); newNode.Left = a; newNode.Right = b; minHeap.Insert(newNode); } var root = minHeap.Extract(); var result = new Dictionary <T, byte[]>(); dfs(root, new List <byte>(), result); return(result); }
/// <summary> /// Now gather the codes. /// </summary> private void dfs(FrequencyWrap currentNode, List <byte> pathStack, Dictionary <T, byte[]> result) { if (currentNode.IsLeaf) { result.Add(currentNode.Item, pathStack.ToArray()); return; } if (currentNode.Left != null) { pathStack.Add(0); dfs(currentNode.Left, pathStack, result); pathStack.RemoveAt(pathStack.Count - 1); } if (currentNode.Right != null) { pathStack.Add(1); dfs(currentNode.Right, pathStack, result); pathStack.RemoveAt(pathStack.Count - 1); } }