diff --git a/tree/heap/heap.go b/tree/heap/heap.go index 126fb08..e376c30 100644 --- a/tree/heap/heap.go +++ b/tree/heap/heap.go @@ -110,7 +110,6 @@ func (h *Heap) Pop() (interface{}, bool) { downvalue := h.elements[h.size] var cidx, c1, c2 int - var cvalue1, cvalue2 interface{} // down for { cidx = curidx << 1 @@ -119,11 +118,7 @@ func (h *Heap) Pop() (interface{}, bool) { c2 = cidx + 2 if c2 < h.size { - - cvalue2 = h.elements[c2] - cvalue1 = h.elements[c1] - - if h.Compare(cvalue1, cvalue2) >= 0 { + if h.Compare(h.elements[c1], h.elements[c2]) >= 0 { cidx = c1 } else { cidx = c2 diff --git a/tree/heap/heap_test.go b/tree/heap/heap_test.go index b4c90f8..ab4251d 100644 --- a/tree/heap/heap_test.go +++ b/tree/heap/heap_test.go @@ -9,48 +9,52 @@ import ( ) func TestHeapGrowSlimming(t *testing.T) { - h := New(compare.Int) - var results []int - for i := 0; i < 100; i++ { - v := randomdata.Number(0, 100) - results = append(results, v) - h.Put(v) - } - sort.Slice(results, func(i, j int) bool { - if results[i] > results[j] { - return true + + for ii := 0; ii < 1000; ii++ { + + h := New(compare.Int) + var results []int + for i := 0; i < 100; i++ { + v := randomdata.Number(0, 100) + results = append(results, v) + h.Put(v) } - return false - }) + sort.Slice(results, func(i, j int) bool { + if results[i] > results[j] { + return true + } + return false + }) - if h.Size() != 100 || h.Empty() { - t.Error("size != 100") - } - - for i := 0; !h.Empty(); i++ { - v, _ := h.Pop() - if results[i] != v { - t.Error("heap is error") + if h.Size() != 100 || h.Empty() { + t.Error("size != 100") } - } - if h.Size() != 0 { - t.Error("size != 0") - } + for i := 0; !h.Empty(); i++ { + v, _ := h.Pop() + if results[i] != v { + t.Error("heap is error") + } + } - h.Put(1) - h.Put(5) - h.Put(2) + if h.Size() != 0 { + t.Error("size != 0") + } - if h.Values()[0] != 5 { - t.Error("top is not equal to 5") - } + h.Put(1) + h.Put(5) + h.Put(2) - h.Clear() - h.Reborn() + if h.Values()[0] != 5 { + t.Error("top is not equal to 5") + } - if !h.Empty() { - t.Error("clear reborn is error") + h.Clear() + h.Reborn() + + if !h.Empty() { + t.Error("clear reborn is error") + } } } @@ -104,6 +108,20 @@ func TestHeapPushTopPop(t *testing.T) { } } +// func BenchmarkPush(b *testing.B) { +// h := New(compare.Int) +// b.N = 40000000 +// var results []int +// for i := 0; i < b.N; i++ { +// results = append(results, randomdata.Number(0, 1000000000)) +// } + +// b.ResetTimer() +// for _, v := range results { +// h.Put(v) +// } +// } + // func Int(k1, k2 interface{}) int { // c1 := k1.(int) // c2 := k2.(int)