둘 다 Prim의 알고리즘에 필요한 최소값을 검색하도록하고, 값을 업데이트하기 위해 키를 제거하고 다시 삽입하도록합니다. 이 예제뿐만 아니라 일반적으로 말하면 다른 것을 사용하는 이점이 있습니까?PriorityQueue보다 TreeMap을 사용해야하는 경우는 언제입니까?
답변
일반적으로 말하면 힙을 사용하여 최소 요소 만 추적하는 것이 적습니다.
트리가 더 체계적이며 조직을 유지 관리하기 위해 더 많은 계산이 필요합니다. 그러나 키에 액세스해야하고 최소값 일 필요가없는 경우 힙으로 충분하지 않으며 트리의 추가 오버 헤드가 정당화됩니다.
"힙을 사용하여 최소 요소 만 추적하는 것이 적습니다"- 특히 PriorityQueue ** constant ** 시간에 head 요소에서 * peek *을 사용할 수 있습니다. TreeMap에는 O (logn)이 필요합니다. 그들은 실제로 그 원소를 끄는 언제나 O (logn)을 필요로합니다. – JMess
우선 순위 대기열을 구현하는 방법에 따라 다릅니다. Cormen의 2 집 ed에 따르면 가장 빠른 결과는 Fibonacci Heap입니다.
차이점 중 하나는 정상 힙 기반의 PriorityQueue (Oracle의 경우)에서는 선형 O (N)이지만 TreeSet/Map에서는 O (log (N)) 인 경우 remove (Object) 및 contains
많은 수의 요소가 있고 remove (Object) 또는 contains (Object)를 많이 수행하면 TreeSet/Map이 빠를 수 있습니다.
우선 순위 큐에서 Erickson과 완전히 동의한다는 것은 최소/최대 요소 만 제공한다는 것입니다.
또한 우선 순위 큐는 데이터의 전체 순서를 유지하는 데 덜 강력하기 때문에 일부 특수한 경우에 이점이 있습니다. 가장 큰 M
요소를 N
의 배열로 추적하려는 경우 시간 복잡도는 O(N*LogM)
이고 공간 복잡도는 O(M)
이됩니다. 그러나지도에서 수행하는 경우 시간 복잡도는 O(N*logN)
이고 공백은 O(N)
입니다.
TreeMap의 질서 모든 요소를 유지 : 우리가 예를 M
에 대한 몇 가지 경우에 우선 순위 큐를 사용해야하면서는 약 엄지의 10
좋은 노트이지만 TreeMap과 함께'O (m)'공간에 대해서도이 동작을 모방 할 수 있습니다. 특정 크기에 도달하면 가장 큰 요소를 수동으로 제거하면됩니다. – A1m
규칙 같은 단지 상수 아주 기본입니다. (그래서 직관적으로, 그것을 구축하는 데 시간이 걸립니다)
만 최소 또는 최대 격리. 덜 비싸지 만 덜 강력합니다.
두 가지 차이점이 있습니다 (이 질문은이 질문의 중복으로 간주되므로 Difference between PriorityQueue and TreeSet in Java?과 더 관련이 있습니다).
(1) PriorityQueue는 TreeSet에서 dup을 가질 수없는 곳에서 중복을 가질 수 있습니다. 따라서 Treeset에서 비교 자 (comparator)가 2 개의 원소를 같은 것으로 간주하면 TreeSet은 그 2 개의 원소 중 하나만 유지하고 다른 하나는 버립니다.
(2) TreeSet 반복자는 정렬 된 순서로 컬렉션을 트래버스하지만, PriorityQueue 반복자는 정렬 된 순서로 트래버스하지 않습니다. PriorityQueue의 경우 정렬 된 순서로 항목을 가져 오려면 remove()를 반복적으로 호출하여 대기열을 삭제해야합니다.
이러한 데이터 구조에 대한 Java의 구현에 대한 논의가 제한적이라고 가정합니다.
TreeSet처럼 제거를위한 log (N) 시간을 제공하는 표준 데이터 구조가 있는가? (equals 메소드로부터) equal 요소를 허용 하는가? – beemaster
모두는 당신이 달성하기를 원하는 것에 달려 있습니다. 다른 것을 선택하기 전에 고려해야 할 요점은 다음과 같습니다.
- PriorityQueue TreeMap이 중복되지 않도록 (즉, 동일한 우선 순위로) 허용합니다.
- TreeMap의 노드에있는 동안
- PriorityQueue 인은 배열을 기반으로 (이 레드 블랙 트리에 기반으로) TreeMap의의는 O (logn) 인 반면 PriorityQueue 인의 복잡성, O (N) (때 크기를 증가)입니다 서로 링크되어 있으므로 TreeMap이 O (logn) 시간이 소요되는 동안 PriorityQueue 메소드에 O (n) 시간이 소요됩니다.
흥미 롭다. 유일한 답은 TreeMap의 큰 불이익이다. TreeMap의 공간 복잡성에 대한 근원이 있습니까? – A1m
- 1. 강력한 형식의보기를 사용해야하는 경우는 언제입니까?
- 2. For 루프 대신 Map을 사용해야하는 경우는 언제입니까?
- 3. 그래픽에서 dispose()를 사용해야하는 경우는 언제입니까?
- 4. 십진수 대신 double을 사용해야하는 경우는 언제입니까?
- 5. WXPython을 사용하여 클래스를 사용해야하는 경우는 언제입니까?
- 6. Windows 스레드 : InterlockedExchangeAdd()를 사용해야하는 경우는 언제입니까?
- 7. 복합 형을 반환하는 대신 'out` 매개 변수를 사용해야하는 경우는 언제입니까?
- 8. MySQL에서 복수 OR 연산자 대신 IN 연산자를 사용해야하는 경우는 언제입니까?
- 9. iPhone SDK에서 @property 및 @synthesize를 사용해야하는 경우는 언제입니까?
- 10. IEnumerable <T>을 통해 IEnumerable을 사용해야하는 경우는 언제입니까?
- 11. 다른 컬렉션 대신 스칼라의 Array를 사용해야하는 경우는 언제입니까?
- 12. 직접 던지는 대신 ThrowHelper 메서드를 사용해야하는 경우는 언제입니까?
- 13. PHP에서 변수 변수를 사용하는 경우는 언제입니까?
- 14. ivars를 포인터로 정의하는 경우는 언제입니까?
- 15. Assembly.CodeBase : 파일 URI가없는 경우는 언제입니까?
- 16. web.config가 너무 큰 경우는 언제입니까?
- 17. 쿼리가 너무 큰 경우는 언제입니까?
- 18. 키 - 값 데이터 저장소와 전통적인 관계형 데이터베이스를 사용해야하는 경우는?
- 19. Objective-C에서 포인터가 사용되지 않는 경우는 언제입니까?
- 20. Windows 서비스를 통해 webservice를 사용하는 경우는 언제입니까?
- 21. 역방향 검색이 앞으로보다 나은 경우는 언제입니까?
- 22. Java 메소드 선언에서 throws를 사용하는 경우는 언제입니까?
- 23. 스칼라의 메서드에 반환 형식이 필요한 경우는 언제입니까?
- 24. Javascript를 사용하는 것이 바람직한 경우는 언제입니까?
- 25. node.js에서 TCP와 HTTP를 사용하는 경우는 언제입니까?
- 26. CSS 스프라이트가 너무 큰 경우는 언제입니까?
- 27. 사용자 입력 문자열을 다듬을 수없는 경우는 언제입니까?
- 28. while 루프에서 for 루프를 사용하는 경우는 언제입니까?
- 29. Entity Framework 4에서 ApplyOriginalValues를 사용하는 경우는 언제입니까?
- 30. 상속 대신 위임을 사용하는 경우는 언제입니까?
'TreeMap'은 ** 값을 업데이트하기 위해 키를 제거하고 다시 삽입해야한다는 것을 유의하십시오. 'put (key, value)'호출은 키 값 (또는 "equal"키 값)이 이미 맵에 있으면 값을 갱신합니다. –
흠, 그렇다면 우선 순위 큐에서 내가 할 수 있다고 생각하는 반면, 같은 키로 값을 가질 수 없다는 뜻입니다. – iceburn
사용자 정의 비교기를 사용하여이를 해결하고 객체에서 키를 래핑 할 수 있습니다 (예 : 에지 ID로 연결을 해결할 수 있습니다). –