2009-11-20 6 views
0

Je participe au concours de programmation d'Al Zimmermann.Problèmes de vitesse les plus importants

http://www.azspcs.net/Contest/SonOfDarts

J'ai écrit un algorithme récursif, mais il prend beaucoup de temps à courir. Je me demandais quelles sont les choses les plus importantes à considérer sur la vitesse des algorithmes récursifs. J'ai rendu la plupart des propriétés globales, donc elles ne sont pas allouées à chaque fois que l'étape des récursions. Y at-il autre chose que je puisse faire pour accélérer mon programme sans changer mon algorithme?

+0

Combien de récursions votre algorithme prend-il? Peut-être que vous devriez résoudre le problème avec un algorithme itératif à la place. – Gumbo

Répondre

0

Recusrsion est toujours plus lente que itérative. En raison de pile/tas/mémoire aloocation effectue plus lentement que la plupart. Il est toujours plus facile de mettre en œuvre une fonction de recusive dans des algorithmes complexes, écrou si possible, itératif sera plus rapide.

2

Cela dépend des détails de votre algorithme. Si c'est tail recursive, vous pouvez le transformer en un algorithme itératif assez facilement.

0

Quelle langue utilisez-vous pour écrire votre programme? Certaines langues comme Haskell sont faites sur mesure pour les algorithmes récursifs alors que d'autres comme Python ne le sont pas.

Combien de temps est passé dans chaque appel de fonction par rapport au nombre d'appels récursifs hors de la fonction? Trop de code en cours d'exécution dans la fonction elle-même conduirait certainement à une perte de performance.

Les variables sur la pile sont généralement beaucoup plus rapides que les variables globales. Envisagez de les faire passer de la fonction à la fonction plutôt que de les mettre globalement.

Malheureusement, il n'y a pas assez de contexte dans la question pour fournir une meilleure réponse.

Les algorithmes récursifs peuvent également être conçus de manière à ce qu'ils soient récursifs. Dans une telle situation, les compilateurs prennent en charge l'optimisation de la récurrence de la queue, ce qui conduit à un code beaucoup plus rapide.

0

Il y a probablement beaucoup de sous-questions qui se chevauchent dans votre algorithme et vous n'avez pas sauvegardé les résultats intermédiaires pour chaque sous-question. Si vous le faites, votre programme devrait être assez rapide.

EDIT: Je viens de donner la question dart une pensée et je me sentais prendre la récursion ne peut pas être une bonne approche de la solution. Je l'ai fait des recherches dans le serveur SQL avec l'échantillon donné par la question:

create table regions (score int) 
insert into regions values (0) 
insert into regions values (1) 
insert into regions values (2) 
insert into regions values (4) 
insert into regions values (7) 
insert into regions values (11) 

create table results (score int) 

insert into results 
select distinct (s1.score+s2.score+s3.score) 
from regions s1, regions s2, regions s3 

select * from results 

Le script révèle clairement une solution qui peut être facilement mis en œuvre dans un style de programmation impératif, sans prendre aucune approche récursive.

+0

Ce serait 1 digne si vous incluez (ou au moins lié à) l'exemple classique de série de Fibonacci. –

0

Ne supposez pas que le problème provient de la récursivité ou de toute autre chose a priori. Il suffit de faire this, où vous trouver ce qui est le plus grand, le réparer, et passer à la suivante. Je ne dis pas que cela ne va pas s'avérer que la récursion est la grosse affaire à un moment donné. C'est juste que les chances sont très bonnes, il y a de plus gros problèmes que vous pouvez résoudre en premier.

0

Si vous pouvez soumettre un code compilé pour les plates-formes Intel, alors: La collocation du contenu de la mémoire pour favoriser le contenu de la mémoire cache de l'UC sur les meilleurs algorithmes classiques dans n'importe quel domaine. Assurez-vous d'utiliser la sortie de l'analyseur de performance Intel VTune fournie à vos options de l'éditeur de liens pour que les corps des fonctions connexes restent proches dans la mémoire du code.

Questions connexes