TĂ©lĂ©chargezdĂšs aujourd'hui la photo Bricolage Carte De Voeux PĂšre Jour PĂątes Forme Noeud Papillon Fond Bleu IdĂ©e Cadeau DĂ©cor FĂȘte Des PĂšres Papa. Trouvez d'autres images libres de droits dans la collection d'iStock, qui contient des photos de FĂȘte des pĂšres facilement tĂ©lĂ©chargeables.
Code Promo Mylittlegarage -85% en AoĂ»t 2022 Il existe plusieurs codes de rĂ©duction, codes promo Mylittlegarage collectĂ©s par pour Ă©conomiser beaucoup. C'est un bon choix pour vous d'acheter chez Mylittlegarage si vous voulez des produits de haute qualitĂ© Ă des prix moins chers, car vous pouvez Ă©conomiser jusqu'Ă 85% sur vos commandes avec Bon de RĂ©duction Mylittlegarage. DĂ©sormais, la plupart des Code Avantage Mylittlegarage et des offres sont disponibles en France. Utilisez ces superbes Code RĂ©duction Mylittlegarage pour obtenir des prix rĂ©duits avant de passer Ă la caisse. Lire la suite Mylittlegarage Aller sur Tous Code Bon Plan Code 85% de rĂ©duction sur Pneus Antigel 2022-08-24 100 RecommandĂ© Offre Offre Mylittlegarage Jusqu'Ă 60% de rĂ©duction chez Aliexpress 2022-08-27 150 mais certaines offres peuvent encore marcher Code RĂ©duction similaire Ă Mylittlegarage 20% rĂ©duction sur votre commande en tant qu'Ă©tudiant 2022-12-28 156 En promo It's ALL Possible Ă partir de 552416EUR sur le site Sandro 2023-01-14 118 Utilisez le code promotionnel Fanatical et Ă©conomisez 10% OFF supplĂ©mentaires sur votre commande 2023-03-13 152 Jusqu'Ă 90% de remise sur Programme de fidĂ©litĂ© Le Petit Fumeu 2023-02-21 172 30% de rĂ©duction sur les collections fw21 en utilisant le code 2023-02-27 115 FAQ pour Mylittlegarage Mylittlegarage propose-t-il la livraison gratuite? Mylittlegarage livre ses produits en France mĂ©tropolitaine, dans tous les dĂ©partements et rĂ©gions d'outre-mer, en Europe, en Suisse, au Royaume-Uni, au Maghreb, aux Ătats-Unis et au Canada. Pour les livraisons en dehors de ces destinations, vous pouvez demander un prix en le contactant. Livraison est gratuite Ă partir de 100 euros France mĂ©tropolitaine. OĂč puis-je trouver des vidĂ©os de test de produits Mylittlegarage? Tous les tests produits qu'il effectue sont disponibles sur le site MylittlegarageYouTube. En regardant la vidĂ©o de test du produit, vous pouvez en savoir plus sur les caractĂ©ristiques du produit, afin de pouvoir choisir le produit le plus adaptĂ© Ă votre voiture tout en garantissant la qualitĂ©. Que disent les clients de Mylittlegarage de ses produits et services? Selon les commentaires des consommateurs de Mylittlegarage, 98% des clients dĂ©clarent faire confiance Ă cette marque. Si vous ĂȘtes intĂ©ressĂ© par les produits de Mylittlegarage, n'hĂ©sitez pas Ă cliquer pour accĂ©der au site Web de Mylittlegarage et parcourir les produits adorables Ă partir de maintenant car Code Promo Mylittlegarage vous attend toujours. Est-ce que Code RĂ©duction Mylittlegarage n'est valable que pour les produits spĂ©cifiques? Mylittlegarage propose occasionnellement Code RĂ©duction pour l'ensemble des produits. Pendant la pĂ©riode de cette promotion, tous les produits chez Mylittlegarage sont en soldes. Câest une vraiment bonne occasion pour acheter plus mais avec moins dâargent car tous les articles de Mylittlegarage ne sont pas chers pendant cette pĂ©riode. Est-ce qu'on peut Ă©conomiser avec Code Promo pour longtemps quand on s'inscrire Ă Mylittlegarage? Lors de vos achats chez Mylittlegarage, vous bĂ©nĂ©ficierez d'une remise unique Code Promo Mylittlegarage pour les nouveaux clients. En fournissant des produits de haute qualitĂ©, amĂ©liorez la qualitĂ© de vie et raccourcissez le temps de transport, Mylittlegarage fournit de nouveaux clients Code RĂ©duction car vous Ă©conomiserez beaucoup d'argent et enrichirez vos Ă©vĂ©nements et occasions. N'hĂ©sitez pas Ă utiliser le code promotionnel de Mylittlegarage uniquement pour les nouveaux clients si vous souhaitez payer Ă un prix adorable. Mylittlegarage offrira-t-il des remises pendant les fĂȘtes ou des saisons des soldes? Mylittlegarage propose plusieurs opportunitĂ©s de faire du shopping sans vous inquiĂ©ter de votre budget. Il suffit de faire attentation Ă des informations des activitĂ©s de promotion chez Mylittlegarage. Parmi toutes les promotions tout au long de lâannĂ©e, vous ne devez nĂ©gliger les soldes dâĂ©tĂ© et les soldes dâhiver parce que pendant la pĂ©riode de soldes, vous pouvez profiter Code Promo Mylittlegarage et vous aurez de la chance de consommer plus dâachats chez Mylittlegarage Ă un moins prix. Ne manquez pas la chance d'obtenir le produit Mylittlegarage que vous voulez.
AchetezĂ Prix Mini le produit Perle en verre Noir Champ de fleurs - Achat Facile dans le rayon Perles - Paiement SĂ©curisĂ© - Service Client Disponible - Livraison Rapide et Offerte* ! AccĂ©der au menu; AccĂ©der Ă la recherche; AccĂ©der au contenu; Quoi de neuf chez Creavea Livraison OFFERTE dĂšs 39.90 ⏠* Quoi de neuf chez Creavea Livraison OFFERTE dĂšs 39.90 ⏠* Menu. Nos meilleures rĂ©ductions et code promo 11 offres disponibles Ne ratez pas cette offre ! GRATUIT 3 EUROS OFFERT Bonus de bienvenue pour les nouveaux membres 3⏠offerts Ă l'inscription du service iGraal faites vous rembourser une partie du montant de vos achats sur Internet. Profiter de l'offre Vous allez ĂȘtre redirigĂ© vers notre partenaire L'offre est rĂ©servĂ©e et sera validĂ©e Ă toute premiĂšre inscription Ă iGraal. 5 euros de bonus de bienvenue seront crĂ©ditĂ©s Ă l'enregistrement de votre compte En devenant membre, vous pourrez rĂ©cupĂ©rer une partie du montant de vos achats effectuĂ©s en ligne. Le service est 100% gratuit Avantages et Offres expirĂ©es pouvant toujours marcher Ne ratez pas cette offre ! 15% DE PROMO Code promo Expire le 16/08/2022 15% de remise sur tout via ce code promo Mon Faire Part Voir le code Vous allez ouvrir le site dans un nouvel onglet Voir le code promo Vous allez ouvrir le site dans un nouvel onglet SH1 DĂ©tails de l'offre Ne ratez pas cette offre ! 15% DE PROMO Code promo Vente Flash -15% sur tout le site Voir le code Vous allez ouvrir le site dans un nouvel onglet Voir le code promo Vous allez ouvrir le site dans un nouvel onglet SH1 DĂ©tails de l'offre 15% DE PROMO Code promo 15% de rĂ©duction sur l'ensemble du site et sans minimum d'achat Voir le code Vous allez ouvrir le site dans un nouvel onglet Voir le code promo Vous allez ouvrir le site dans un nouvel onglet SH1 DĂ©tails de l'offre BON PLAN Code promo Profitez d'un essai personnalisĂ© gratuit Voir le code Vous allez ouvrir le site dans un nouvel onglet Voir le code promo Vous allez ouvrir le site dans un nouvel onglet SAI DĂ©tails de l'offre 15% DE PROMO Code promo 15% de rĂ©duction sur toutes vos dĂ©penses Voir le code Vous allez ouvrir le site dans un nouvel onglet Voir le code promo Vous allez ouvrir le site dans un nouvel onglet SH1 DĂ©tails de l'offre Les meilleures rĂ©ductions et code promo valides aujourd'hui Remise Conditions et dĂ©tails des promotions Offre BON PLAN Les Cartes de vĆux entreprise sont Ă partir de 1,04âŹ. Bon Plan BON PLAN Retrouvez un large choix de Faire-Part de Naissance pour Garçons Ă partir de 0,78âŹ. Bon Plan BON PLAN DĂ©couvrez les nouveaux stickers de mariage dĂ©s 0,31âŹ. Bon Plan BON PLAN Abonnez-vous Ă la Newsletter recevez toutes les nouveautĂ©s. Bon Plan BON PLAN Retrouvez les Faire-Part de Mariage Vintage Ă 1,73âŹ. Bon Plan Sommaire 30 passionnĂ©s au service de vos crĂ©ations Les crĂ©ations Ă rĂ©aliser sur le site Pourquoi crĂ©er et passer commande sur le site ? Toutes les rĂ©ductions Pour annoncer la naissance de votre enfant, convier votre famille et vos amis Ă votre mariage ou souhaiter vos meilleurs vĆux aux personnes de votre entourage, pourquoi ne pas faire appel au site ? SpĂ©cialisĂ© dans la conception de faire-part et autres cartes de voeux, le site vous offre des prestations de grande qualitĂ©, ainsi qu'une conception 100% française. D'ailleurs, actuellement, profitez du code promo disponible sur Nous vous proposons dĂšs Ă prĂ©sent d'en savoir un peu plus, concernant ce prestataire. Pourquoi le choisir ? Quels sont les services disponibles ? Explications. 30 passionnĂ©s au service de vos crĂ©ations est une entreprise créée il y a plus de 15 ans. Aujourd'hui, ce sont plus de 30 passionnĂ©s qui se mettent Ă votre service, pour vous aider Ă concevoir le plus beau faire part de naissance, faire part de mariage ou carton d'invitation Ă un anniversaire. Si vous propose de rĂ©aliser des crĂ©ations personnalisĂ©es, le site vous offre Ă©galement d'utiliser l'un des nombreux designs, imaginĂ©s par des artistes de talent. Tous les faire-part et autres produits de papeterie disponibles et personnalisables sur le site sont rĂ©alisĂ©s dans l'atelier de Valenciennes, pour une conception optimale qui saura vous apporter satisfaction. Alors, profitez dĂšs Ă prĂ©sent du code de rĂ©duction, pour rĂ©aliser un carton d'invitation ou un faire-part de grande qualitĂ©. Justement, dĂ©couvrez dĂšs Ă prĂ©sent toutes les prestations proposĂ©es par Les crĂ©ations Ă rĂ©aliser sur le site Un faire-part de mariage afin de comprendre l'importance et l'impact du mariage sur la vie d'un couple, et ainsi proposer des faire-part Ă la hauteur de cet Ă©vĂ©nement, s'est associĂ© Ă l'institut d'Ă©tudes d'opinion IFOP, pour rĂ©aliser un sondage autour de cette union. Sur le site, trouvez de trĂšs nombreux designs afin de rĂ©aliser un carton d'invitation qui vous ressemble, personnalisĂ©. Ă la fois moderne et poĂ©tique, vous trouverez sans aucun doute le modĂšle correspondant au thĂšme que vous avez choisi, pour cet Ă©vĂ©nement. Un faire-part de naissance annoncer la naissance de votre bĂ©bĂ© Ă vos proches, vos amis et votre famille, voilĂ qui est essentiel. Aussi, pour Ă©crire le tout premier chapitre de la vie de votre enfant, choisissez un faire-part proposĂ© par et officialisez la venue de votre bambin. Vous apprĂ©cierez sans aucun doute l'originalitĂ© des diffĂ©rents modĂšles proposĂ©s ! Un faire-part de baptĂȘme dans la vie d'une famille chrĂ©tienne, le baptĂȘme possĂšde une trĂšs grande importance. Pour convier vos amis et votre famille Ă cet Ă©vĂ©nement unique, choisissez l'un des cartons d'invitation de Un faire-part de communion la communion est, Ă l'instar du baptĂȘme, un Ă©vĂ©nement crucial dans la vie d'un chrĂ©tien. Pour cĂ©lĂ©brer l'entrĂ©e de votre enfant dans la foi, conviez les personnes qui vous sont chĂšres, grĂące Ă un faire-part de communion personnalisable. Sobres et Ă©lĂ©gants, les modĂšles disponibles sur vont sans aucun doute vous faire craquer. La personnalisation de boĂźtes Ă dragĂ©es pour votre mariage, vous souhaitez que tout soit parfait. Aussi, chaque petit dĂ©tail Ă son importance. Alors, que diriez-vous d'opter pour une boĂźte Ă dragĂ©es personnalisĂ©e au nom des deux Ă©poux ? Ce petit cadeau de remerciement ne manquera pas de sĂ©duire vos convives. Il s'agit Ă©galement d'une tradition qui sĂ©duit mĂȘme les jeunes mariĂ©s du 21Ăšme siĂšcle. Sur trouvez le design qui convient Ă la thĂ©matique de votre mariage ! La crĂ©ation de cartes de voeux l'envoi des traditionnelles cartes de vĆux, voici dĂ©finitivement un incontournable du dĂ©but d'annĂ©e. Pour transmettre vos pensĂ©es chaleureuses Ă vos amis, votre famille ou vos collĂšgues, choisissez un design tendance, moderne ou poĂ©tique. LĂ encore, sur il vous sera possible de rĂ©diger un message personnalisĂ©, pour toucher en plein cĆur les personnes de votre entourage. Vous ĂȘtes intĂ©ressĂ© par l'un des produits proposĂ©s par le site ? Dans ce cas, profitez dĂšs Ă prĂ©sent du code promo ! Faites-vous plaisir, tout en maĂźtrisant votre budget. Pourquoi crĂ©er et passer commande sur le site ? est un site de personnalisation de faire-part et de cartes en tout genre. En plus de proposer un service complet ainsi qu'un code promo attractif, celui-ci offre Ă tous ses clients des avantages considĂ©rables, que nous vous proposons de dĂ©couvrir. Une fabrication 100% française nous l'avons mentionnĂ© prĂ©cĂ©demment, toutes les cartes et faire-part rĂ©alisĂ©s par sont conçus dans l'atelier de l'entreprise, situĂ© Ă Valencienne. D'ailleurs, les 30 passionnĂ©s qui la composent travaillent sur d'anciennes presses typographiques vieilles de plusieurs dĂ©cennies, toujours dans l'objectif de vous offrir entiĂšre satisfaction. L'intervention d'artistes de talent pour imaginer les diffĂ©rents modĂšles de faire-part, le site fait intervenir de nombreux artistes, Ă l'origine de designs modernes, tendances et authentiques. Des codes promos rĂ©guliers pour vous aider Ă mieux maĂźtriser votre budget, et parce que l'organisation d'un mariage ou d'un baptĂȘme, ou l'annonce d'une naissance ne devraient pas peser trop lourdement sur votre budget, vous propose rĂ©guliĂšrement des codes promo. LerĂ©seau cyclable des Points NĆuds se compose de plusieurs points numĂ©rotĂ©s et reliĂ©s les uns aux autres via des routes asphaltĂ©es. Une balade est organisĂ©e le6Cartes Bonne AnnĂ©e Que tous tes vĆux se rĂ©alisent et Bracelet au choix. UVACN263_LOT Le cadeau pour la St Sylvestre branchĂ© et original !. Ă partir de 32,50 âŹ. Ajouter au panier
Quantité
Commandezmaintenant votre Trixie Corde Ă noeuds multicolore pour chien Ă prix choc chez zooplus -10% sur votre 1ere commande, code BIENVENUEAller au menu Aller au contenu Aller Ă la recherche BibliothĂšque AccĂ©der Ă tous les contenus de la bibliothĂšque Informatique Autres informatique Bureautique et rĂ©daction DĂ©veloppement Web MatĂ©riel et Ă©lectronique Programmation et algorithmique SystĂšmes d'exploitation Sciences de la nature Astronomie Autres sciences de la nature Biologie Chimie MathĂ©matiques Physique Sciences de la terre Sciences humaines et sociales Autres sciences humaines et sociales Droit Ăconomie Histoire Langues Psychologie Autres Arts, graphisme et multimĂ©dia Autres Communication et management Zeste de Savoir Tags les plus utilisĂ©s zds mathĂ©matiques algorithmique python physique Tous les tags Tribune Tous les billets Informatique Autres informatique Bureautique et rĂ©daction DĂ©veloppement Web MatĂ©riel et Ă©lectronique Programmation et algorithmique SystĂšmes d'exploitation Sciences de la nature Astronomie Autres sciences de la nature Biologie Chimie MathĂ©matiques Physique Sciences de la terre Sciences humaines et sociales Autres sciences humaines et sociales Droit Ăconomie Histoire Langues Psychologie Autres Arts, graphisme et multimĂ©dia Autres Communication et management Zeste de Savoir Tags les plus utilisĂ©s python zds c++ musique javascript Tous les tags Forum Tous les forums Savoirs Programmation DĂ©veloppement Web MultimĂ©dia et Jeux vidĂ©o SystĂšmes et MatĂ©riels Sciences Les autres savoirs CommunautĂ© Le bar Ă smoothies Bugs et Suggestions Dev Zone Contenus en cours de rĂ©daction Vos projets L'association Tags les plus utilisĂ©s python c++ php arduino c Accueil Tutoriels Ă la dĂ©couverte des algorithmes de graphe Bases de la thĂ©orie des graphes Parcourir un graphe Licence CC BY-NC-SA Parcourir un graphe C'est bon ? Vous avez un graphe joli tout plein ? Il attend sagement dans la RAM que vous vous occupiez de lui ? Vous ĂȘtes ici pour pouvoir - enfin ! - programmer vos premiers algorithmes de graphe. Vous allez apprendre Ă explorer la bĂ©bĂȘte, avec le DFS, le BFS et l'exhaustif. Et avec la foultitude d'exemples que je vous donnerai, je vous promets que vous ne tarderez pas Ă dĂ©couvrir le nombre incroyable de problĂšmes que ces simples algorithmes rĂ©solvent. PrĂ©parez vous Ă plonger profondĂ©ment1 dans l'univers des graphes. Le parcours en profondeur et le labyrinthe Le parcours en largeur et le buzz L'exhaustif et Uno Le parcours en profondeur et le labyrinthe Les pyramides Aaaah l'Egypte ! Le soleil, le sable, le Nil ! Le Sphinx et son nez ! Les pyramides, leurs labyrinthes, et leurs⊠euh⊠labyrinthes. FidĂšle Ă la tradition familiale vous ĂȘtes devenu un pilleur de tombeaux. Vous n'ĂȘtes pas sans ignorer que la chambre funĂ©raire recĂšle maints trĂ©sors, que vous avez hĂąte de vous approprier afin d'ouvrir le magasin de guimauve dont vous rĂȘvez depuis votre enfance. Sauf qu'aujourd'hui vous ĂȘtes tombĂ© sur une pyramide trĂšs particuliĂšre, avec de nombreux carrefours⊠mais certains mĂšnent Ă des piĂšges abominables, tellement abominables que je n'ose pas les dĂ©crire ici ! Vous disposez d'une carte du labyrinthe remettant ainsi en cause l'utilitĂ© de ce dernier. Soucieux de ne pas prendre de risques superflus, vous confiez Ă votre ordinateur la dure tĂąche de trouver un itinĂ©raire fiable. Voici le plan Exercice trouvez le graphe associĂ© Ă ce problĂšme. Trouvez ses caractĂ©ristiques principales. Trouvez quelle question on se pose sur ce graphe. Puis choisissez la structure de donnĂ©es qui vous semble la plus appropriĂ©e Ă la rĂ©solution du problĂšme ! Commençons par le graphe. Il apparaĂźt clairement que chaque couloir est une arĂȘte. Par consĂ©quent les nĆuds seront des intersections. Certains nĆuds sont particuliers. Les entrĂ©es du labyrinthe c'est de l'une d'entre elles que commence le chemin. La chambre funĂ©raire c'est l'aboutissement d'un chemin s'il existe. Les salles piĂ©gĂ©es posent problĂšme elles existent mais nous ne pouvons pas les traverser. Deux solutions. soit on ajoute ces nĆuds particuliers au graphe, en prĂ©cisant bien qu'ils sont piĂ©gĂ©s pour que l'algorithme les ignore compliquĂ© et dĂ©sagrĂ©able Ă implĂ©menter, plein de cas particuliers Ă gĂ©rer. soit on les ignore purement et simplement lors de la construction du graphe, comme s'ils n'en faisaient pas parti plus simple, plus propre. Nous choisirons donc la seconde solution. Et retenez de cela qu'il ne faut pas s'encombrer de superflu un sĂ©rieux coup de pied dans les fesses de la sociĂ©tĂ© de consommation, pas vrai ?, la simplicitĂ©, l'expressivitĂ© et la concision sont les mots d'ordre du dĂ©veloppeur. Cela vous Ă©vitera de tristes aprĂšs-midis de dĂ©bogage. Labyrinthe simplifiĂ© Passons aux caractĂ©ristiques du graphe. Ce graphe est non orientĂ© vous pouvez traverser un couloir dans les deux sens, et mĂȘme sur les mains si ça vous plaĂźt. Ce graphe est cyclique, car certains itinĂ©raires tournent en rond ah les fourbes !. Ce graphe n'est pas pondĂ©rĂ©. Certains objecteront qu'on peut associer Ă chaque couloir sa longueur, le coefficient de duretĂ© du sol, l'Ăąge de sa construction ou que sais-je encore. C'est vrai. Sauf qu'on s'en fout. On est pas ici pour trouver le chemin le plus respectueux pour vos pieds, donc ne nous encombrons pas de ces broutilles. Pas de superflu. Ce graphe n'est pas connexe vous ne pouvez pas accĂ©der Ă n'importe quel endroit depuis n'importe quel autre endroit. On dĂ©nombre 2 composantes connexes d'ailleurs. Ce graphe est creux on a seulement 17 arĂȘtes pour 18 nĆuds aprĂšs suppression des nĆuds piĂ©gĂ©s et des couloirs qui leur sont associĂ©s. On choisira donc la liste d'adjacence pour stocker ce graphe ! Pour finir voici la question que l'on se pose. Existe-t-il un chemin entre une entrĂ©e et la chambre funĂ©raire ? Autrement dit, la chambre funĂ©raire est-elle connexe Ă au moins une entrĂ©e ? Quel est ce chemin ou l'un de ces chemins ? Le parcours en profondeur Le DFS est la mĂ©thode la plus simple pour parcourir un graphe. Elle fonctionne sur tout type de graphe, cyclique ou non,orientĂ© ou non, etc. En langage naturel ça donne je pars d'un endroit que je ne connais pas, je me dirige vers d'autres endroits que je ne connais pas, et quand je suis bloquĂ© je fais demi-tour jusqu'Ă retrouver un chemin que je n'ai pas encore parcouru. Assez instinctif pas vrai ? C'est la mĂ©thode que l'on utilise lorsqu'on est perdu, ou lorsqu'on visite un bĂątiment on essaie plusieurs chemins, et lorsqu'on est coincĂ©s on fait demi-tour jusqu'Ă la prĂ©cĂ©dente intersection. Voici sa description sous forme d'algorithme 1 Je cherche un nĆud non visitĂ©. 2 Pour visiter ce nĆud, je marque le nĆud comme visitĂ©. 3 Je prends l'un de ses voisins si le voisin a dĂ©jĂ Ă©tĂ© visitĂ© je l'ignore et je cherche un autre voisin si le voisin n'a pas encore Ă©tĂ© visitĂ©, je le visite si tout les voisins ont Ă©tĂ© visitĂ©, je reviens au nĆud prĂ©cĂ©dent, et je rĂ©-applique le 3 4 Je reprend le 1 tant qu'il reste des nĆuds non visitĂ©s Vous avez remarquĂ© ? Une boucle de 4 Ă 1 englobe la totalitĂ© de l'algorithme. Cette condition d'arrĂȘt tant qu'il reste des nĆuds non visitĂ©s nous assure que l'entiĂšretĂ© du graphe sera explorĂ©. Il n'y a pas que ça pour visiter un nĆud, il faut aussi visiter l'un de ses voisins non visitĂ©. Un concept qui se renvoie Ă lui mĂȘme pour se dĂ©finir, ça ne vous fait penser Ă rien ? Mais si, la rĂ©cursivitĂ© bien sĂ»r ! Passons au pseudo-code. 1 2 3 4 5 6 7 8 9 10 11 12 13 14Procedure explorerGraphe G { Pour chaque noeud N de G Si N non visite DFSG, N } Procedure DFSGraphe G, Noeud N { Marquer N comme visite Pour chaque voisin V de N Si V non visite DFSG, V } Remarquez une chose la fonction explorer fera autant d'appels Ă DFS qu'il existe de composantes connexes distinctes, dans un graphe non orientĂ©. Le DFS est donc un bon moyen de retrouver les composantes connexes d'un graphe non orientĂ©. Si nous ne marquions pas les nĆuds comme Ă©tant visitĂ©s, nous nous mettrions Ă tourner en rond, dans le cas d'un graphe cyclique. Cela entraĂźnerait donc des appels rĂ©cursifs infinis, et notre programme ne se terminerait jamais ! Pour cette raison, le DFS est l'algorithme le plus adaptĂ© Ă la dĂ©tection de cycles. Vous comprenez maintenant l'origine du nom DFS l'algorithme descend en profondeur dans le graphe, avant de faire demi-tour. Sur le graphe ci-dessous l'ordre d'exploration pourra donc ĂȘtre A - B - D - F - E - C - G Voyons le problĂšme sous un autre angle, et dessinons les arĂȘtes empruntĂ©es par le DFS Arbre Cela ne vous fait penser Ă rien ? C'est un arbre ! En effet, ce graphe ne comporte pas de cycles puis que le DFS ne doit pas boucler. Et on s'aperçoit que le DFS, de nature rĂ©cursive, se prĂȘte bien au parcours de cette structure de donnĂ©es rĂ©cursive pour explorer un arbre, on explore sa racine puis les sous-arbres qui le composent. Jetons un petit coup dâĆil Ă la complexitĂ© en temps de cet algorithme. On remarque que chaque nĆud ne sera traitĂ© qu'une seule fois, et on a tĂŽt fait de conclure Ă tort qu'il est en $ON$. Sauf que⊠pour chaque nĆud, on itĂšre sur tout ses voisins qu'un appel rĂ©cursif soit fait dessus ou non. D'oĂč une complexitĂ© en temps de $ON+A$. On voit donc ici que le nombre de nĆuds est fonction - de façon assez Ă©vidente - de la vitesse d'exĂ©cution, mais que la densitĂ© du graphe a elle aussi un rĂŽle trĂšs important. La complexitĂ© en mĂ©moire dĂ©pend du nombre d'appels rĂ©cursifs qui font grossir la pile, et il peut y en avoir autant que de nĆuds dans le graphe. La complexitĂ© en mĂ©moire est donc $ON$. Le pire des cas correspond Ă un graphe sous la forme d'une liste de nĆuds chaĂźnĂ©s les uns Ă la suite des autres, lĂ oĂč la profondeur d'appel est maximale. Le DFS tel que je vous l'ai prĂ©sentĂ© ici est assez "nu" mais il va sans dire qu'avec quelques modifications il est en mesure de rĂ©soudre un grand nombre de problĂšmes ici dĂ©terminer si deux nĆuds sont sur la mĂȘme composante connexe. Nous verrons cela dans les chapitres suivants. Que le DFS soit de nature rĂ©cursive est autant un avantage qu'un inconvĂ©nient. Un avantage car beaucoup plus simple Ă lire, Ă Ă©crire et Ă dĂ©boguer lorsqu'on est Ă l'aise avec la rĂ©cursivitĂ©. Mais un inconvĂ©nient car chaque appel rĂ©cursif fait grossir la pile d'appel, qui possĂšde une taille limitĂ©e dĂ©pendant de votre langage, de votre OS et de votre compilateur/interprĂ©teur souvent 1000 mais n'en faites pas une gĂ©nĂ©ralitĂ©. Si votre graphe est trop gros vous pourriez rencontrer d'importants problĂšmes de mĂ©moire. La solution consiste Ă rĂ©-implĂ©menter le DFS en itĂ©ratif en simulant la pile d'appel grĂące Ă une pile LIFO. Luke, je suis ton pĂšre Normalement, vous disposez d'assez d'informations pour rĂ©soudre le problĂšme Ă prĂ©sent. Il suffit de modifier un peu la fonction DFS. Ne regardez pas la solution avant d'avoir bien cherchĂ© ! Bon, rĂ©capitulons si ce chemin existe, aprĂšs l'avoir parcouru, il faut savoir le retrouver. Remarquons deux choses ce chemin, quel qu'il soit, reste le mĂȘme quelque soit le sens dans le quel on l'emprunte; en outre, chaque nĆud n'est visitĂ© qu'une et une seule fois, donc il n'existe qu'un seul moyen de parvenir Ă lui dans le DFS. C'est directement en lien avec l'observation de tout Ă l'heure le DFS explore un arbre, donc chaque nĆud n'a qu'un seul pĂšre. Il suffit donc de remonter dans l'arbre, depuis la chambre funĂ©raire jusqu'Ă la racine c'est Ă dire le premier appel Ă la fonction DFS sur cette composante connexe. Et pour cela rien de plus simple il faut que chaque nĆud retienne qui est son pĂšre. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29Fonction trouverCheminGraphe G { Pour chaque noeud N de G pere[N] = NUL explorerG Noeud chemin[] Noeud courant = chambreFuneraire Tant que courant != NUL // == Tant qu'on est pas sorti courant = pere[courant] Renvoyer inversechemin // car le chemin est reconstruit Ă l'envers } Procedure explorerGraphe G { Pour chaque noeud N de G Si N non visite et N est une entree pere[N] = NUL DFSG, N } Procedure DFSGraphe G, Noeud N { Marquer N comme visite Pour chaque voisin V de N Si V non visite pere[V] = N DFSG, V } Si ce chemin existe il sera trouvĂ©. Sinon, la fonction trouverChemin renverra la liste singleton [NUL] pour signifier l'absence de chemin. Ci-dessous, un exemple de solution pas forcĂ©ment la plus courte. Labyrinthe rĂ©solu Et voilĂ ! Vous avez trouvĂ© votre chemin. Mais n'oubliez pas il y a une diffĂ©rence entre connaĂźtre le chemin et arpenter le chemin. Le parcours en largeur et le buzz Big Buzz Vous venez d'achever lâĆuvre de votre vie une vidĂ©o si stupide qu'elle va rencontrer un succĂšs incroyable. Elle va faire le buzz, vous le savez quiconque la voit ne pourra pas s'empĂȘcher de la partager juste aprĂšs. Personne n'y Ă©chappera, subjuguĂ© par tant de bĂȘtise humaine. Vous voulez suivre la progression de votre crĂ©ation sur le net, et en particulier vous souhaitez savoir combien de personnes en tout ont visionnĂ© votre vidĂ©o au bout d'un certain nombre d'heures. Vous ĂȘtes ami avec un employĂ© de la NSA, ce qui vous permet d'obtenir une carte trĂšs dĂ©taillĂ©e de votre rĂ©seau social prĂ©fĂ©rĂ©, oĂč vous voyez les liens entre chaque individu. SitĂŽt qu'un individu voit la vidĂ©o, il la partage. Tous ses contacts la voient trĂšs exactement une heure aprĂšs, puis la partagent immĂ©diatement Ă leur tour, etc. Vous ĂȘtes le point d'Ă©mission de la vidĂ©o Ă l'heure 0, qui ira vers vos amis, puis les amis de vos amis⊠A partir du rĂ©seau social, vous souhaitez obtenir la liste triĂ©e des gens l'ayant vue, en fonction de l'heure. Quel est le graphe ? Bon lĂ c'est assez explicite, un nĆud pour chaque individu, et une arĂȘte pour chaque relation entre deux individus. Ce graphe est 1. cyclique 2. non orientĂ© l'amitiĂ© marche dans les deux sens normalement, mais si vous prĂ©fĂ©rez un systĂšme avec des followers ce sera un graphe orientĂ© 3. non pondĂ©rĂ© 4. pas forcĂ©ment connexe car il est possible de trouver des communautĂ©s ou individus parfaitement isolĂ©s 5. creux sauf quand tout le monde connait tout le monde, mais c'est rare. On va donc, une fois de plus, utiliser une liste d'adjacence. On veut obtenir la liste des nĆuds en fonction de leur distance Ă un nĆud particulier, le vĂŽtre. Le parcours en largeur Le BFS est l'algorithme qui permet de parcourir tout les nĆuds en fonction de leur distance Ă l'origine. Il explore les cartes par cercles concentriques de plus en plus grands. Il fonctionne sur tout type de graphe, cyclique ou non, orientĂ© ou non, etc. Le BFS procĂšde de la façon suivante il prend le premier nĆud distance 0, puis traite tout les nĆuds qui sont Ă une distance de 1, puis tout les nĆuds Ă une distance de 2, puis tout les nĆuds Ă une distance de 3⊠et ainsi de suite. On remarque trĂšs vite que les nĆuds Ă une distance 1 de l'origine sont ses voisins, Ă une distance de 2 ce sont les voisins de ses voisins, Ă une distance 3 les voisins des voisins de ses voisins⊠de maniĂšre gĂ©nĂ©rale, un nĆud Ă distance $n$ est soit reliĂ© Ă des nĆuds de distance $n-1$, soit des nĆuds de distance $n$, soit des nĆuds de distance $n+1$. Certainement pas plus sinon il existerait un moyen plus rapide de rejoindre le nĆud suivant; certainement pas moins, sinon le nĆud courant aurait pu ĂȘtre atteint plus rapidement. Si nous disposons de tout les nĆuds Ă distance $n$, nous avons accĂšs Ă tout les nĆuds de distance $n+1$. DĂšs le dĂ©but on a accĂšs au nĆud de distance 0, donc en appliquant itĂ©rativement ce procĂ©dĂ© on aura accĂšs Ă tout les nĆuds en fonction de leur distance Ă l'origine s'ils sont connexes Ă elle. Si vous ignorez ce qu'est une file FIFO, il n'est pas trop tard ! Voici l'algorithme 1 Je prend le premier nĆud de la file d'attente des nĆuds Ă traiter. 2 Pour visiter ce nĆud je le marque comme visitĂ©. 3 Je prend chacun de ses voisins non visitĂ©s et je les ajoute Ă la fin de la file d'attente des nĆuds Ă visiter 4 Je reprends le 1 tant qu'il reste des nĆuds Ă traiter dans la file d'attente Voici le pseudo code correspondant 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16Procedure BFSGraphe G, Noeud Origine { File aTraiter Marquer Origine comme visite Tant que { Noeud N = Pour chaque voisin V de N Si V non visite Marquer V comme visite } } Cet algorithme fonctionne, je vous le promet ! Il commence par enfiler l'origine Ă distance 0, puis tout les nĆuds 1, puis pour chaque nĆud Ă distance 1 il va enfiler d'autres nĆuds Ă la distance 2 Ă la suite des nĆuds Ă distance 1 donc, puis il dĂ©filera les nĆuds Ă distance 2 pour enfiler des nĆuds Ă distance 3 Ă leur suite. Ainsi les nĆuds ne sont jamais mĂ©langĂ©s ils sont prĂ©sents dans la file par "paquets" consĂ©cutifs qui correspondent Ă leur distance Ă l'origine. Sur un arbre, il explore les nĆuds en fonction de leur hauteur distance Ă la racine contrairement au DFS qui va effectuer toutes les descentes possibles de la racine Ă une feuille. Ainsi, l'ordre d'exploration des nĆuds du graphe ci-dessous pourra ĂȘtre A - B - C - E - D - F - G. Comme vous pouvez le constater, tout les nĆuds frĂšres sont parcourus les uns Ă la suite des autres, la racine Ă©tant l'origine du BFS. Et que se passera-t-il si d'aventure nous remplacions la file par une pile ? On retrouve la version itĂ©rative du DFS prĂ©sentĂ©e Ă la section prĂ©cĂ©dente ! Il apparaĂźt donc qu'il y a un lien important entre algorithme et structure de donnĂ©es. L'Ă©criture sous forme itĂ©rative ou rĂ©cursive dĂ©pend essentiellement de facteurs comme la lisibilitĂ©, la maniĂšre de laquelle l'algorithme s'explique le mieux, et enfin les performances. Tout comme pour le DFS, la complexitĂ© en temps est en $ON+A$. Une fois encore la densitĂ© du graphe influe beaucoup sur les performances de l'algorithme. La file peut contenir autant de nĆuds que le graphe en possĂšde, d'oĂč une complexitĂ© en mĂ©moire de $ON$. Le pire des cas concerne un graphe de diamĂštre trĂšs faible la file est encombrĂ©e par la prĂ©sence des nombreux nĆuds Ă distance Ă©gale de l'origine. Le BFS peut servir Ă dĂ©tecter les composantes connexes d'un graphe tout comme le DFS, si plusieurs appels Ă la fonction BFS sont rĂ©alisĂ©s avec des origines diffĂ©rentes. Mais le BFS a un avantage sur le DFS lors de la recherche de composantes connexes il trouve le plus court chemin entre ces deux nĆuds s'il existe dans le cas d'un graphe non pondĂ©rĂ©. Dans le cas d'un graphe implicite de taille infini ou de trĂšs trĂšs grande taille le DFS risque de s'engager dans une mauvaise voie dans le dĂ©but et de s'y enfoncer trop profondĂ©ment, voir Ă l'infini ! Impossible de dĂ©terminer en un temps raisonnable ou un temps fini un chemin entre deux nĆuds connexes, alors que le BFS va explorer plusieurs chemins possibles Ă la fois, ce qui lui donne l'assurance de trouver un jour ce chemin. Pour cette raison les graphes implicites de grande taille sont souvent parcouru par un BFS plutĂŽt qu'un DFS. Mais le BFS peut aussi servir Ă marquer les nĆuds en fonction de leur distance Ă l'origine. C'est ce que nous allons voir tout de suite ! Le prix du succĂšs Une petite modification suffit Ă la rĂ©solution du problĂšme. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20Procedure BFSGraphe G, Noeud Origine { File aTraiter profondeur[Origine] = 0 Marquer Origine comme visite Tant que { Noeud N = Afficher + " voit la video a l'heure " + profondeur[N] Pour chaque voisin V de N Si V non visite profondeur[V] = profondeur[N] + 1 Marquer V comme visite } } Ci-dessous, vous pouvez voir l'effet de cet algorithme sur un graphe simple. Les nĆuds sont marquĂ©s en fonction de leur ordre de visite par le BFS le nĆud n°1 correspond donc Ă l'origine. Les nĆuds en cours de visite c'est Ă dire prĂ©sents dans la file sont coloriĂ©s en bleu. Les nĆuds dĂ©jĂ visitĂ©s et extraits de la file sont coloriĂ©s en vert. Ici, tout les nĆuds Ă distance 2 ou moins ont Ă©tĂ© explorĂ©s. Les nĆuds Ă distance 3 sont en cours d'exploration. Le seul nĆud Ă distance 4 n'a pas encore Ă©tĂ© traitĂ©. Et voilĂ . Vous pouvez Ă©galement indiquer le nombre total de gens ayant vu la vidĂ©o Ă chaque heure, je vous laisse le coder vous mĂȘme, ce n'est pas trĂšs difficile. L'exhaustif et Uno Connaissez-vous Uno$^{TM}$ ? Comme nous l'explique si bien WikipĂ©dia, c'est un jeu de carte amĂ©ricain créé en 1971 par Merle Robbins. Il est pourvu de pleins de rĂšgles subtiles et de cartes agressives pour faire rager les petits comme les grands. Aujourd'hui, je ne vous propose pas de programmer ce cĂ©lĂšbre jeu. A la place je vous propose plutĂŽt de rĂ©soudre ce petit problĂšme. Dans Uno, chaque joueur possĂšde un certain nombre de cartes en main, qui peuvent ĂȘtre de 4 couleurs bleues, vertes, rouges ou jaunes. Elles sont numĂ©rotĂ©es de 0 Ă 9. Il existe Ă©galement certaines cartes spĂ©ciales "Joker", "Inversion", "Super Joker"⊠mais nous ne y intĂ©resserons pas ici, par soucis de simplicitĂ©. Le jeu comporte un talon. On ne peut poser une carte sur le sommet de ce talon que si la carte au sommet du talon est De mĂȘme couleur que la carte qu'on joue De mĂȘme valeur faciale que la carte qu'on joue Un petit exemple poser un 7 rouge sur un 9 rouge est autorisĂ© poser un 4 vert sur un 4 bleu est autorisĂ© poser un 2 jaune sur un 2 jaune est autorisĂ© poser un 6 bleu sur un 3 vert est interdit Il est ainsi possible d'empiler ces cartes de diverses façons en suivant ces rĂšgles, pour obtenir un talon plus ou moins haut. Comme vous n'avez rien de mieux Ă faire, vous voulez savoir, Ă partir d'un ensemble de cartes donnĂ©, quels sont tout les talons qu'il est possible de rĂ©aliser avec. Les cartes qui ne pourront pas ĂȘtre ajoutĂ©es au talon seront Ă©ventuellement laissĂ©es sur le cĂŽtĂ©. Vous pouvez empiler les cartes de votre choix dans n'importe quel ordre, tant que vous respectez les rĂšgles. Exercice vous commencez Ă le connaĂźtre par cĆur normalement. Quel est le graphe ? Quels sont ses caractĂ©ristiques ? Quelle question se pose-t-on sur lui ? Correction Rappelez-vous un graphe reprĂ©sente des objets et des relations entre ces objets. Ici chaque objet, chaque nĆud, est donc une carte. Les arĂȘtes sont dĂ©finies par une valeur faciale ou une couleur commune. C'est donc un bon exemple de graphe dans lequel les arĂȘtes peuvent ĂȘtre dĂ©duites du nĆud Ă partir de certaines rĂšgles de construction simples. Ce graphe est cyclique. Certes, on ne peut pas utiliser une mĂȘme carte plus d'une fois, mais il y a plus d'une maniĂšre de poser une carte, qui aboutira Ă d'autres situations oĂč il serait ensuite thĂ©oriquement valide de poser cette carte si elle n'avait pas dĂ©jĂ Ă©tĂ© jouĂ©e. Ce graphe est non orientĂ©. L'ordre dans lequel sont empilĂ©s les cartes n'a pas d'importance, puisque les rĂšgles ne s'intĂ©ressent qu'Ă la relation d'adjacence de deux cartes, indĂ©pendamment de leur ordre. Ce graphe est non pondĂ©rĂ© sapristi, un de plus !. Une fois encore, ce graphe n'est pas nĂ©cessairement connexe. Il est parfois possible de former deux groupes de cartes n'ayant aucune couleur ou aucun numĂ©ro en commun. Ce graphe est dense, selon moi. En effet il n'y a pas de caractĂ©risation formelle entre un graphe dense et un graphe qui ne l'est pas, c'est laissĂ© Ă l'apprĂ©ciation de chacun. Laissez moi vous expliquer ma dĂ©marche. En supposant que l'on ait beaucoup de cartes, disons $N$, et qu'elles soient toutes tirĂ©es au hasard en moyenne nous aurons $\frac{N}{4}$ cartes de chaque couleur car il y a 4 couleurs. Toutes les cartes de mĂȘme couleur seront au moins reliĂ©es entre elles. Donc, en moyenne, chaque carte sera reliĂ©es Ă au moins $\frac{N}{4}$ autres cartes. Chaque carte est aussi reliĂ©e Ă un $\frac{1}{10}$ car 10 chiffres des cartes des 3 autres couleurs, soit $\frac{3\times N}{40}$ autres cartes en moyenne. Cela fait une moyenne de $0,325\times N$ arĂȘtes par nĆud. Le degrĂ© de chaque nĆud n'est pas constant il dĂ©pend de $N$. Ce qui porte le total Ă environ $0,162\times N^2$ arĂȘtes, car c'est un graphe non orientĂ© il ne faut pas compter deux fois chaque arĂȘte. Le nombre d'arĂȘtes du graphe est fonction de $N^2$. On peut donc qualifier ce graphe de dense. Et il est suffisamment dense pour rendre la matrice d'adjacence plus intĂ©ressante que la liste. Voici le graphe associĂ© Ă un ensemble de 20 cartes 5 de chaque couleur. En thĂ©orie chaque carte devrait ĂȘtre reliĂ©e Ă elle mĂȘme. Mais comme on ne peut pas utiliser deux fois la mĂȘme carte ce qui n'empĂȘche pas celle-ci d'ĂȘtre prĂ©sente en plusieurs exemplaires dans le jeu de dĂ©part, on sait d'avance que ces arĂȘtes qu'on nomme boucle ne nous serviront pas. Autant les supprimer maintenant. On souhaite connaĂźtre quels sont tout les talons possibles. Un talon est caractĂ©risĂ© par un ensemble de cartes dans un certain ordre. Et les contraintes d'adjacence de deux cartes sont celles des arĂȘtes du graphe ! Par consĂ©quent, chaque talon peut ĂȘtre reprĂ©sentĂ© par un chemin du graphe l'ordre de visite des nĆuds et la taille du chemin suffit Ă dĂ©finir le talon. Pour gĂ©nĂ©rer tout les talons possibles, il faut donc gĂ©nĂ©rer tout les chemins du graphe ! L'exhaustif Exhaustif qui inclut tous les Ă©lĂ©ments possibles dâune liste, qui traite totalement un sujet. Wiktionnaire Nous cherchons une liste de tout les talons possibles, sans en oublier aucun. Il nous faut donc une liste exhaustive des talons possibles. Cela nĂ©cessite un algorithme capable d'effectuer une Ă©numĂ©ration exhaustive de tout les chemins du graphe. D'oĂč le nom "exhaustif". Il faut trouver une mĂ©thode systĂ©matique pour dĂ©nombrer les chemins du graphe. Comment procĂ©derions-nous "Ă la main" ? Par exemple, nous pourrions prendre une carte et l'ajouter au talon. Puis prendre une autre carte et l'ajouter au talon en respectant les rĂšgles. Puis continuer Ă ajouter des cartes qu'il est possible d'en ajouter, sans rĂ©utiliser deux fois la mĂȘme Ă©videmment. Et lorsqu'on est bloquĂ© ? Une retire une carte au sommet du talon et on met une autre Ă la place, et c'est reparti ! On continue d'ajouter des cartes jusqu'Ă ce qu'on soit forcĂ© d'en retirer une au sommet pour la remplacer par une autre qui n'a pas dĂ©jĂ Ă©tĂ© posĂ©e Ă cette hauteur et avec ce talon spĂ©cifique en dessous. Ainsi, Ă la fin, tout les talons auront Ă©tĂ© construits. Vous avez remarquĂ© ? Un talon est une pile, donc nous aurons sĂ»rement affaire Ă une pile dans cet algorithme ! En voici le pseudo-code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24Fonction listerCheminsGraphe G { Chemin chemins[] Pour chaque noeud N autresChemins = exhaustifG, N, cheminVide Renvoyer chemins } Fonction exhaustifGraphe G, Noeud N, Chemin C { Marquer N comme utilise Chemin chemins[] Pour chaque voisin V de N Si V inutilise autresChemins = exhaustifG, V, C Marquer N comme inutilise Renvoyer chemins } Sans grande surprise, ici, la pile est la pile d'appel. Mais une fois encore, cet algorithme peut ĂȘtre passĂ© sous forme itĂ©rative si le besoin s'en fait sentir. Cette fonction ressemble beaucoup Ă celle du DFS, Ă deux exceptions prĂšs. PremiĂšrement, elle retourne quelque chose la liste des chemins. Secondement, et c'est lĂ le point le plus important l'Ă©tat d'un nĆud n'est pas dĂ©finitivement fixĂ©. A l'entrĂ©e de la fonction le nĆud est marquĂ© comme "utilisĂ©"; en revanche, Ă la sortie de la fonction, il est de nouveau marquĂ© comme "inutilisĂ©". Ainsi, la fonction exhaustif va pouvoir traiter plusieurs fois le mĂȘme nĆud, ce qui est somme-toute logique puisque qu'un mĂȘme nĆud peut faire parti de plusieurs chemins distincts. L'importance de marquer un nĆud comme utilisĂ© durant son utilisation comme les toilettes publiques Ă verrou colorĂ© est la mĂȘme que celle du DFS empĂȘcher les appels rĂ©cursifs infinis en bouclant dans un cycle. Sur le graphe ci-dessous, aprĂšs un appel sur le nĆud A, l'ordre dâexploration des nĆuds pourrait ĂȘtre A - B - D - F - E - C - G - E - F - B - D. Cela gĂ©nĂ©rerait les chemins suivants A A - B A - B - D A - B - F A - B - F - E A - C A - C - G A - E A - E - F A - E - F - B A - E - F - B - D Et cela juste avec le nĆud A comme origine ! Je vous Ă©pargne les autres. Comme vous pouvez le constater le nombre de chemins diffĂ©rents augmente trĂšs vite et atteint un nombre important, mĂȘme sur un graphe de petite taille. Ce qui nous amĂšne tout de suite Ă une question Ă©pineuse quelle est la complexitĂ© en temps et en mĂ©moire de l'algorithme ? Commençons par la complexitĂ© en temps. Quel est le pire des cas ? Le pire des cas serait un jeu de carte oĂč toutes les cartes sont reliĂ©es entre elles typiquement toutes de mĂȘme couleur, ce qui revient Ă travailler sur un graphe complet. Ainsi, je dispose de $N$ choix pour le premier Ă©lĂ©ment du talon. Puis de $N-1$ pour le second. Puis de $N-2$ pour le troisiĂšme, et ainsi de suite. Le nombre de talons possible est donc Ă©gal Ă $N \times N-1 \times N-2 \times ... \times 2 \times 1 = N!$ En fait, toutes les permutations de cartes sont possibles puisque toutes les cartes peuvent ĂȘtre adjacentes. Et le nombre de permutations de $N$ Ă©lĂ©ments est bien Ă©gal Ă $N!$. Cet algorithme est donc en $ON!$ en temps. La fonction factorielle croit asymptotiquement plus vite que la fonction exponentielle. Pour cette raison, mĂȘme sur des instances de petite taille, certains problĂšmes sont insolubles en un temps raisonnable. Pour vous faire une idĂ©e, 20! = 2 432 902 008 176 640 000. Donc si le graphe ci-dessus Ă©tait complet, il faudrait plusieurs dizaines de milliers d'annĂ©es de calcul. Heureusement il ne l'est pas ! De mon cĂŽtĂ© j'ai trouvĂ© 437 672 443 chemins diffĂ©rents vous pouvez vĂ©rifier si l'envie vous en prend. Quant Ă la complexitĂ© en mĂ©moire, elle est nĂ©cessairement $ON!$ elle aussi, puisqu'il s'agit lĂ du nombre de solutions. Cependant, si vous n'aviez qu'Ă dĂ©nombrer les solutions sans les produire, vous auriez alors un algorithme en $ON$, car la profondeur de rĂ©cursion peut atteindre N nĆuds. La recherche exhaustive, bien que donnant des rĂ©sultat exacts de par son exhaustivitĂ©, ne peut pas ĂȘtre utilisĂ©e en pratique pour tout les problĂšmes, Ă cause de sa lenteur. Pour cette raison, de nombreux problĂšmes sont rĂ©solus avec des algorithmes donnant une rĂ©ponse approchĂ©e ou exacte mais dont on ne peut pas prouver qu'elle est exacte qui ont une durĂ©e d'exĂ©cution plus courte. Ces algorithmes sont des sujets de recherche encore actifs qui mĂ©riteraient un tutoriel entier Ă eux seuls, donc nous n'en parlerons pas plus ici.