아무도 내가 Dijkstra 알고리즘의 J2ME 구현을 빠르게 할 수 있습니까? 나는 두 개의 고리를 가지고 있는데 하나는 다른 고리 안에있다. 이가장 빠른 Dijkstra 알고리즘에 대한 j2ME
while(for each item in Q)
{
//...do something.
//the following loop is to find the minimum
for(all un-visited nodes in Q)
{
//.. do something to get min.
}
}
같이 내가 그들을 연결하는 거의 23000 노드와 50000 가장자리가 ... 내부 루프는 아래에 언급 된 모든 개선 후 169,330,131 배의 평균을 실행합니다. 이것은 내 w910i 모바일에서 5 분, 에뮬레이터에서 몇 분 이상 걸립니다. 이것은 나를 위해 너무 많이 보인다. 개선을위한 제안? 다음과 같은 개선 사항이 이미 구현되었습니다.
- 벡터 대신 배열을 사용합니다.
- 내부 루프가 방문한 노드를 고려하지 않도록하십시오. 내 모든 방문 노드는 배열의 끝에 있으며 I 노드는 개수를 알고 있습니다. 그래서 나는 그것들을 쉽게 건너 뛸 수 있습니다.
나는이 알고리즘을 언급했다. 나는 더 간단한 알고리즘을 다른 곳에서 발견했다. Wikipedia에서 구현해야한다면 두 개의 내부 루프가 있다는 점에 유의하십시오. Q가 비어 있지 않은 경우 : // 외부 루프. u : 가장 작은 dist [];가있는 Q의 꼭짓점 // 첫 번째 내부 루프. .... (u : // 두 번째 내부 루프의 각 이웃 노드). 두 번째 내부 루프가 더 작습니다. 각 노드에 대해 최대 5 개의 에지가 있으므로 최대 4-5 개까지 실행할 수 있습니다. 에지가 2 개 이상인 노드의 수는 총 23000 개의 노드 중 1000 개입니다. 따라서 내부 루프의 실행 시간은 무시해도 좋습니다. – dmantamp
실행 시간에 관한 위키 백과의 섹션을 읽으셨습니까? 인접 목록과 바이너리 힙 또는 다른 구조를 우선 순위 큐로 사용하는 것이 좋습니다. 이렇게하면 첫 번째 내부 루프가 크게 제거됩니다. –
자세히 살펴보기, Deekshit - Q에 우선 순위 큐 (힙)를 사용하는 경우 Q에서 가장 작은 요소는 O (1)이며 노드와 모서리 수와 함께 전체 런타임 O (n + m)을 만듭니다. –