From 2d48a86f5ee2d3cab8d0f4e8b2dbb101ff9f8125 Mon Sep 17 00:00:00 2001 From: Vincent Batts Date: Sun, 13 Apr 2014 10:33:41 -0400 Subject: [PATCH] something like a huffman trie --- huffman.go | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/huffman.go b/huffman.go index 38c0bea..c38b290 100644 --- a/huffman.go +++ b/huffman.go @@ -16,16 +16,22 @@ func (n Node) Lookup(value interface{}) *Node { } func NewPathTree(paths []string) *Node { - nodes := []Node{} + nodes := []*Node{} for i := range paths { - node := Node{Weight: int64(i + 1), Value: paths[i]} - nodes = append(nodes, node) + nodes = append(nodes, &Node{Weight: int64(i + 1), Value: paths[i]}) } - nodeHeap := nodeInterface(nodes) - heap.Init(nodeHeap) - - return &Node{} + h := nodeInterface(nodes) + h_ptr := &h + heap.Init(h_ptr) + count := h_ptr.Len() + for count > 1 { + left := heap.Pop(h_ptr) + right := heap.Pop(h_ptr) + heap.Push(h_ptr, Combine(left.(*Node), right.(*Node))) + count = h_ptr.Len() + } + return heap.Pop(h_ptr).(*Node) } func Combine(left *Node, right *Node) *Node { @@ -43,10 +49,17 @@ func Combine(left *Node, right *Node) *Node { } } -type nodeInterface []Node +type nodeInterface []*Node -func (ni nodeInterface) Push(x interface{}) {} -func (ni nodeInterface) Pop() interface{} { return Node{} } -func (ni nodeInterface) Len() int { return len(ni) } -func (ni nodeInterface) Less(i, j int) bool { return ni[i].Weight < ni[j].Weight } -func (ni nodeInterface) Swap(i, j int) { ni[i], ni[j] = ni[j], ni[i] } +func (ni nodeInterface) Len() int { return len(ni) } +func (ni nodeInterface) Less(i, j int) bool { return ni[i].Weight < ni[j].Weight } +func (ni nodeInterface) Swap(i, j int) { ni[i], ni[j] = ni[j], ni[i] } +func (ni *nodeInterface) Push(x interface{}) { *ni = append(*ni, x.(*Node)) } +func (ni *nodeInterface) Pop() interface{} { + old := *ni + n := len(old) + x := old[n-1] + *ni = old[0 : n-1] + return x + +}