2016-11-10 5 views
1

Ich habe das Paket container/heap verwendet, um eine Prioritätswarteschlange zu implementieren. Eine Sache stört mich allerdings. Was sollte das Verhalten der interface.Pop()-Methode sein, wenn der Heap leer ist? Ich sehe nichts in der Dokumentation erwähnt und der Quellcode scheint nicht, diese Situation zu erwarten:Container/Heap Pop() auf leeren Heap

// 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() 
} 

Klar, wenn h.Len() ist 0 dies nicht gut funktionieren wird. Ist das einfach zu panic gemeint oder wird der Benutzer erwartet, immer zu überprüfen, ob noch irgendwelche Gegenstände übrig sind?

+0

Es liegt an Ihnen. Sie können entweder nil oder panic zurückgeben. (Ich würde sagen, es ist richtiger, es in Panik zu versetzen, anstatt den Benutzer einen Null-Rückgabewert erhalten zu lassen) – JimB

+0

gehen Sie tiefer und überprüfen Sie die Methoden h.Swap() und down(), sie überprüfen die Grenzen –

+0

@YandryPozo - 'if j1> = n || j1 <0 {// j1 <0 nach int Überlauf "Ich denke, das ist ein bisschen anders. Und 'h.Swap()' wird durch das zugrundeliegende 'sort.Interface' implementiert. –

Antwort

1

Das natürliche Verhalten ist Panik. Dies ist, was die IntHeap example tut.

Wie in den Kommentaren darauf hingewiesen, wird die Kontrolle h.Pop() nicht erreichen, wenn h.Swap() Panics. Allerdings h.Pop() kann immer noch auf einem leeren Haufen aufgerufen werden, wenn heap.Remove() gegeben wird -1 als Index:

// 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() 
} 

Wenn h.Swap() panics auf negative Indizes, h.Pop() sollte auch für Konsistenz in Panik.

h.Swap() ignorieren ignorieren negative Indizes und h.Pop() geben Sie einen Standardwert wie nil ist konsistent, aber andere Programmierer würde das überraschend finden, so dass ich es nicht empfehlen.