Dans les algorithmes, j'ai principalement été autodidacte et cela fait très bien été bien. Cependant, j'ai du mal à saisir des algorithns graphiques. Je cherche une sorte de référence qui a des concepts et du code réel pour que je puisse non seulement apprendre la théorie (ce que je fais d'accord avec), mais aussi avoir une idée de la manière dont les graphiques sont représentés et manipulés dans la pratique (ce que j'ai habituellement un temps plus difficile à saisir). Peut alors livrer? Tout de livres, aux liens, aux projets existants serait formidable tant qu'ils ont à la fois le concept et la mise en œuvre. p>
C'est une langue agnostique, mais je suis le plus familier avec Python et n'avez pas beaucoup d'expérience avec la FP. p>
5 Réponses :
steve yegge dit Ce est un domaine formidable Réservez sur des algorithmes qui utilisent de manière approfondie des graphiques. P>
J'ai beaucoup appris sur les graphiques du livre lié ci-dessous ... c'est l'un de mes livres préférés: p>
Un cours de Combinatorics
par J. H. Van Lint, R. M. Wilson
Cambridge University Press
ISBN 0 521 00601 5
em> p> blockQuote>
Le site suivant dispose également de certaines animations vraiment cool qui pourraient vous aider à comprendre les algorithmes de graphes: CS .sunysb.edu / ~ Skiena / Combinatorica / Animations
Je n'ai jamais jamais examiné la combinatoire, mon intérêt est donc très culminant. Cependant, il ne semble pas contenir de code correct?
JLV: C'est correct, il n'y a aucun code dans ce livre. Cependant, c'est un excellent livre pour apprendre les mathématiques derrière des structures graphiques, qui peuvent ensuite être appliquées à des algorithmes. Je n'aurais pas mentionné cela, mais ce n'est qu'un si bon livre; Je ne pouvais pas
Mitch: Merci! Heureux que ce soit utile.
Les deux sont très bons: p>
Tadm était juste mentionné (merci encore!) Mais je vais vérifier le second à coup sûr.
Je suggérerais que lorsque vous étudiez des algorithmes, alors ne pensez pas à le coder. Les algorithmes sont totalement mathématiques et vous devez avoir la même attitude envers eux. Lorsque vous étudiez quelque chose comme l'algorithme de la clé de graphique, alors ne pensez pas à la coder comment les représenter. D'abord, appréciez pourquoi l'algorithme est important et non trivial. Ensuite, essayez des solutions très triviales et comparez leur complexité. Voyez ensuite à quel point des solutions optimales ressemblent et essaient de dériver leurs propriétés. Utilisez un papier et un stylo et non des IDE, essayez de dériver et de prouver des lemmas et ainsi de suite. Enfin, voyez enfin comment vous pouvez écrire un pseudocode pour résoudre le problème. Si vous faites ces éléments, vous développerez une relation intime avec les algorithmes, puis vous trouverez qu'il est beaucoup plus facile de les résoudre puisque vous ne pensez pas tout en codant pourquoi je le fais. P>
Malheureusement, en raison de fortes demandes de programmeur, le programmeur des jours ne sont pas des mathématiciens et ils sont confrontés à des problèmes pour résoudre de nouveaux problèmes. Le programmeur des jours antérieurs tels que Don Knuth, McArthy étaient des mathématiciens et de bons chercheurs. Par conséquent, le programmeur est maintenant un mot relativement bon marché par rapport aux informaticiens. P>
OTOH, j'ai personnellement trouvé la mise en œuvre d'un algorithme (sans voir de pseudocode avant) et en utilisant cette mise en œuvre une bonne vérification que j'ai parfaitement compris comment l'algorithme fonctionne.
@MarkusUnterWAditzer - Vrai, c'est un excellent exercice. Notez à ceux qui le font cependant, il est facile de s'enliser dans une solution médiocre. Si vous avez atteint un point où il semble que vous ne le faites pas correctement, cela vaut votre temps pour regarder pseudocode.
Algorithme Bellman-Ford Strong>:
Chemin le plus court de la source à tous les autres nœuds dans un graphique dirigé pondéré, même avec le poids de bord (non cycle). plus lent mais polyvalent que Dijsktra.
Complexité: O (| V |. | e |) strong> p>
bfs: strong> Trouvez le chemin d'un sommet donné à d'autres nœuds dans un graphique non dirigé non pondéré.
Complexité: O (| V | + | e |) strong>. Il est plus rapide lorsque vous connaissez les sommets à venir et utilisez la structure de données appropriée, c'est-à-dire une structure de données appropriée I.E FIFO QUE pour déterminer quel sommet déjà traité que la complexité peut être réduit à O (| v |) p> p> P>
dfs: strong> Trouvez le chemin le plus court de la source vers d'autres nœuds. dans l'arbre et aussi dans le graphique. Le graphique peut contenir du cycle, ce qui signifie qu'un nœud pourrait être visité à nouveau et à nouveau. Nous pouvons donc utiliser une matrice booléenne pour suivre une trace des nœuds visités. sinon algorithme ne cessera pas.
Plus sur il paraître plus profondément plus profond et aller aussi loin à la fin de la branche dans l'arbre.
Complexité: O (| V | + | e |) strong>. et Algorithme de Johnson: Strong> Trouver tous les paires Chemin le plus court dans un graphe de race pondéré dirigé lorsque le poids est + Eve, -Eve mais pas - cycle.
Il utilise d'abord l'algorithme Belman-Ford pour calculer le graphe transformé du graphique d'origine. Il supprime les bords de poids. Puis Dijkstra est appliqué pour trouver des chemins.
Complexité: O (V ^ 2 LOG V + VE) STROR> P>
Algorithme de Krushkal: strong> Pour trouver du MST où il trouve un bord du moindre poids possible qui relie deux arbres dans la forêt sur un graphique pondéré non dirigé.
C'est un algorithme gourmand.
Il trouve également une forêt minimale étendue.
Complexité: O (E Log V) Strong> P>
Algorithme de PRIM: strong> Il trouve un sous-ensemble d'arêtes formant un arbre sur un graphique non dirigé et pondéré. mais ne peut pas trouver la forêt de Mme comme l'algorithme de Krushkal. P>
Algorithme de Brouvka: Strong> Un problème avec cet algorithme est que les poids doivent être uniques dans le graphique. Il trouve la MST en examinant chaque sommet, puis en mettant avec un poids plus petit. Cet algorithme est de nature parallèle mais pas plus rapide que l'algorithme de Prim. P>