왜 서로 다른 두 개념이“힙”이라고 불리는가?


170

C 스타일 언어의 동적 메모리 할당과 데이터 구조를 모두 "힙"이라고 하는 런타임 힙이 사용되는 이유는 무엇 입니까? 어떤 관계가 있습니까?


4
데이터 구조를 연구하면서 오늘 궁금했습니다.
MitMaro 2009


3
영어 사전으로 이동하여 "실행"아래 항목 수를 계산하십시오. 40 개 이상의 항목 중 몇 개가 컴퓨터에 적용됩니까? :)
jmucchiello


이와 관련된 포스트 여기에 동적 메모리 할당에 사용 WRT 런타임 힙.
RBT

답변:


77

도널드 크 누스 (Donald Knuth)는 다음과 같이 말한다 (컴퓨터 프로그래밍 기술, 제 3 판, Vol.

몇몇 저자들은 1975 년경에 사용 가능한 메모리 풀을 "힙"이라고 부르기 시작했습니다.

그는 어떤 저자를 언급하지 않고 특정 논문을 언급하지 않지만 우선 순위 대기열과 관련하여 "힙"이라는 용어를 사용하는 것이 전통적인 단어의 의미라고 말합니다.


11
풀은 힙보다 나은 이름입니다.

7
흥미 롭군 어떤 작가를 기억하는지 물어보아야합니다.
교수 팔켄

27
Wikipedia는 Lisp가 초기 단계에서 힙 (데이터 구조)을 사용하여 메모리 저장소를 구현했기 때문이라고 주장합니다. 어떻게 말하지 않습니다. "토마스 H. 코먼, 찰스 라이 슨, 로널드 L. 리 베스트 (1990) : 알고리즘 소개. MIT Press / McGraw-Hill."에 대한 언급은 없습니다.
Steve Jessop

2
나는 이것에 대한 참조가 없지만 처음에는 메모리 블록을 여는 참조를 구성하는 데 사용되는 데이터 구조가 최소 힙이었을 것입니다. 최소한 저장하려는 데이터를 저장할 수있는 가장 작은 메모리 블록을 신속하게 찾는 적절한 방법 인 것 같습니다. 업데이트 : 내가 말한 블록과 정확히 같은 소리 en.wikipedia.org/wiki/Dynamic_memory_allocation # 버디 % 5Fblocks

4
@SteveJessop-Heapsort 장의 시작 부분에서 Cormen, Leiserson, Rivest, Stein-3rd edition (2009) 확인 중 '힙'이라는 용어는 원래 힙 정렬의 맥락에서 만들어졌지만 " Java 및 Lisp가 제공하는 프로그래밍 언어와 같은 가비지 수집 스토리지 우리의 힙 데이터 구조는 가비지 수집 스토리지가 아니며,이 책에서 힙을 참조 할 때마다 가비지 콜렉션의 측면이 아니라 데이터 구조를 의미합니다. ' CLRS-2 판은 또한 거의 동일한 문구 (Lisp가 힙을 사용했다는 표시는 없음)를 가지고 있습니다.
dr jimbob

64

그들은 같은 이름을 가지고 있지만 실제로는 개념적으로도 비슷하지 않습니다. 세탁물 바구니를 "옷 더미"라고하는 것과 같은 방식으로 메모리 힙을 힙이라고합니다. 이 이름은 마음대로 메모리를 할당하고 할당을 해제 할 수있는 다소 지저분한 장소를 나타내는 데 사용됩니다. 데이터 구조 (참조하는 Wikipedia 링크)는 매우 다릅니다.


8
그렇습니다. 저는 이것이 그가 그의 질문에 근거한 지점이라고 생각합니다. 그것들은 다릅니다. 그래서 왜 그들은 같은 것을 부릅니다-어떤 근본적인 관계가 있습니까?
Sean Owen

9
이 답변을 해석 한 방식은 "아니오, 근본적인 관계가 없습니다"이므로 질문에 대답합니다.
Laurence Gonsalves 4

앤드류가 대답하고 있습니다. 관계가 없습니다. 우연의 일치입니다. 메모리는 마치 "옷 더미"처럼 할당되므로 메모리 힙은 일반적인 사용법에 더 적합합니다. 그러나 데이터 구조는 더 큰 상상력을 요구했습니다. 그리고 이것은 훨씬 더 흥미로운 "왜"가됩니다. 이름은 사실 노드에서 키로 정렬되며 상위 노드 키는 항상 하위 노드보다> =입니다.
Alexandre Bell

6
그들은 분명히 관련이 없습니다. 그러나 "힙"이라고 부르는 문제는 "힙"대응 물인 "스택"도 실제 스택이라는 것입니다.
dan

1
힙 데이터 구조가 힙이라고 불리는 이유는 힙 속성을 만족시키기 때문입니다. 그러나 왜 힙 속성이 그렇게 불리는가? "top heavy"와 같은 이름이 훨씬 나을 것이기 때문에 나에게는 의미가 없습니다.
Thomas Eding

31

이름 충돌은 유감 스럽지만 그다지 신비로운 것은 아닙니다. 은 더미, 수집, 그룹 등을 의미하는 데 사용되는 작고 일반적인 단어입니다. 데이터 구조에 대한 단어 사용은 메모리 풀의 이름보다 이전 날짜입니다. 사실, 수영장 은 후자의 경우 훨씬 더 나은 선택이라고 생각합니다. 은 데이터 구조에 맞지만 메모리 풀에는 맞지 않는 수직 구조 (파일과 같은)를 의미합니다. 우리는 메모리 풀 힙을 계층 적이라고 생각하지 않지만, 데이터 구조의 기본 개념은 가장 큰 요소를 힙 (및 하위 힙)의 맨 위에 유지하는 것입니다.

데이터 구조 날짜는 60 년대 중반으로 거슬러 올라갑니다. 70 년대 초의 메모리 풀을 힙합니다. 힙 (메모리 풀을 의미)이라는 용어는 적어도 1971 년 Wijngaarden 이 Algol에 대한 토론에서 사용했습니다.

데이터 구조로 을 가장 먼저 사용 하는 것은
JWJ 1964 년 윌리엄스 에서 7 년 전에 발견 되었다. "알고리즘 232-힙 정렬", ACM 7 (6)의 통신 : 347-348


1
예. 그러나 힙은 장애를 의미하며 메모리 힙은 일반적으로 장애가 있습니다. 데이터 구조 힙이 매우 잘 정렬되어 있습니다. 다시 말하지만 힙의 공통 정의에 따라 다른 방식으로 동일한 불일치가 발생합니다.
jmucchiello

그것은 항상 IMO라는 이름을 설명하기에 충분 해야하는 스택 의 반대쪽으로 소개됩니다 .
reinierpost

1
우연의 일치는 아닙니다. 자유 목록은 이항 힙을 통해 우선 순위 대기열로 구현 될 수 있습니다.
Heath Hunnicutt

2
@jmucchiello : 로그 더미 ( 그림 참조 )가 잘 정렬되어 있고 나무를 닮았습니다. 이것은 학부 교과서 중 하나에 따른 데이터 구조 이름의 기원입니다.
gioele

6

실제로 메모리가 할당되는 방식 ( 버디 블록 참조 )에 대한 정보는 데이터 구조의 힙을 상기시킵니다.


Peter Zhang의 답변에 대한 나의 의견은 여기에서도 관련이 있습니다. 이진 버디 시스템은 이진 트리로 표현 될 수 있으며 각 노드의 "키"가 그 아래 의 메모리 일 때 유효한 최대 힙처럼 보입니다 (그러나이 값은 암시 적이며 절대 변경되지 않습니다). 내가 알 수있는 한 할당 및 해제 알고리즘은이 이진 트리에서 힙 작업을 사용하지 않습니다.
Eric Dubé

5

IMO 단지이 두 관련이없는 것들이 같은 이름을 갖는 것은 단지 사고 / 우연 일뿐입니다. 그와 같은 그래프그래프 .


두 그래프는 어떻게 든 관련 될 수 있습니다. 함수의 그래프를 다음과 같이 상상해보십시오. 튜플 도메인, 범위)는 꼭짓점이며 가장자리는 두 개의 꼭짓점을 연결합니다

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
이진 버디 시스템 (Linux에서 사용)에 대한 약간의 연구 끝에 데이터를 분할하는 방법으로 인해 이진 트리로 표시 될 수 있습니다. 총 메모리 측면에서 노드를 관찰하면이 이진 트리는 유효한 최대 힙처럼 보이지만 최대 힙에있는 것처럼이 이진 트리에 노드가 삽입되지 않습니다. 노드는 사용 가능한 메모리의 가장 작은 리프에 직접 삽입됩니다> = 요청 된 크기 1 2 3
Eric Dubé

