2つの異なる概念が両方とも「ヒープ」と呼ばれるのはなぜですか?


170

ランタイムヒープがCスタイル言語の動的メモリ割り当てに使用されるのはなぜですか?データ構造は両方とも「ヒープ」と呼ばれますか?何か関係はありますか?


4
今日、データ構造を研究しているときにこれを疑問に思いました。
MitMaro 2009年


3
英語の辞書に行き、「実行」の下のエントリの数を数えます。40以上のエントリのうちいくつがコンピュータに適用されますか?:)
jmucchiello 2009年


動的メモリ割り当てに使用されるランタイムヒープに関するここの関連記事
RBT

回答:


77

ドナルドクヌース氏は次のように述べています(The Art of Computer Programming、Third Ed。、Vol。1、p。435):

1975年頃、何人かの著者が利用可能なメモリのプールを「ヒープ」と呼び始めました。

彼はどの作者についても特定の論文への言及もしていませんが、優先度キューに関連して「ヒープ」という用語を使用することは伝統的な言葉の意味であると述べています。


11
プールはヒープよりも良い名前です。

7
面白い。誰かが彼にどの作者を覚えているか尋ねる必要があります。
Falken教授、

27
ウィキペディアによると、それは初期の段階でLispがヒープ(データ構造)を使用してメモリストアを実装したためです。方法は言いません。その参考文献は、「トーマスH.コーメン、チャールズE.ライザソン、ロナルドL.リベスト(1990):アルゴリズムの紹介。MITPress / McGraw-Hill。」ですが、これは私にはありません。
スティーブジェソップ2012

2
これについてのリファレンスはありませんが、メモリのオープンブロックへの参照を整理するために最初に使用されたデータ構造は最小ヒープだったと思います。それはあなたが保存しようとしていたデータを保存することを可能にするメモリの最小ブロックをすばやく見つける少なくともまともな方法だと思われますUpdate:私が言ったことは正確にバディブロックのように聞こえますen.wikipedia.org/wiki/Dynamic_memory_allocation #バディ%5Fblocks
ウィル

4
@SteveJessop-Checking Cormen、Leiserson、Rivest、Stein-3 rd edition(2009)at the start of Heapsort chapter is this only only「ヒープ」という用語は当初、ヒープソートの文脈で作成されましたが、それ以来、「 JavaやLispが提供するプログラミング言語などのガベージコレクションされたストレージ」。私たちのヒープデータ構造はガベージコレクションされたストレージではなく、このドキュメントでヒープを参照するときはいつでも、ガベージコレクションの側面ではなくデータ構造を意味します。CLRS-第2版もほぼ同じ表現を使用しています(Lispがヒープを使用したことを示すものはありません)。
ジンボブ博士、2013

64

それらは同じ名前を持っていますが、実際には(概念的にも)似ていません。メモリヒープは、洗濯かごを「衣類の山」と呼ぶのと同じように、ヒープと呼ばれます。この名前は、メモリを自由に割り当てたり割り当て解除したりできる、やや乱雑な場所を示すために使用されます。データ構造(参照するWikipediaのリンクが指摘するように)はかなり異なります。


8
はい、私はむしろそれが彼が彼の質問に基づいているポイントであると思います:それらは異なっています。それで、なぜ彼らは同じものを呼ばれるのですか?いくつかの根本的な関係がありますか?
Sean Owen、

9
私がこの答えを解釈した方法は「いいえ、根本的な関係はありません」なので、質問に答えます。
ローレンスゴンサルベス

アンドリューはそれに答えています。関係はありません。ただの偶然。メモリは「衣服のヒープ」のように割り当てられるため、メモリヒープは一般的な使用法により忠実です。ただし、データ構造は想像力のより広い範囲を要求しました。そして、これはかなり興味深い「なぜ」になります。名前はファクトノードがキーによって配置されていることに由来し、親ノードのキーは常に子ノードよりも大きい> =です。
Alexandre Bell

6
彼らは全く無関係です。ただし、これを「ヒープ」と呼ぶ際の問題は、「ヒープ」の対応物である「スタック」も実際のスタックであることです。
dan

1
ヒープデータ構造がヒープと呼ばれる理由を知っています。これは、ヒーププロパティを満たしているためです。しかし、なぜヒーププロパティはそのように呼ばれるのでしょうか。「トップヘビー」のような名前の方がはるかに良いので、私には意味がありません。
トーマス・エディング2012

31

名前の衝突は残念ですが、それほど神秘的ではありません。ヒープは、パイル、コレクション、グループなどを意味するために使用される小さな一般的な単語です。データ構造の単語の使用は、メモリプールの名前よりも前に(私はかなり確信しています)です。実際、私の意見では、プールは後者の方がはるかに良い選択だったでしょう。ヒープは、データ構造には適合しますが、メモリプールには適合しない(杭のような)垂直構造を意味します。メモリプールヒープは階層構造とは見なされませんが、データ構造の背後にある基本的な考え方は、ヒープ(およびサブヒープ)の一番上に最大の要素を保持することです。

ヒープのデータ構造は60年代半ばまでさかのぼります。70年代前半のメモリプールをヒープします。ヒープ(メモリプールを意味する)という用語は、少なくとも1971年にWigngaardenによってAlgolの議論で使用されました。

