왜 대부분의 언어가 max-heap 구현 대신 min-heap을 제공합니까?


19

방금 무언가를 발견했고 그 이유가 있는지 궁금합니다. C ++ (std :: priority_queue는 최대 힙임)을 제외하고는 최대 힙을 제공하는 다른 언어를 모릅니다.

Python의 heapq 모듈은 목록 위에 이진 최소 힙을 구현합니다.

Java의 라이브러리에는 최소 우선 순위 큐를 구현하는 PriorityQueue 클래스가 포함되어 있습니다.

Go 라이브러리에는 호환 가능한 데이터 구조 위에 최소 힙을 구현하는 컨테이너 / 힙 모듈이 포함되어 있습니다.

Apple의 Core Foundation 프레임 워크에는 최소 힙을 구현하는 CFBinaryHeap 구조가 포함되어 있습니다.

max-heap이 min-heap보다 직관적이라는 것을 알았으며 기술적으로 구현 차이는 비교 연산자를 변경하는 문제 일 뿐이라고 생각합니다. 진짜 이유가 있습니까? 대부분의 응용 프로그램에는 최대 힙 대신 최소 시간이 필요합니까? 미리 감사드립니다


그들은 정확히 같은 것이 아닙니까? 나는 논쟁의 여지가있는 것으로 결심합니다.

2
며칠 전 C ++에서 최소 힙이 필요했으며 priority_queue의 기본값이 최대 힙으로 약간 화가났습니다. 이미 연산자 <가있는 사용자 정의 클래스에서 operator>를 정의해야했습니다. 그래프로 작업 할 때는 일반적으로 가장 짧은 가장자리의 우선 순위를 지정해야하므로 최소 힙이 필요합니다.
LaC

2
@LaC : 사용할 수 있습니다 std::not2(std::less<T>()).

답변:


9

다른 사람들이 관찰했듯이 힙이 비교기를 허용하면 하나의 동작 또는 다른 동작을 얻는 것이 어렵지 않습니다. 그러나 Google 코드에 대한 빠른 설명은 두 번의 애플리케이션이 반복해서 나타나기 때문에 실제 코드에서 최소 힙이 훨씬 더 널리 퍼져 있음을 시사합니다.

  • Dijkstra / A * / 많은 다른 최단 경로 알고리즘 (부분 경로가 길어지기 때문에).

  • 이벤트 시뮬레이션 (시간이 지남에 따라).

또한 기본 정렬은 작은 항목에서 큰 항목을 반환하기 때문에 기본 힙도 마찬가지라고 주장합니다.


2
나는 보통 C ++로 프로그래밍하고 반대로 궁금합니다. 왜 C ++이 최소 힙을 구현하지 않습니까? 말했듯이 대부분의 알고리즘은 최소 힙을 사용합니다.
Martín Fixman

5

그것은 단지 맛의 문제입니다. 나는 특별한 이유가 없을 것이라고 생각합니다. 어떤 사람들은 최적화 문제를 비용을 최소화하는 것으로 표현하고 다른 사람들은 이익 극대화를 말하는 것과 같습니다.


3

내가 아는 대부분의 언어는 매개 변수를 전달하여 최소 또는 최대 힙인지 결정합니다. 따라서 기본값은 다소 임의적입니다. 대부분의 언어에서 기본 연산자가 무엇인지 정의하는 것이 일관성의 문제라고 생각합니다. stl의 C ++의 경우 기본값은 std::less최소 힙입니다.

std::less어디에서나 기본적 으로 사용 한다는 일관성은 모든 종류의 데이터 구조를 사용할 때이 비교 만 구현하면되고 나중에 클래스를 설계 할 때 사용할 데이터 구조를 결정할 필요가 없음을 의미합니다. 비교보다 더 큰 것이 표준이라는 유일한 차이점은 다른 언어에서도 동일하다고 생각합니다.


3
나는 그런 연결이 없다고 생각합니다. <또는>를 사용하여 힙을 구현할 수 있습니다. 실제로 std :: less는 STL의 기본값이지만 최소 힙 대신 최대 힙을 구현합니다.
LaC

1

기본적으로 인덱스 값은 임의의 숫자입니다. 숫자가 우선 순위를 나타내고 더 큰 숫자가 우선 순위가 높다고 생각하면 최대 힙이 의미가 있습니다. 그러나 숫자가 예를 들어 개념적 빵집 숫자 ( "숫자 가져 오기")를 나타내는 경우 최소 힙이 더 의미가 있습니다.

인덱스의 1의 보수를 취하여 항상 하나에서 다른 것으로 변환 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.