Prim 메서드를 사용하여 MST를 해결하는 코드를 작성했습니다. 나는 (우선 순위 큐를 사용하는) 이런 종류의 구현은 O (E + VlogV) = O (VlogV)를 가져야한다는 것을 읽었다. 여기서 E는 가장자리의 수와 V 수의 가장자리이지만, 내 코드를 보면 단순히 보이지 않는다. 그런 식으로. 누군가 나를 위해 이것을 정리해 주면 고맙겠습니다. 나에게최소 스패닝 트리 실행 시간? (Prim 메서드)
실행 시간이 보인다 :
우리가 O 걸리는 Q에서 요소를 추출하는 루프 내부 (우리가 모든 가장자리를 통과 할 때까지) 루프는 O (E) 시간을 소요하면서 (logE) 시간. 그리고 두 번째 내부 루프는 O (V) 시간이 걸립니다
내 결론이 있다는 것 (이 루프 매번 실행 해달라고하지만 우리가 모든 정점을 추가 할 필요가 있기 때문에이 V 번 실행됩니다 분명하다) 실행 시간은 O (E (logE + V)) = O (E * V)입니다.
이 내 코드입니다 :
#define p_int pair < int, int >
int N, M; //N - nmb of vertices, M - nmb of edges
int graph[100][100] = { 0 }; //adj. matrix
bool in_tree[100] = { false }; //if a node if in the mst
priority_queue< p_int, vector <p_int>, greater <p_int> > Q;
/*
keeps track of what is the smallest edge connecting a node in the mst tree and
a node outside the tree. First part of pair is the weight of the edge and the
second is the node. We dont remember the parent node beaceuse we dont need it :-)
*/
int mst_prim()
{
Q.push(make_pair(0, 0));
int nconnected = 0;
int mst_cost = 0;
while(nconnected < N)
{
p_int node = Q.top(); Q.pop();
if(in_tree[ node.second ] == false)
{
mst_cost += node.first;
in_tree[ node.second ] = true;
for(int i = 0; i < N; ++i)
if(graph[ node.second ][i] > 0 && in_tree[i]== false)
Q.push(make_pair(graph[ node.second ][i], i));
nconnected++;
}
}
return mst_cost;
}
나는 Kruskals 알고리즘을 알고 있지만 이것 역시 이해하고 싶었다 :-). Prim에 인접리스트를 사용하면 다음과 같은 결과를 얻습니다. 모든 에지에서 while + for 루프가 반복되어 힙에 삽입됩니다. 이것은 E * log (E) 여야합니다. 이것이 Fibbonaci 힙이 아닌 힙을 사용하여이 접근법으로 얻을 수있는 최상의 복잡성입니까? – synepis
예, 두 노드에서 최대 두 번씩 각 에지를 확인하면 대기열에 최대 E 에지가 있으므로 O (E 로그 E)가됩니다. 그러나 O() 표기법에서는 상수 요소가 관련이 없으므로 그런 식으로 쓰지는 않습니다. 따라서 O (E log E) = O (E log (V^2)) = O (E * 2 log V) = O – supo
위의 설명은 내가 원했던 대답입니다. 감사합니다. 지금은 이해합니다 :-) – synepis