1

구어체 용어 스택 메모리 및 힙 메모리는 C ++ 표준에서 사용되지 않습니다. 표준은 정적 저장소, 스레드 저장소, 자동 저장소 및 동적 저장소를 사용합니다.

자세한 내용은 표준의 스토리지 내구성 섹션 에서 확인할 수 있습니다 .

따라서 언어 및 표준 라이브러리 관점에서 혼동이 없습니다.


1

Q. 힙이란 무엇입니까? A. 힙은 서로 위에 놓인 객체 모음입니다.

귀하의 질문에 대한 답변 : 메모리 힙과 이진 힙 모두 알고있는 것과 동일한 개념을 사용합니다. 데이터는 프로그램에 쓰여진 순서와 동일한 순서로 메모리에 힙 형태로 저장되는 반면 바이너리 힙은 힙 형태로 데이터를 순서대로 저장하는 것과 동일한 개념을 따르는 데이터 구조입니다 (데이터 맨 위 다른 것). 의견 섹션에서 어떻게 생각하는지 알려주세요.


-2

아마도 첫 번째 구현 된 메모리 힙이 힙 구조로 관리 되었습니까?


8
그 가설은 전혀 명백해 보이지 않습니다. 힙 (데이터 구조)은 힙 (동적 메모리 영역)을 유지하는 데 어떻게 유용합니까?
Keith Randall

7
-1. 나는 단지 추측 만하는 것이 아니라 증거가있는 권위있는 진술을 선호한다.
Rob Kennedy

거의 없습니다. 힙 (데이터 구조)을 사용하여 힙 (사용 가능한 메모리 풀)을 관리 할만한 이유가없는 것 같습니다.
제이슨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.