2016-11-10 3 views
1

container/heap 패키지를 사용하여 우선 순위 큐를 구현했습니다. 한 가지는 나를 괴롭힌다. 힙이 비어있는 경우 interface.Pop() 메서드의 동작은 무엇입니까? 나는 문서에서 언급 아무것도 표시되지 않는 소스 코드는이 상황을 기대하지 않는 것 :컨테이너/힙 빈 힙에 대한 팝업()

// Pop removes the minimum element (according to Less) from the heap 
// and returns it. The complexity is O(log(n)) where n = h.Len(). 
// It is equivalent to Remove(h, 0). 
// 
func Pop(h Interface) interface{} { 
     n := h.Len() - 1 
     h.Swap(0, n) 
     down(h, 0, n) 
     return h.Pop() 
} 

분명히 h.Len()이 잘 작동하지 않을 0 경우. 단순히 panic을 의미합니까, 아니면 남은 항목이 있는지 항상 확인해야하는 사용자입니까?

+0

귀하에게 달려 있습니다. nil 또는 공황 상태를 반환 할 수 있습니다. (나는 공황 상태에 빠지게하는 것이 적절하다고 말한다.) – JimB

+0

더 깊게 가서 h.Swap()과 down() 메소드를 체크하면 한계를 확인한다 –

+0

@YandryPozo -'if j1> = n || j1 <0 {// j1 <0 int overflow after'나는 이것이 약간 다르다고 생각합니다. 그리고'h.Swap()'은 기본'sort.Interface'에 의해 구현됩니다. –

답변

1

자연스러운 동작은 패닉 상태입니다. 이것이 IntHeap example의 기능입니다.

덧글에 지적한대로 패닉 경우 제어가 h.Pop()에 도달하지 않습니다. heap.Remove()이 주어진 경우, h.Pop() 여전히 -1 빈 힙에 호출 할 수있는 지표로 : 음의 지수에

// Remove removes the element at index i from the heap. 
// The complexity is O(log(n)) where n = h.Len(). 
// 
func Remove(h Interface, i int) interface{} { 
    n := h.Len() - 1 
    if n != i { 
     h.Swap(i, n) 
     down(h, i, n) 
     up(h, i) 
    } 
    return h.Pop() 
} 

h.Swap()하면 패닉, h.Pop()도 일관성을 공포해야한다.

h.Swap()은 음수 인덱스를 무시하고 h.Pop()nil과 같은 기본값을 반환하지만 다른 프로그래머는 그 사실을 알고 있으므로 권장하지 않습니다.