1

プライオリティ キューが必要です。フレームワークでは、CHMutableArrayHeap と CHBinaryHeap で十分ですよね。

ただし、同じ優先度のオブジェクトをキューに送信すると、CHMutableArrayHeap と CHBinaryHeap の両方が追加順序を維持できなくなります。

たとえば、obj1 から obj10 までのオブジェクトがあり、それらの優先度は同じです。これらの 10 個のオブジェクトを 1 から 10 まで 1 つずつキューに追加した後、それらの位置は追加順序と同じではなく、obj4 が obj1 の前に来る場合があります。

では、クイン、優先度が同じ場合に追加順序を維持する優先キューが必要な場合はどうすればよいですか?

ありがとう

4

1 に答える 1

3

(申し訳ありませんが、私はこの質問をほとんど見ませんでした。)

ヒープの性質上、挿入順序はまったく保持されないため、(1)別のデータ構造の上に優先キューを作成するか、(2)挿入順序を追跡する別のデータ構造でヒープを補完する必要があります。ただし、ヒープは一般に優先キューを実装するための最も効率的な(そして好ましい)方法であるため、他のものを使用するのが良い考えかどうかはわかりません。私がこれを言う主な理由は、ヒープが提供する挿入を非常に高速にしたいということです。ソートされた配列に追加することはできません。

1つの可能性は、優先度レベルごとにキュー(CHCircularBufferQueueなど)を維持することです。(キューを管理するラッパー構造を作成して、呼び出し元がキューを直接処理する必要がないようにすることをお勧めします。)優先度を含むNSNumberでキー設定されたディクショナリにキューを格納できる可能性がありますが、私はパフォーマンスがどのようになるかはわかりません。これは明らかに、非常に広範囲の優先順位に非常に効率的に拡張できず、多くの挿入と削除には対応できない可能性がありますが、小さな場合には機能する可能性があります。ただのアイデア。

もう1つのアイデアは、優先度と挿入時間の両方を格納するラッパークラスを作成し、それらを順番に比較することです。この場合、それらを格納するために、ソートされたセット(たとえば、バイナリツリー)を使用することをお勧めします。ただし、オーバーヘッドが追加されるということは、ヒープの場合と同じパフォーマンスが得られないことを意味しますが、これが挿入順序を維持するためのトレードオフだと思います。

更新:私はこれらの関連する質問を見つけました:

https://stackoverflow.com/questions/tagged/priority-queue

于 2011-09-07T04:48:35.707 に答える