l'asile.fr


Algorithmique (ta mère !)

article de Ceacy , publié le 18 mars 2006 à 16:26
Vous avez toujours voulu briller en société, mais, malheureusement, vos 5k!llz à Quake 3 ou vos compétences culinaires ne vous en ont jamais laissé la possibilité ? Pas de problème, il vous suffira de lire cet article afin de maîtriser les bases de l'algorithmique. À vous les soirées mondaines, le champagne et les filles au décolleté plongeant !
Tout d'abord, définissons ce qu'est un algorithme : ce serait dommage de perdre la face devant vos futures groupies. Un algorithme est une méthode utilisée afin de parvenir de manière certaine à un but précis, en décomposant la démarche nécessaire en un nombre fini d'étapes élémentaires. On atteint des sommets de clarté, je sais : pour résumer, disons que c'est un peu comme une recette.
Par exemple, mettons que vous vouliez boire un verre d'eau; on pourrait écrire l'algorithme permettant d'y arriver ainsi:
- prendre un verre
- le positionner sous le robinet
- ouvrir le robinet d'eau froide
- tant que le verre n'est pas plein, le laisser sous le robinet
- fermer le robinet
- porter le verre à la bouche
- incliner le verre

Bien entendu, on utilise rarement des algorithmes pour boire des verres d'eau. En général, on les utilise plutôt en mathématiques - par exemple, pour calculer le PGCD de deux nombres avec l'algorithme d'Euclide, ou dans le cadre de démonstrations comme le théorème des valeurs intermédiaires - ou en informatique.
En programmation, quasiment tout tourne autour des algorithmes: pour déterminer l'ensemble des polygones à afficher dans un moteur 3D, pour trouver le chemin le plus court entre deux points dans un jeu vidéo, ou pour résoudre une grille de Sudoku.
En effet, un ordinateur ne peut effectuer, basiquement, que des opérations simples. Pour effectuer quelque chose de complexe, comme par exemple trier une liste de nombres par ordre croissant, il est nécessaire de le décomposer et d'écrire un algorithme, qu'on traduira ensuite en langage de programmation (on dit qu'on implémentera l'algorithme: encore un mot à placer dans toute bonne conversation pour provoquer des lueurs d'admiration béate).

Je ne vais pas vraiment tout détailler, parce que je n'ai pas les compétences, le savoir et le temps nécessaires, mais je vais faire de mon mieux pour présenter différents sujets, illustrés par des exemples simples: les algorithmes itératifs, les algorithmes récursifs, et la complexité d'un algorithme.

Mais d'abord, quelques concepts de base :

Structures conditionnelles

Par "structures conditionnelles", on désigne deux sortes de choses: les "tests" et les boucles. Mettons que je souhaite que des opérations ne soient effectuées que si l'âge du capitaine est égal à 76 ans, et que, dans le cas contraire, on fasse du café, je vais utiliser un test de ce genre:
SI age = 76 ALORS
// FAIRE QUELQUE CHOSE
SINON
FAIRE_CAFÉ()
FIN SI var is_code=true;
(le code ici, et tout au long de l'article, n'est pas écrit dans un réel langage de programmation: c'est du "pseudo code", destiné à rendre les algorithmes clairs)

Voici la forme générale:
SI [condition] ALORS
[instructions]
SINON SI [condition] ALORS
[instructions]
SINON
[instructions]
FIN SI var is_code=true;

Maintenant, les boucles. Cela consiste à exécuter un bloc d'instructions plusieurs fois sur des données dont les valeurs peuvent changer, tant qu'une condition est réalisée. Voici les deux principaux types de boucles :
TANT QUE [condition] FAIRE
[instructions]
FIN TANT var is_code=true;
POUR variable = [valeur de départ] À [valeur de fin]
[instructions]
FIN POUR var is_code=true;
Dans la seconde sorte de boucle, on utilise un compteur (ici i) qui sera incrémenté à chaque tour de boucle qui sera répétée tant que la condition (i<=5) est vérifiée :
POUR i = 0 À 5
AFFICHER(i)
FIN POUR var is_code=true;
Renverra : 0 1 2 3 4 5

Algorithmes itératifs

Ce terme désigne, un peu pompeusement, des algorithmes qui sont basés sur des boucles. Ainsi, si je veux calculer la somme des n premiers nombres (sans appliquer une chose aussi bassement dénuée d'intérêt qu'une formule), je peux passer en revue tous ces nombres, dans une boucle, et les ajouter au fur et à mesure:
fonction SOMME( entier n )
{
RESULTAT = 0
POUR i = 1 À n
RESULTAT = RESULTAT + i
FIN POUR
RENVOYER RESULTAT
} var is_code=true;

Pour calculer n! (factorielle n, c'est-à-dire le produit de tous les entiers de 1 à n):
fonction FACT( entier n )
{
PRODUIT = 1
POUR i = 2 À n
PRODUIT = PRODUIT * i
FIN POUR
RENVOYER PRODUIT
} var is_code=true;

Voilà, le tour rapide des algorithmes itératifs est bouclé. Passons maintenant aux algorithmes récursifs, qui sont bien plus marrants.

Algorithmes récursifs
Récursif, adj.: INFORMAT. Qui s'appelle ou se met en jeu répétitivement et automatiquement. Voir "récurrent".
Un algorithme récursif, c'est un algorithme qui s'appelle lui-même, encore et encore: un bon exemple vaut mieux qu'un long discours, réécrivons l'algorithme des factorielles de manière récursive:
fonction FACT( entier n )
{
SI n = 0 ALORS RENVOYER 1
SINON RENVOYER ( n * FACT(n - 1) )
FIN SI
} var is_code=true;
Première observation: c'est plus court. En revanche, il un peu plus difficile de se représenter mentalement ce que ça va faire.
Si j'appelle FACT(3), que va-t-il se passer ?
FACT(3) : (RENVOYER 3 * FACT(2) )
FACT(2) : (RENVOYER 2 * FACT(1) )
FACT(1) : (RENVOYER 1 * FACT(0) )
FACT(0) : RENVOYER 1 var is_code=true;
La fonction renverra donc 3 * 2 * 1 * 1, soit 6 (et, heureusement, on a bien 3! = 6). Personnellement, je trouve cela bien plus élégant que la version itérative, mais chacun son truc.

Deux remarques, toutefois:
* Chaque algorithme récursif doit comporter une condition d'arrêt (ici, "SI n = 0"). Dans le cas contraire, la récursion se fera de manière infinie, ou, plus précisément, jusqu'à ce que l'ordinateur soit sur les genoux - vu que l'algorithme ne s'arrêtera en théorie jamais. Il est très important de bien concevoir sa condition d'arrêt: par exemple, si j'appelle ma fonction FACT avec un nombre négatif, je risque d'avoir un petit problème.
* La grande majorité (voire la totalité ?) des algorithmes récursifs peuvent s'écrire sous forme itérative. On préfère une forme à l'autre pour des raisons d'élégance (un algorithme récursif de 3 lignes contre un algorithme itératif de 20, ou l'inverse), de clarté ou de performances (un appel récursif de fonction introduit une petite consommation de mémoire supplémentaire, la "pile" de la fonction: c'est négligeable, sauf quand la fonction est appelée récursivement un milliard de fois).

Complexité d'un algorithme

Pour évaluer l'efficacité d'un algorithme, il y a quelques dizaines d'années, on disait "tel algorithme a mis tant de temps à s'effectuer sur tel ordinateur, en tel langage". Vu le nombre de modèles d'ordinateurs différents, de types de processeurs différents et de langages différents, il a fallu trouver quelque chose de plus révélateur.
En gros, on parle désormais de complexité algorithmique, désigné par O(f(n)), f étant une fonction mathématique et n le nombre de données à traiter (par exemple, dans le cadre d'un algortihme visant à trier une liste, n serait le nombre d'éléments de la liste).

Un algorithme en O(1) est constant, quel que soit le nombre de données ; un autre en O(n) est dit en complexité linéaire.
Par exemple, un algorithme en O(100n) est moins efficace qu'un en O(n²) tant que n < 100. La plupart du temps, un algorithme en O(log(n)) est le plus performant.

La complexité d'un algorithme est la plupart du temps une complexité moyenne : pour certaines valeurs de n ou dans certaines conditions, un algorithme censé être le plus performant peut se révéler un très mauvais choix. De plus, il faut également tenir compte de contraintes matérielles (mémoire disponible sur la machine, notamment).
Bref, la complexité est un indicateur, mais ne résume pas tout (quoique, à choisir entre un algorithme en O(n) et un en O(n^8), il est peu probable que le second soit le meilleur).

Voilà, c'est plus ou moins fini. J'aurais bien aimé parler des applications des algorithmes en IA ou dans les jeux vidéo, mais j'ai trop peur de dire des idioties :)

Sources de l'article

Article sur Wikipédia


Compléments de l'article

France-IOI (exercices d'algorithmie)
Prologin (idem)


article de Ceacy — publié le 18 mars 2006 à 16:26
Lien permanent vers cet article | Aller sur le blog de Ceacy
213 oui (sur 497 votes)

Article intéressant ?

Écrire un article

Bon article, je vais enfin pouvoir accéder au monde élitiste et aux prostituées.


samedi
18 mars 2006, 17:13
 
 

hohun
#2 Sonny Crockett

Ceacy a écrit
Un algorithme est une méthode utilisée afin de parvenir de manière certaine à un but précis, en décomposant la démarche nécessaire en un nombre fini d'étapes élémentaires.


Alors là, c'est sciences-po direct.


samedi
18 mars 2006, 19:31
 
 

Et au fait Ceacy, tu as eut les résultats de ton concours ?
Sinon, bon article, mais j'aurais mieux vu quelques images de babes comme tu l'avais annoncé.


<a href='http://edheltar.free.fr/radio.blog/' target='_blank'>radio.blog</a>
samedi
18 mars 2006, 20:50
 
 

Algorithmique c'est une nouvelle danse, succedant de la macarena?


samedi
18 mars 2006, 22:25
 
 

hohun
#5 Sonny Crockett

Kat a écrit :Algorithmique c'est une nouvelle danse, succedant de la macarena?

Non, c'est un groupe anglais des années 80.


samedi
18 mars 2006, 22:32
 
 

Attention on vous ment, j'ai reperé pas mal d'erreurs, comme par exemple l'algorithmique permet de briller en société (ayant une fois éteint la lumière je me suis aperçu que c'était faux). les filles ca marche pas non plus, pour le champagne, ca ne marche que si on se le paye soi même.
Malheureusement l'algorithmique n'est pas reconnu, aux yeux du petit peuple, à sa juste valeur.

Sinon très bon article. on est gaté à l'Asile avec tout ces petit dossiers, il n'y a aucune raison de vouloir en sortir.


Heureux ceux qui n&#39;attendent rien car il n&#39;auront pas plus &#33;
samedi
18 mars 2006, 22:36
 
 

Je suis le premier à l'avouer, j'ai rien compris et tellement ça m'à plu, je suis pas allé jusqu'au bout. Faut croire que j'ai le cerveau dans la bite...


samedi
18 mars 2006, 23:39
 
 

L'algorithmique, ou le meilleur moyen de formater l'esprit des étudiants en informatique.


Avec un U.
dimanche
19 mars 2006, 10:53
 
 

Ellendhel
#9 gnagnagna

Arnogoki a écrit :les filles ca marche pas non plus


Exception à la règle : si l'on donne cours à des z'étudiantes à la fin de l'été ou au printemps on peut effectivement apercevoir des décolletés. Marche aussi avec ce qui dépasse des pantalons taille basse.


dimanche
19 mars 2006, 11:22
 
 

La fonction renverra donc 3 * 2 * 1 * 1, soit 6 (et, heureusement, on a bien 3! = 6). Personnellement, je trouve cela bien plus &eacute;l&eacute;gant que la version it&eacute;rative, mais chacun son truc.


La mani&egrave;re it&eacute;rative ne te fait pas utiliser plus de pile ? j'ai le sentiment que tu empiles un espace m&eacute;moire de la taille de n &agrave; chaque nouvel appel de la fonction.


dimanche
19 mars 2006, 12:23
 
 

Ceacy
#11 Me, Myself and I

C'est la récursive qui utilise plus la pile, d'après ce que j'ai lu/compris : itérative, tu utilises juste, en mémoire, la variable qui te sert de compteur. En récursif, tu as l'appel de la fonction (stockage dans la pile des paramètres, du pointeur de retour vers le flux d'exécution, etc).


dimanche
19 mars 2006, 12:46
 
 

D'accord, mais de toute façon, comme tu l'écrivais, cette quantité de mémoire et cette très légère perte de performance ne se fait sentir que si tu appelle plein de fois ta fonction non ? Ou sur un ordinateur avec une mémoire limite.


dimanche
19 mars 2006, 14:09
 
 

Ceacy
#13 Me, Myself and I

Si ta fonction récursive prend en paramètre deux entiers naturels "longs", soit 8 octets au total, et qu'elle s'appelle récursivement un million de fois, ça fera au total plus de 8 Mo d'utilisés (car je ne sais pas la proportion de la pile utilisée par les autres données stockées lors de l'appel d'une fonction). Un milliard de fois, ça ferait 8 Go ...


dimanche
19 mars 2006, 14:40
 
 

Mais alors, est-ce que P=NP ?

Non parce que des fois j'ai du mal avec tout ça...


dimanche
19 mars 2006, 17:53
 
 

j'ai écris itérative, mais je pensais éffectivement à récursive. Pourquoi la trouves tu plus élégante, étant donné qu'elle est moins éfficace que la fonction itérative. Non seulement pour l'utilisation de la pile, mais elle double le nombre d'instructions asm éxécutées à chaque boucle (saut + , réservation de la pile + retour ).


dimanche
19 mars 2006, 23:10
 
 

Zoup
#16 Syndicaliste

Le principe d'un truc élégant c'est justement que c'est plus joli mais pas forcément plus efficace. Un costard c'est élégant mais ça tient moins chaud qu'une laine polaire (:/).
Quand on voit la fonction récursive on voit tout de suite qu'elle est plus courte et plus propre, même si effectivement elle est moins performante.

Sarki >
Je sais pas si ta question est sérieuse ou ironique mais si tu trouves la réponse, envoie-moi un PM, merci.
Hem.


lundi
20 mars 2006, 02:57
 
 

Zoup a écrit :
Sarki >
Je sais pas si ta question est sérieuse ou ironique mais si tu trouves la réponse, envoie-moi un PM, merci.
Hem.



D'abord, je la dépose. Ensuite je verrais si je me permet de la révéler au grand public.
(On peut toujours rêver)


mardi
21 mars 2006, 01:56
 
 


Ajouter un commentaire

Vous devez être identifié pour poster un commentaire.

# 16:52:09
(Sarki) 11:24:16 Justement c'est pas Microids qui a fait le dev, ils sont intervenus en tant que sponsors en fin de projet pour les épauler un peu. Bon par contre ça sent le studio très jeune je te l'accorde
# 11:24:16
(Akshell) les jeux microids ne sont pas toujours très bien finis... et le changement dans le style graphique... bof
# 18:28:50
(Sarki) par contre question comm c'est un zéro pointé, même leur site n'indique pas la sortie officielle...
# 18:25:29
(Sarki) En parlant de AAA, est sorti sur Steam le 14 Novembre un remake plutot pas mal de Little Big Adventure, avec un gameplay moins frustrant
# 07:52:22
(hohun) Et niveau gaming ya la masse de bons jeux qui ne sont plus des AAA qui font turbiner la CG donc le besoin se ressent moins qu'en 2005
# 07:51:51
(hohun) perso j'ai un portable gamer de 2019 qui continue à fonctionner impec, bon évidemment je joue pas des masses à des jeux dernière génération mais les jeux des années 2010 tournent bien en haut niveau de détail
# 07:50:35
(hohun) À mon sens ce sont les deux choses les plus importantes. Après tu peux prendre un bon proc et une bonne CG mais pas besoin de faire dans l'excès
# 07:49:55
(hohun) Et un bon SSD NVMe dernière génération
# 07:49:16
(hohun) Si c'est pour 10 ans tape dans les 32 Go de ram
# 17:38:42
(plantmann) 07:32:35 Oui, je ne savais pas si ça existait encore quand j'ai posé la question. Je pense que je vais me baser là dessus, avec sans doute plus de RAM pour gérer le scénario "Firefox avec 200+ onglets" tranquillement
lire la suite de la tribune