ヒープはツリーデータ構造であり、ツリーの上位レベルには、下位レベルよりも常に大きい(または、そのように設定されている場合は小さい)値が含まれます。「」ヒープは、プログラムが動的割り当てに使用できる空きRAMの集まりです。どちらも「ヒープ」と呼ばれていますが、一方が他方と何の関係があるのでしょうか。
10 に答える
正直なところ、何もありません。ヒープという言葉は、日常の(技術的ではない)使用法で単純に解釈され、これら2つの概念にかなり良い例えとして個別に適用されたと思います。
最初のケース(ツリーデータ構造の意味)では、「より大きい」オブジェクトがツリーの上位に配置されるため(「より大きい」は任意のキー関数によって決定されます)、説明ヒープが最も適切です。大きなオブジェクトの上に小さなオブジェクト(または、考え方によっては、上に大きなオブジェクト)。これは私がそれを解釈する方法です。このデータ構造に名前ヒープを最初に適用した人は誰でも、それが彼の頭の中で適切な名前であると考え、それはただ立ち往生しています。
2番目のケース(RAMのチャンク)では、ヒープの名前がもう少しわかりやすいかもしれません。ここでの「ヒープ」は、「非常に任意の順序の大きなコレクション」であり、動的に割り当てられたメモリのチャンクと同様に、一般的な使用法にも当てはまるように思われます。
いずれにせよ、私はあなたが2つのアイデアの間に描くことができる抽象的な比喩的な類似性について心配することはありません。それらを完全に別々に扱ってください、そして、あなたはどんな状況でも間違って行くことはありません。
編集:コンピュータサイエンスでかなり一般的であるように、ツリーベースのデータ構造は抽象代数のヒープからその名前を取っているようです。しかし、私はこれを確認したり否定したりしたくありません...
メモリの無料ストアの「ヒープ」という名前の由来については、このサイトを参照してください。
彼らは両方とも同じ名前を持っています、それはそれについてです。
そこでは、「ヒープ」が実際のヒープデータ構造として配置されることはありません。
ヒープ(データ構造)は、描画するとヒープのように見えるため、このように呼ばれます。ヒープ(メモリ)は、何らかの形で編成されているが完全ではないため、ヒープと呼ばれます。ヒープにデータを蓄積しますが、ヒープに穴や不規則性がある可能性があります。それはまるであなたが紙を山に置くかのようです。時々あなたは下から1つを削除します。これはヒープの形式を持っています。つまり、何らかの形で編成されていますが、完全ではありません。
彼らは...同じ名前を持っています!それでおしまい。
2つの間の唯一の関係は「ヒープ」という名前です。
何もない。関係ありません。
質問をさらに複雑にするために、一部のシステム(Microsoft Windowsなど)では、メモリ割り当ての意味で複数の「ヒープ」があります。「」ヒープは、単なるデフォルトのヒープです。ただし、を呼び出す場合はHeapAlloc()
、サブ割り当てが必要なメモリ割り当てから選択できます。
Answers.comからの定義
ヒープ:上下に配置またはスローされたもののグループ:隅にある汚れたぼろきれのヒープ。
物を無秩序に投げるという概念的なイメージのため、これは単なる基本的な命名です。他のポスターが指摘しているように、ヒープはヒープデータ構造として編成されていません。これは、システムライブラリのメモリ割り当てルーチンによって異なります(たとえば、mallocがどのように機能するかを確認してください)。
ヒープはデータ構造であり、実際にはいくつかの追加のプロパティを持つ完全なバイナリツリーです。ヒープには次の2つのタイプがあります。
- MINヒープ
- MAXヒープ
最小ヒープでは、ルートの値がツリー内で最も低く、ルートをポップアウトすると、次に低い要素が一番上に表示されます。ツリーをヒープに変換するには、heapifyアルゴリズムを使用します。これは、C++では優先キューとも呼ばれます。そして通常、競争力のあるプログラマーとして、ヒープにSTL関数を使用するので、最初からヒープを作成するという煩わしさに陥る必要はありません。最大ヒープは正反対で、ルートが最大です。通常、ヒープが使用されます。これは、要素の削除と挿入にO(logN)の時間計算量があり、10^6のような厳しい制約でも機能するためです。
これで、メモリ内のヒープとヒープデータ構造の間の混乱を理解できますが、それらは完全に異なるものです。データ構造のヒープは、データを格納するための単なる方法です。