2016-11-10 3 views
1

container/heapパッケージを使用して優先度キューを実装しました。一つの事は私を悩ます。ヒープが空の場合、interface.Pop()メソッドの動作はどのようにする必要がありますか?私は、ドキュメントに記載された何も表示されませんし、ソースコードは、このような状況を期待していないようです:空のヒープ上のコンテナ/ヒープ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の後に '私はこれは少し異なると思う。そして '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のようなデフォルト値が一貫して返しますが、私はそれをお勧めしませんので、他のプログラマはそれが意外見つけるだろう持ちます。

関連する問題