힙을 만드는 데 사용할 벡터가 있습니다. 나는 C++ make_heap 함수를 사용해야하는지 내 벡터를 우선 순위 대기열에 넣어야하는지 잘 모르겠다. 성능 측면에서 어느 것이 더 낫습니까? 언제 다른 제품을 사용해야합니까?make_heap과 priority_queue는 언제 사용해야합니까?
답변
성능의 차이는 없습니다. std::priority_queue
은 컨테이너와 매우 동일한 힙 관련 함수 호출을 클래스로 래핑하는 어댑터 클래스입니다. std::priority_queue
의 명세에는 공개적으로 그 내용이 나와 있습니다.
노출 된 std::vector
에서 힙 기반 우선 순위 큐를 생성하면 (힙 관련 함수를 직접 호출하여) 외부 액세스가 가능할 수 있으므로 힙/큐의 무결성이 손상 될 수 있습니다. std::priority_queue
은 "표준"최소값에 대한 액세스를 제한하는 장벽 역할을합니다. push()
, pop()
, top()
등. 자체 규율 시행 조치로 볼 수 있습니다.
또한 큐 인터페이스를 "표준"작업 세트에 적용함으로써 동일한 외부 사양을 준수하는 다른 클래스 기반 우선 순위 큐 구현과 동일하게 상호 교환 할 수 있습니다.
priority_queue는 (적어도 정상적으로) 힙으로 구현됩니다. 따라서, 진짜 질문은 priority_queue가 필요한 것을 제공하는지 여부입니다. make_heap을 사용할 때 여전히 모든 요소에 액세스 할 수 있습니다. priority_queue를 사용하면 요소에 매우 제한된 액세스 권한을 부여하는 작업이 거의 없습니다 (기본적으로 항목을 삽입하고 대기열의 헤드에서 항목을 제거함).
priority_queue
은 (는) 컨테이너가 아닙니다. 특정 기본 컨테이너를 사용하는 컨테이너 어댑터입니다. vector
또는 deque
이며 데이터 작업을위한 특정 메소드 세트를 제공합니다. 또한 구현은 *_heap
알고리즘을 사용합니다.
예를 들어 vector
에 새 값을 입력 할 때마다 push_heap
을 호출하여 힙으로 간주되는 범위를 확장해야합니다. priority_queue
을 사용하지 않으면 vector
의 절반을 힙 (std::make_heap(v.begin(), v.begin() + (v.size()/2))
)으로 간주 할 수 있으며 나머지 절반은 그대로 유지할 수 있습니다. 당신이 그것을에 push
를 호출 할 때
무엇 priority_queue
을 수행합니다 그것은 기본 컨테이너의 뒷면에 새로운 요소를 밀어 (단지 가장 큰 것으로 첫 번째 요소를 중요) 우선 순위 힙 속성을 유지하기 위해 push_heap
를 호출합니다.
성능 문제보다는 솔루션 디자인과 특정 요구 사항을 고려하는 것이 좋습니다.
벡터를 수정하고 싶지 않으면 별도의 벡터를 생성하므로 우선 순위 대기열을 사용해야합니다 (추가 공간 필요). 또한 구현하기 쉽습니다. 예를 들어, 요소를 팝핑하는 동안 make_heap을 사용할 때는 우선 pop_heap과 pop_back .. 두 가지 명령을 사용해야하지만 우선 순위 큐의 경우에는 하나의 명령으로 수행 할 수 있습니다. 마찬가지로 요소를 힙으로 밀어 넣는 동안.
우선 순위 큐는 컨테이너가 아니며 make_heap 작업에서 사용하는 것과 동일한 힙 작업을 사용하는 벡터 또는 deque로 기본 컨테이너를 사용하기 때문에 둘 다 성능이 같습니다. 따라서 요구 사항에 따라 하나를 사용해야합니다 .
- 1. div는 언제 사용해야합니까? 프레임은 언제 사용해야합니까? 다른 형식의 동적 콘텐츠는 언제 사용해야합니까?
- 2. Import-Package는 언제 사용해야합니까? Require-Bundle은 언제 사용해야합니까?
- 3. 우리는 ANTLR을 언제 사용해야합니까
- 4. 언제 _aligned_malloc()을 사용해야합니까?
- 5. 언제 FSharpFunc.Adapt를 사용해야합니까?
- 6. cfthread는 언제 사용해야합니까?
- 7. 안드로이드에서 언제 루퍼를 사용해야합니까?
- 8. 언제 OSGi EventAdmin을 사용해야합니까?
- 9. 인터페이스 작성기는 언제 사용해야합니까?
- 10. 언제 MPI_Barrier()를 사용해야합니까?
- 11. 레일즈 : 언제 자기를 사용해야합니까?
- 12. 언제 jQuery에서 마침표를 사용해야합니까?
- 13. 언제 == 비교기 ===를 사용해야합니까?
- 14. 언제 모두 작업을 사용해야합니까?
- 15. 언제 ConcurrentSkipListMap을 사용해야합니까?
- 16. 언제 "new"를 사용해야합니까?
- 17. 의존성 주입은 언제 사용해야합니까?
- 18. 언제 $ (document) .ready를 사용해야합니까?
- 19. Clojure에서 언제 deftype을 사용해야합니까?
- 20. Flash는 언제 사용해야합니까?
- 21. 데이터베이스 동의어는 언제 사용해야합니까?
- 22. ActiveRecord 트랜잭션은 언제 사용해야합니까?
- 23. 언제 GC.SuppressFinalize()를 사용해야합니까?
- 24. 약한 참조는 언제 사용해야합니까?
- 25. 언제 EF4에서 POCO를 사용해야합니까?
- 26. 언제 개체 데이터베이스를 사용해야합니까?
- 27. 메모리 뷰는 언제 사용해야합니까?
- 28. 언제 html5 sessionStorage를 사용해야합니까?
- 29. Joomla에서는 언제 setUserState를 사용해야합니까?
- 30. 원자력 발전소는 언제 사용해야합니까?
힙을 원하면 힙으로 만들어야합니다. 우선 순위 대기열은 모든 힙이 아닙니다. 힙은 더 잘 수행하는 경향이 있습니다. – Wug