Bonjour,
Après trois années de prépa maths, j'ai passé quelques concours, dont celui d'informatique de l'ENS (ça s'est bien passé), pour lequel on a une épreuve d'informatique fondamentale.
Voici l'extrait de l'énoncé (la seule partie que j'ai traitée) :
« On définit un graphe orienté comme un ensemble de points (sommets) et un ensemble de couples de points (arêtes orientées). Un chemin est une suite d'arêtes telles que l'origine d'une arête soit toujours l'extrémité de la précédente. On suppose que les graphes considérés ici ont N sommets, et que l'on dispose d'une fonction f(X, Y) qui indique, pour X et Y deux sommets, s'il existe un chemin entre X et Y.
1. Écrire un algorithme qui, à partir de deux sommets S et T détermine s'il existe un chemin de S à T. La complexité temporelle doit être dominée par N^2.
2. Écrire un algorithme qui répond à cette même question, avec une complexité spatiale dominée par log(N)^2. (les indices des arêtes, étant des nombres entre 1 et N, occupent un espace dominé par log(N)) Peu importe la complexité temporelle. »
Je vous laisse chercher. La réponse à la seconde question (vers laquelle l'examinateur m'a laborieusement orienté) m'a paru très surprenante (et même, d'un point de vue esthétique, assez laide). J'indique la solution en commentaire, pour ceux qui veulent savoir sans avoir trop à chercher.
# Trop facile !
Posté par Mr Kapouik (site web personnel) . Évalué à 10.
Bref l'ENS ne forme sûrement pas de bon décideurs pressés !
[^] # Re: Trop facile !
Posté par Laurent Cligny (site web personnel) . Évalué à 1.
Les cauchemars au beau milieu de la nuit se font plus rares ou seulement moins intenses ?
[^] # Re: Trop facile !
Posté par Mr Kapouik (site web personnel) . Évalué à 4.
Je suis sûr que ça va finir par une histoire autour du nombre 42 de toute manière !
[^] # Re: Trop facile !
Posté par Laurent Cligny (site web personnel) . Évalué à 4.
https://linuxfr.org/~ploum/27723.html
Ton commentaire y ressemblait tellement, que j'étais persuadé que tu étais l'auteur du journal à l'époque. J'aurais dû vérifier.
[^] # Re: Trop facile !
Posté par Mr Kapouik (site web personnel) . Évalué à 3.
Bref Ploum n'a rien inventé mais il a su exploiter correctement un fait connu par tout ceux qui ont eut à faire à des SSII ou à des décideurs pressés.
# Spanning tree
Posté par the_glu . Évalué à 3.
[^] # Re: Spanning tree
Posté par alexissoft . Évalué à 1.
Ca doit faire un truc genre O(N^2+A) à la très grosse louche (où A le nombre d'arêtes).
[^] # Re: Spanning tree
Posté par Thomas Douillard . Évalué à 2.
[^] # Re: Spanning tree
Posté par Yth (Mastodon) . Évalué à 1.
Ce ne sont que des ordres de grandeur, la constante est négligeable.
Et si je me souviens bien on doit même avoir O(a*n²)=O(n²).
Yth.
[^] # Re: Spanning tree
Posté par Thomas Douillard . Évalué à 2.
le nombre d'arête c'est au maximum le nombre de couple de sommets, t'as n sommets, donc le nombre de sommets = a = n² (tu fais le produit cartésien, il doit y en avoir moins mais on s'en fout ici, on fait du O(n²) )
Donc on a pas du tout besoin de la constante "a" ici, c'est même incorrect d'en faire une constante puisqu'il varie potentiellement avec la taille du graphe, et qu'on sait le compter dans le pire des cas, si je me trompe pas.
Donc du coup O(a+n²) = O( n² + n²) = O(n²)
[^] # Re: Spanning tree
Posté par Dabowl_92 . Évalué à 5.
[^] # Re: Spanning tree
Posté par alexissoft . Évalué à 3.
[^] # Re: Spanning tree
Posté par Thomas Douillard . Évalué à 6.
# Avec Twitter, c'est facile...
Posté par guillaje (site web personnel) . Évalué à 8.
->[]
[^] # Re: Avec Twitter, c'est facile...
Posté par jcs (site web personnel) . Évalué à 6.
Et pour ceux qui ne connaissent pas l'histoire :
http://www.20minutes.fr/article/333761/France-Il-tente-de-tr(...)
[^] # Re: Avec Twitter, c'est facile...
Posté par nicko . Évalué à -1.
Dans la vraie c'est comme ça que ça marche de toutes façon ...Moi je lui aurais validé son exam.
[^] # Re: Avec Twitter, c'est facile...
Posté par lasher . Évalué à 4.
[^] # Re: Avec Twitter, c'est facile...
Posté par Thierry Thomas (site web personnel, Mastodon) . Évalué à 6.
[^] # Re: Avec Twitter, c'est facile...
Posté par jeffcom . Évalué à 2.
[^] # Re: Avec Twitter, c'est facile...
Posté par thedude . Évalué à 4.
D'aucuns ont essaye de mettre du python a l'exam de flash, mais il parait que, d'une part, les eleves n'ont pas apprecie, d'autre part les entreprises embauchant lesdits eleves se seraient plaintes que leur nouvelles recrues auraient tente de compiler du python dans flash mx ou flex builder et que ca marche pas.
# Solution
Posté par Samuel (site web personnel) . Évalué à 8.
On se base sur une tableau à N éléments indiquant si on a croisé tel sommet ou pas, et sur une liste de sommets pour lesquels on cherche à lister les sommets qui sont liés :
Existe_chemin1 (T, croisés, liste) :
Si liste est vide : renvoyer faux
S «- tête (liste)
Si S = T : renvoyer vrai
Pour i de 1 à N
Si f(S, i) = 1 et croisés[i] = faux :
croisés[i] «- vrai
liste «- empiler (i, liste)
Finsi
Fin pour
Existe_chemin (T, croisés, liste)
Fin
Et on lance le programme avec un tableau 'croisés' rempli de valeur 'faux' (sauf pour S), et 'liste' qui vaut [S].
Pour la seconde question, c'est plus compliqué.
On remarque que, s'il existe un chemin de S à T, on peut choisir U à peu près au milieu du chemin, avant de vérifier qu'il existe un chemin entre S et U puis entre U et T. Pour éviter de faire des boucles, il va falloir retenir les sommets parcourus précédemment. C'est-à-dire qu'on invoquera les fonctions :
Existe_chemin2 (S, U, empiler (U, liste)) et Existe_chemin2 (U, T, empiler (U, liste)).
Par ce procédé, tant qu'on choisit U de manière optimale, la taille de la liste n'excédera jamais log(N).
Pour éviter de faire exploser la complexité dans le cas où il n'existe pas de chemin entre S et T, il suffit de contrôler la taille de la liste : si elle dépasse log(N) (ou une limite arbitraire un peu au-dessus, comme 2*log(N)), on sait que le choix de U était incorrect, ou alors qu'il n'existe pas de chemin entre S et T.
Ensuite, pour trouver le U correct, comme on a aucun indice nous permettant de le deviner, il suffit de tous les tester (on se fiche de la complexité temporelle). Ça donne :
Existe_chemin2 (S, T, liste)
Si S=T : renvoyer vrai
Si taille(liste) > 2*log(N) : renvoyer faux
U «- 1
résultat «- faux
Tant que U <= N et résultat = faux
résultat «- Existe_chemin2 (S, U, empiler (U, liste)) et Existe_chemin2 (U, T, empiler (U, liste))
U «- U+1
Fin tant que
Renvoyer résultat
Fin
Je n'ai jamais été habitué à faire un contrôle sur la taille d'une liste pour ne pas faire exploser la complexité (ça me parait 'sale'), ni à tester toutes les options pour en trouver une bonne au milieu (ça fait exploser la complexité). Ici, la complexité temporelle du seconde algorithme est au moins de N^log(N) !
[^] # Re: Solution
Posté par Damien Thébault . Évalué à 5.
Je n'ai jamais été habitué à faire un contrôle sur la taille d'une liste pour ne pas faire exploser la complexité (ça me parait 'sale')
J'ai l'impression que c'est quelque chose de commun, par exemple en pathfinding.
En A*, on sait dans quelle direction est la destination.
Si les 2 points ne sont pas connectés, il va falloir tester tout le graphe pour s'en rendre compte, ce qui va être long quand on a un grand graphe. Ou bien on peut abandonner l'idée de trouver une solution au bout d'un certain nombre d'essais.
Dans le cadre d'un jeu vidéo, ça peut être envisageable sachant que du coup c'est le joueur qui va choisir un autre point plus proche/accessible.
(En réalité, pour un jeu, je trouve plus commode de faire un algo pour détecter les différents graphes déconnectés, puis de lancer l'algo si les 2 points sont connectés, ça évite de perdre du temps à tester une solution puisqu'on sait à l'avance que ça ne marchera pas, mais ça dépend un peu du contexte à chaque fois)
(Et effectivement, ça fait gagner du temps mais ça fait utiliser plus de mémoire)
Ici, la complexité temporelle du seconde algorithme est au moins de N^log(N) !
Oui, je dirais que souvent, la complexité mémoire/spatiale évolue inversement par rapport à la complexité temporelle.
[^] # Commentaire supprimé
Posté par Anonyme . Évalué à 2.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Re: Solution
Posté par Samuel (site web personnel) . Évalué à 2.
Cependant, dans les faits, les données identifiant le graphe sont forcément présentes quelque part (puisqu'on peut accéder à toutes les arêtes).
[^] # Re: Solution
Posté par Gof (site web personnel) . Évalué à 2.
par ailleur, avec une pone implémentation de la liste, tu n'utilise que log(N) d'espace.
[^] # Re: Solution
Posté par Gof (site web personnel) . Évalué à 5.
il faut replacer la ligne
Si S=T : renvoyer vrai
par
si f(S,T) OU S=T : renvoyer vrai
# Les graphs pour les ingénieurs ...
Posté par Ririsoft . Évalué à 3.
Pour résoudre le problème énoncé on pourrait s'appuyer sur le DiGraph et la fonction shortest_path par exemple ...
[^] # Re: Les graphs pour les ingénieurs ...
Posté par Mr Kapouik (site web personnel) . Évalué à 10.
Cette approche de résolution me choque ! Les vrais hommes prennent un stylo et une feuille de papier et avec seulement leur cerveau ils arrivent à résoudre le problème ! Les puristes pourront comme au temps des grecques graver leur solution dans du marbre.
Non mais c'est quoi ces solutions de facilité ! Manquerait plus qu'on invente un logiciel de rendu html pour faciliter la lecture des sites internet tant qu'on y est !
[^] # Re: Les graphs pour les ingénieurs ...
Posté par 2PetitsVerres . Évalué à 6.
Tous les nombres premiers sont impairs, sauf un. Tous les nombres premiers sont impairs, sauf deux.
[^] # Re: Les graphs pour les ingénieurs ...
Posté par ナイコ (site web personnel) . Évalué à 10.
[^] # Re: Les graphs pour les ingénieurs ...
Posté par Elfir3 . Évalué à 5.
[^] # Re: Les graphs pour les ingénieurs ...
Posté par jeffcom . Évalué à 4.
# euh...
Posté par 2PetitsVerres . Évalué à 10.
Dans l'énoncé, on dit qu'on dispose d'une fonction f(X, Y) qui indique pour X et Y deux sommets, s'il existe un chemin entre X et Y.
Et on demande d'écrire une fonction qui fait pareil.
Je propose la fonction g(S, T) = f(S, T) j'ai bon ? Ou alors on me répond que je ne suis pas sûr que c'est dominé par N^2 ?
Tous les nombres premiers sont impairs, sauf un. Tous les nombres premiers sont impairs, sauf deux.
[^] # Re: euh...
Posté par the_glu . Évalué à 3.
[^] # Re: euh...
Posté par Samuel (site web personnel) . Évalué à 5.
[^] # Re: euh...
Posté par Batchyx . Évalué à 4.
[^] # Re: euh...
Posté par Zorro (site web personnel) . Évalué à 3.
[^] # Re: euh...
Posté par yellowiscool . Évalué à 2.
Puis pour se connecter sur un autre ordinateur que le sien, on y passe 10 minutes, c'est pratique.
Envoyé depuis mon lapin.
[^] # Re: euh...
Posté par 2PetitsVerres . Évalué à 2.
Tous les nombres premiers sont impairs, sauf un. Tous les nombres premiers sont impairs, sauf deux.
[^] # Re: euh...
Posté par Zorro (site web personnel) . Évalué à 1.
Ceci dit, c’est cool que ça puisse être fait et correctement affiché dans les navigateurs modernes, hein, je dis pas !
[^] # Re: euh...
Posté par 2PetitsVerres . Évalué à 2.
Tous les nombres premiers sont impairs, sauf un. Tous les nombres premiers sont impairs, sauf deux.
# Analogique
Posté par fleny68 . Évalué à 3.
Avec des bouts de ficelle, en considérant les arc non orientés, réalisés un modèle en fil du noeud:
Plus qu'à prendre les les noeuds S et T et à tirer. Si tu trouve un chemin c'est le plus court, plus qu'à vérifier l'orientation des arcs; tu coupes au ciseau si l'orientation ne donne pas un chemin de S à T et tu recommences.
[^] # Re: Analogique
Posté par fleny68 . Évalué à 1.
[^] # Re: Analogique
Posté par hocwp (site web personnel) . Évalué à 3.
http://upload.wikimedia.org/wikipedia/commons/6/6e/Noeud_de_(...)
Désolé -----> [ ]
[^] # Re: Analogique
Posté par fleny68 . Évalué à 0.
désolé aussi -------->[]
# Et ?
Posté par ribwund . Évalué à 2.
Du coup t'as été pris ?
[^] # Re: Et ?
Posté par Samuel (site web personnel) . Évalué à 2.
Mais je n'ai passé l'info que pour Lyon. Je vais plutôt aller à Ulm (concours MPI - physique), pour lequel je suis aussi sur liste principale.
[^] # Re: Et ?
Posté par djibb (site web personnel) . Évalué à 2.
[^] # Re: Et ?
Posté par ribwund . Évalué à 1.
Sinon pour les gens qui sont recalés à Lyon, y'a plein de place pour les auditeurs (et si vous faites le master de Nice derrière, y'a un joli financement à la clé).
[^] # Re: Et ?
Posté par Oscar Blumberg . Évalué à 0.
M'étonnerais qu'on fasse mieux l'année prochaine ;)
(futur MP* de ton (ex-)prépa)
# Ma réponse
Posté par Beretta_Vexee . Évalué à 2.
Question 2: Bon la ca devient plus complex, on a un graph orienté potentiellement cyclique et il s'agit de le parcourir avec une complexité spatial de log(n)^2. Déjà il n'y pas d'algo classique pour ce problème qui viennent a l'esprit immédiatement.
On est pas limité en niveau temporelle donc on peut envisager des solution bien gruick, genre l'exploration aléatoire ( j'ai log(N)^2 explorateur qui parte de S et se balade aléatoirement sur le graph, ont ajout deux trois règles genre pas plus d'un explorateur par sommet, etc ), mais bon on est pas a l'abri d'une belle fermeture transitive qui enferme tous les explorateurs.
Y a peut être des solutions basé sur les tri topologique mais vue que ton graph peut être cyclique ca ne marche pas non plus.
On peut imaginer de tests tous les chemins de longueur log(N)^2 de manière itérative, mais si on a un graph peut dense ou cyclique ca ne marche pas non plus.
La solution m'intéresse, parce qu'a part l'exploration aléatoire j'ai pas d'idée.
[^] # Re: Ma réponse
Posté par thedidouille . Évalué à 1.
[^] # Re: Ma réponse
Posté par Duncan Idaho . Évalué à 3.
# Félicitation!
Posté par oao . Évalué à 1.
Signé: l'autre Bizien
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.