短い答え:できません。
少し長い答え:
エントリの「年齢」を保存するために追加スペースが必要になります。これにより、同一の優先順位を区別できます。また、高速な挿入と取得を可能にする情報のためにΩ (n )スペースが必要です。さらにペイロード(値と優先度)。Ω(n)Ω(n)
また、保存するペイロードごとに、アドレス内の一部の情報を「隠す」ことができます(たとえばはYがXより古いことを意味します)。しかし、その「隠された」情報では、「年齢」または「高速検索」情報を非表示にします。両方ではありません。addr(X)<addr(Y)
不正確な不安定な擬似数学で非常に長い答え:
注:前述のとおり、2番目のパートの最後は大ざっぱです。数学者がより良いバージョンを提供できるなら、私は感謝するでしょう。
Xビットマシン(32ビットまたは64ビットなど)に関係するデータの量について考えてみましょう。レコード(値と優先度)はマシンワード幅です。P
:あなたは、部分的に順序付けられている可能性のあるレコードのセット持っている及び(、1 )= (、1 )がありますが、比較することはできません(、1 )と(B 、1 )。(a,1)<(a,2)(a,1)=(a,1)(a,1)(b,1)
ただし、レコードのセットの2つの比較できない値を、それらが挿入された時期に基づいて比較できるようにしたい場合があります。したがって、ここには別の値のセットがあります:挿入された値、および半順序でそれを拡張したい場合:XがYの前に挿入された場合。バツ< YバツY
最悪のシナリオでは、メモリはフォームのレコード(各?で異なる?)でいっぱいになるので、どちらを挿入するかを決定するには、挿入時間に完全に依存する必要があります。最初に。(?、1 )?
- 挿入時間(まだ構造内にある他のレコードと比較して)には、ビットの情報が必要です(Pバイトペイロードと2 Xアクセス可能なメモリバイト)。バツ− l o g2(P)2バツ
- ペイロード(レコードの値と優先度)には、マシンワードの情報が必要です。P
つまり、保存するレコードごとに、何らかの方法で追加ビット情報を保存する必要があります。そして、それはnレコードのO (n )です。バツ− l o g2(P)O (n )n
さて、各メモリ「セル」が提供する情報のビット数はどれくらいですか?
- ビットのデータ( Wはマシンワード幅)。WW
- ビットのアドレス。X
さて、聞かせてのは、前提と(ペイロードが広い(通常は1つのオクテット少なくとも1つの機械語です))。これは、X − l o g 2(P )< Xであることを意味するため、セルのアドレスに挿入順序情報を収めることができます。それがスタックで起こっていることです。最も低いアドレスのセルが最初にスタックに入りました(そして最後に出ます)。P≥1X−log2(P)<X
したがって、すべての情報を保存するには、2つの可能性があります。
- 挿入順序をアドレスに保存し、ペイロードをメモリに保存します。
- 両方をメモリに保存し、他の用途のためにアドレスを空けておきます。
明らかに、無駄を避けるために、最初のソリューションを使用します。
次に、操作について説明します。あなたが持っていることを望むと思う:
- Insert(task,priority)O(logn)
- StableExtractMin()O(logn)
StableExtractMin()
本当に本当に一般的なアルゴリズムは次のようになります。
- O(logn)
- O(logn)
- それを返します。
0(1)O(1)O(1)
O(logn)2(X−log2(P))
X−log2(P)O(logn)O(logn)
O(logn) on average to get to the min).
Now, when deleting that element, we'll need to augment the next min record so it has the right amount of information to allow O(logn) retrieval next time, that is, so it has X−log2(P) bits of information discriminating it from the other candidates.
That is, if it doesn't have already enough information, you'll need to add some. In a (non-balanced) binary search tree, the information is already there : You'll have to put a NULL pointer somewhere to delete the element, and without any further operation, the BST is searchable in O(logn) time on average.
After this point, it's slightly sketchy, I'm not sure about how to formulate that. But I have the strong feeling that each of the remaining elements in your set will need to have X−log2(P) bits of information that will help find the next min and augment it with enough information so that it can be found in O(logn) time next time.
The insertion algorithm usually just needs to update part of this information, I don't think it will cost more (memory-wise) to have it perform fast.
Now, that means that we'll need to store X−log2(P) more bits of information for each element. So, for each element, we have :
- The insertion time, X−log2(P) bits.
- The payload P machine words.
- The "fast search" information, X−log2(P) bits.
Since we already use the memory contents to store the payload, and the address to store the insertion time, we don't have any room left to store the "fast search" information. So we'll have to allocate some extra space for each element, and so "waste" Ω(n) 余分なスペース。