最小ヒープと最大ヒープの両方の機能を持つバイナリ ヒープ (優先キュー) を実装しようとしています。insert(value)
、extractMin()
、およびextractMax()
メソッドが必要です。抽出メソッドはヒープから値を削除し、値を返します。
minHeap
私は元々とという 2 つの配列を使用していました。1maxHeap
つはデータを最小ヒープ構造に格納するため、もう 1 つは同じデータを最大ヒープ構造に格納するためです。したがって、 を呼び出すとextractMin()
、 から値が削除されて返されますminHeap
。次に、両方のヒープでデータセットを同一に保つために、その値maxHeap
も削除する必要があります (呼び出した場合はその逆)。extractMax()
また、ヒープ順序プロパティにより、他のヒープの葉でその値を見つけることが保証されます。他のヒープでその値を検索すると、リーフのみを検索するため、O(n) またはより正確には O(n/2) の時間計算量になります。言うまでもなくpercolatingDown()
、percolatingUp()
値を削除した後にヒープを復元する方法は、すでに O(log n) です。したがって、合計で、抽出メソッドは O(n) になります。問題は、抽出メソッドを O(log n) にする必要があることです。
これについてもっと良い方法はありますか?
私もこのアイデアを考えましたが、最初に皆さんの考えを知りたいと思いました。
データの小さい半分を最大ヒープに、大きい半分を最小ヒープに配置することで、「中央ヒープ」のコーディングを終了しました。この構造により、特定の値セットの中央値を簡単に取得できます。そして、データの小さい半分を最小ヒープに配置し、大きい半分を最大ヒープに配置し、すべての値の平均 (中央値ではなく) を使用して、を呼び出すときに、値を最大ヒープまたは最小ヒープに配置しますinsert(value)
。抽出メソッドは O(log n) のままなので、これは機能する可能性があると思います。