Quelqu'un peut-il m'aider à accélérer l'implémentation j2ME de l'algorithme de Dijkstra? J'ai deux boucles, l'une dans l'autre. Comme cetteL'algorithme de Dijkstra le plus rapide pour 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.
}
}
J'ai presque 23000 noeuds et arêtes les reliant 50000 ... La boucle interne exécute en moyenne 169330131 fois après toutes les améliorations mentionnées ci-dessous. Cela prend 5 minutes pour compléter sur mon mobile w910i et plus de minutes sur mon émulateur. Cela semble trop pour moi. Des suggestions d'amélioration? J'ai les améliorations suivantes déjà implémentées.
- Utilisation d'un tableau à la place du vecteur.
- Assurez-vous que la boucle interne ne prend pas en compte les nœuds visités. Tous mes nœuds visités sont à la fin du tableau et le nœud I connaît le nombre. Donc, je peux facilement les ignorer complètement.
J'ai référé cet algorithme. J'ai trouvé un algorithme plus simple à un autre endroit. S'il vous plaît noter que si je devais implémenter celui dans Wikipedia, il y a deux boucles internes. alors que Q n'est pas vide: // Boucle extérieure. u: = sommet dans Q avec le plus petit dist []; // première boucle interne. .... pour chaque voisin v de: // Deuxième boucle interne. La deuxième boucle interne est plus petite. Il peut exécuter un maximum de 4-5 car il y a au plus 5 arêtes pour chaque nœud. Le nombre de nœuds ayant plus de 2 arêtes est de 1000 sur 23 000 nœuds au total. Ainsi, le temps d'exécution de la boucle interne est négligeable. – dmantamp
Avez-vous lu la section dans le wikipedia sur le temps de fonctionnement? Il suggère d'utiliser des listes d'adjacence et un tas binaire ou une autre structure comme une file d'attente prioritaire - ceci supprimera largement cette première boucle interne –
Regardez de plus près, Deekshit - si vous utilisez une file d'attente prioritaire (un tas) pour Q, trouver le Le plus petit élément de Q est O (1), ce qui fait que le temps d'exécution total O (n + m) est égal au nombre de nœuds et d'arêtes. –