おそらく、データ構造としてのヒープの最も早い使用は、7年前の
ウィリアムズ、JWJ 1964で見つかりました。「アルゴリズム232-ヒープソート」、Communications of the ACM 7(6):347-348


1
はい。ただし、ヒープは障害も意味し、メモリヒープは一般的に無秩序です。データ構造ヒープは非常によく整理されています。そのため、ヒープの一般的な定義に基づいて、同じように反対の不一致が生じます。
jmucchiello 2009年

IMOの名前を説明するのに十分なスタックの反対として常に導入されます
reinierpost、2011年

1
偶然ではありません。フリーリストは、2項式ヒープを介して優先キューとして実装できます。
ヒースハニカット

2
@jmucchiello:ログのヒープが(参照画像を)よく注文されると、ツリーに似ています。これは私の学部の教科書の1つによるデータ構造の名前の由来です。
gioele '28年

6

実際、メモリの割り当て方法(バディブロックを参照)を読むと、データ構造のヒープを思い出します。


Peter Zhangの回答に対する私のコメントもここに関連しています。バイナリバディシステムはバイナリツリーとして表すことができ、各ノードの「キー」がその下の合計メモリである場合に有効な最大ヒープのように見えます(ただし、これらの値は暗黙的であり、決して変更されません)。割り当てアルゴリズムも解放アルゴリズムも、私が知る限り、このバイナリツリーでヒープ操作を使用しません。
EricDubé18年

5

IMOまったく関係のないこれら2つのものが同じ名前を持つのは単なる事故/偶然です。そのようなグラフグラフ


2つのグラフは、どういうわけか関連しています。関数のグラフを次のように想像してみてください:タプルドメイン、範囲)は頂点であり、エッジはそのような2つの頂点を接続します

2
@Amit:無限数の頂点を意味する連続グラフの場合。これは問題ありませんが、頂点間のエッジの概念が意味をなさなくなります。関数f(x)= x * 2のグラフで、(0,0)と(1,2)の間にエッジがありますか?はいの場合、(0,0)と(0.5,1)はどうですか?(0,0)と(0.25,0.5)?頂点間のエッジの概念を持つ方法がないため、これは実際にはグラフではありません。
MAK、

5

ヒープのようなデータ構造は、使用可能なメモリ割り当てを見つけるアルゴリズムによって使用されます。以下はhttp://www.cprogramming.com/tutorial/virtual_memory_and_heaps.htmlからの抜粋です。

ときにnew呼び出され、それはあなたの要求のためのサイズに合った空きメモリブロックを探し始めます。そのようなメモリブロックが見つかった場合、予約済みとしてマークされ、その場所へのポインタが返されます。オブジェクトのサイズよりも大きい最小の空きブロックを見つけるためにメモリ全体をスキャンするか、必要なメモリが収まる最初のブロックを返すまでの間に妥協が必要なため、これを実現するアルゴリズムはいくつかあります。メモリのブロックを取得する速度を向上させるために、メモリの空き領域と予約領域は、ヒープと呼ばれるバイナリツリーと同様のデータ構造で維持されます。


1
特に「メモリの空き領域と予約済み領域は、ヒープと呼ばれるバイナリツリーと同様のデータ構造で維持されている」とは、私はこれに非常に懐疑的です。作者が「ヒープ」という名前に基づいて接続があると推測しているように思えますが、おそらく間違っています。誰でも確認/反駁できますか?
ドンハッチ

1
Binary Buddyシステム(Linuxで使用されています)に関する簡単な調査の後、データをどのように分割するかにより、バイナリツリーで表すことができます。総メモリの観点からノードを観察すると、このバイナリツリーは有効な最大ヒープのように見えますが、ノードは最大ヒープにあるため、このバイナリツリーには挿入されません。ノードは空きメモリの最小リーフに直接挿入されます> =要求されたサイズ。 1 2 3
EricDubé18年

1

C ++標準では、俗語のスタックメモリとヒープメモリは使用されていません。標準では、静的ストレージ、スレッドストレージ、自動ストレージ、動的ストレージを使用します。

詳細は、規格のStorage Duractionセクションにあります。

したがって、言語と標準ライブラリの観点からは、混乱はありません。


1

Q.ヒープとは何ですか?A.ヒープは、互いの上に配置されたオブジェクトのコレクションです。

あなたの質問への回答:メモリヒープとバイナリヒープはどちらも、ご存知のように同じ概念を使用しています。データは、プログラムに書き込まれたのと同じ順序でメモリにヒープの形式で格納されますが、バイナリヒープは、ヒープの形式でデータを順序どおりに格納するという同じ概念に従うデータ構造です(先頭のデータ他の)。コメント欄であなたの考えを教えてください。


-2

おそらく、最初に実装されたメモリヒープは、ヒープ構造によって管理されていましたか?


8
その仮説はまったく明らかではないようです。ヒープ(動的メモリ領域)を維持するために、ヒープ(データ構造)はどのように役立つのでしょうか。
キースランドール

7
-1。私は、明らかに単なる推測ではなく、証拠のある信頼できる陳述を望みます。
ロブ・ケネディ

ありそうもない。ヒープ(データ構造)を使用してヒープ(空きメモリのプール)を管理する正当な理由はないようです。
ジェイソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.