Le rôle des algorithmes dans la programmation. Algorithmisation, algorithmes, langages et programmes Logiciels de service PC et bases de l'algorithmisation

Pour écrire des applications de différents niveaux de complexité, vous devez d’abord acquérir des connaissances sur la manière de procéder. Et il est conseillé de commencer par les bases mêmes de l'algorithmique et de la programmation. Nous en parlerons dans l'article.

C'est le nom d'une science technique complexe dont la tâche est de systématiser les méthodes de création, de traitement, de transmission, de stockage et de reproduction des données. Elle comprend également des principes de fonctionnement et des méthodes de gestion qui permettent d'atteindre l'objectif. Le terme « informatique » lui-même est d’origine française et est un hybride des mots « information » et « automatisation ». Elle est née du développement et de la diffusion de nouvelles technologies de collecte, de traitement et de transmission des données, associées à leur enregistrement sur support informatique. C'est l'origine de l'informatique. Les bases de l’algorithmique et de la programmation constituent l’un des domaines les plus importants de cette science.

Que fait-elle?

L'informatique est confrontée aux défis suivants :

  1. Support matériel et logiciel pour la technologie informatique.
  2. Moyens pour assurer l'interaction entre les humains et les composants informatiques.

Le terme « interface » est souvent utilisé pour désigner la partie technique. Ici, nous avons un programme gratuit. Les bases de l'algorithmique et de la programmation sont toujours utilisées lors de la création de produits destinés à une distribution de masse qui « devraient » conquérir un large public. Après tout, pour être populaire, l’application développée doit fonctionner et avoir une apparence optimale.

Présentation des algorithmes

Ils peuvent être rédigés de nombreuses manières. Les plus populaires sont les suivants :

  1. Description verbale et formelle. Cela implique le placement de texte et de formules spécifiques qui expliqueront les caractéristiques de l'interaction dans tous les cas individuels.
  2. Diagramme. Cela implique la présence de symboles graphiques permettant de comprendre les caractéristiques de l’interaction du programme en lui-même et avec d’autres applications ou le matériel informatique. Chacun d’eux peut être responsable d’une fonction, d’une procédure ou d’une formule distincte.
  3. Cela implique la création de méthodes de description distinctes pour des cas spécifiques, qui montrent les caractéristiques et l'ordre des tâches.
  4. Diagrammes d'opérateur. Cela implique la création d'un prototype - il montrera l'interaction en fonction des chemins empruntés par les opérandes individuels.

Pseudocode. Esquisse du squelette du programme.

Enregistrement de l'algorithme

Comment commencer à créer votre propre prototype de programme, de fonction ou de procédure ? Pour ce faire, il suffit d'utiliser ces recommandations générales :

  1. Chaque algorithme doit avoir son propre nom, ce qui explique sa signification.
  2. Assurez-vous qu'il y a un début et une fin.
  3. Les données d’entrée et de sortie doivent être décrites.
  4. Vous devez spécifier les commandes qui seront utilisées pour effectuer certaines actions sur des informations spécifiques.

Méthodes d'enregistrement

Il peut y avoir jusqu'à cinq représentations de l'algorithme. Mais il n’y a que deux façons d’écrire :

  1. Formel-verbal. Il se caractérise par le fait que la description se fait principalement à l'aide de formules et de mots. Le contenu, ainsi que la séquence d'exécution des étapes de l'algorithme, sont dans ce cas rédigés en langage naturel professionnel sous forme libre.
  2. Graphique. Le plus courant. Il utilise des symboles de blocs ou des diagrammes algorithmiques. La connexion entre eux est représentée à l'aide de lignes spéciales.

Nous développons une structure de programme

Il en existe trois types principaux :

  1. Linéaire. Avec cette structure, toutes les actions sont exécutées séquentiellement dans l’ordre et une seule fois. Le diagramme ressemble à une séquence de blocs, disposés de haut en bas, en fonction de l'ordre dans lequel ils sont exécutés. Les données primaires et intermédiaires qui en résultent ne peuvent pas influencer la direction du processus de calcul.
  2. Branchement. Il a trouvé une large application dans la pratique lors de la résolution de problèmes complexes. Ainsi, s'il est nécessaire de prendre en compte des conditions initiales ou des résultats intermédiaires, alors les calculs nécessaires sont effectués conformément à ceux-ci et la direction du processus de calcul peut changer en fonction du résultat obtenu.

Cyclique. Pour vous permettre de travailler plus facilement sur de nombreuses tâches, il est logique de répéter plusieurs fois certaines sections du code du programme. Afin de ne pas prescrire combien de fois et ce qui doit être fait, une structure cyclique est utilisée. Il prévoit une séquence de commandes qui seront répétées jusqu'à ce qu'une condition donnée soit remplie. L'utilisation de boucles permet de réduire considérablement la complexité d'écriture d'un programme.

La programmation

Il est important sur quels programmes seront créés. Il convient de noter que beaucoup d'entre eux sont « adaptés » à des conditions de fonctionnement spécifiques (par exemple, dans un navigateur). En général, les langages de programmation sont divisés en deux groupes :

  1. Fonctionnel.
  2. Salles des opérateurs :

Pas de procédure ;

De procédure.

Pouvez-vous deviner lesquels sont les plus souvent utilisés ? Opérateur-procédural - c'est la réponse. Ils peuvent être centrés sur la machine ou indépendants. Les premiers incluent les assembleurs, les autocodes et le codage symbolique. Les indépendants se divisent selon leur orientation :

  • de procédure;
  • problématique;
  • objet.

Chacun d'eux a son propre champ d'application. Mais pour écrire des programmes (applications ou jeux utiles), les langages orientés objet sont le plus souvent utilisés. Bien sûr, vous pouvez en utiliser d'autres, mais le fait est qu'ils sont les plus développés pour créer des produits de consommation finale destinés au grand public. Oui, et si vous ne savez pas encore exactement par où commencer, je vous suggère de prêter attention aux bases de l’algorithmique et de la programmation orientée objet. C'est désormais une direction très populaire où vous pouvez trouver de nombreux matériels pédagogiques. En général, les bases de l'algorithmique et des langages de programmation sont désormais nécessaires en raison du manque de développeurs qualifiés, et leur importance ne fera que croître à l'avenir.

Conclusion

Lorsque vous travaillez avec des algorithmes (et ensuite avec des programmes), vous devez vous efforcer de réfléchir à tous les détails jusqu'aux plus petits. Par la suite, identifier chaque section de code non développée ne fera qu’entraîner un travail supplémentaire, augmentant les coûts de développement et les délais d’exécution des tâches. Une planification minutieuse et l’élaboration de toutes les nuances permettront d’économiser considérablement du temps, des efforts et de l’argent. Eh bien, maintenant, ils peuvent dire qu'après avoir lu cet article, vous comprenez les bases de l'algorithmique et de la programmation. Il ne reste plus qu'à appliquer ces connaissances. Si vous souhaitez étudier le sujet plus en détail, je peux vous recommander le livre « Fundamentals of Algorithmization and Programming » (Semakin, Shestakov) 2012.

2.4.1. Le concept d'algorithmes de base

2.4.2. Algorithmes de structure linéaire

2.4.3. Algorithmes de base pour les structures de branchement et exemples de leur programmation

2.4.4. Algorithmes de base pour les structures cycliques régulières et exemples de leur programmation

2.4.5. Algorithmes de base pour les structures cycliques itératives et exemples de leur programmation

2.4.6. Algorithmes de base pour le traitement des tableaux unidimensionnels

2.4.7. Algorithmes de base pour le traitement de tableaux bidimensionnels

2.4.8. Questions de test sur le thème « Algorithmes de base et exemples de leur mise en œuvre »

2.4.9. Tâches de test sur le thème « Algorithmes de base et exemples de leur mise en œuvre »

2.4.1. Le concept d'algorithmes de base

Les algorithmes de base de traitement des données sont le résultat de décennies de recherche et de développement. Mais ils continuent de jouer un rôle important dans l’utilisation croissante des processus informatiques.

Les algorithmes de programmation impérative de base comprennent :

    Les algorithmes les plus simples implémenter des structures algorithmiques de base.

    Algorithmes travailler avec des structures de données. Ils définissent les principes de base et la méthodologie utilisée pour mettre en œuvre, analyser et comparer les algorithmes. Fournit un aperçu des méthodes de présentation des données. De telles structures incluent des listes et des chaînes chaînées, des arbres et des types de données abstraits tels que des piles et des files d'attente.

    Algorithmes tri, conçus pour organiser des tableaux et des fichiers, revêtent une importance particulière. Les files d'attente prioritaires, les problèmes de sélection et les problèmes de fusion sont liés aux algorithmes de tri.

    Algorithmes recherche, conçu pour rechercher des éléments spécifiques dans de grandes collections d'éléments. Celles-ci incluent des méthodes de recherche de base et avancées utilisant des arbres et des transformations de clés numériques, notamment des arbres de recherche numériques, des arbres équilibrés, le hachage et des méthodes adaptées au travail avec des fichiers très volumineux.

    Algorithmes graphiques utile pour résoudre un certain nombre de problèmes complexes et importants. Une stratégie générale de recherche de graphes est développée et appliquée aux problèmes de connectivité fondamentaux, notamment le chemin le plus court, l'arbre couvrant minimum, le flux réseau et les problèmes de correspondance. L'approche unifiée de ces algorithmes montre qu'ils sont basés sur la même procédure, et que cette procédure est basée sur le type de données de file d'attente prioritaire abstraite sous-jacente.

    Algorithmes traitement des chaînes incluent un certain nombre de méthodes de traitement de (longues) séquences de caractères. La recherche d’une chaîne conduit à une correspondance de modèles, qui à son tour conduit à une analyse. Les technologies de compression de fichiers peuvent également être attribuées à cette classe de tâches.

2.4.2. Algorithmes de structure linéaire

Exemple 2.4.2-1.

où x = -1,4 ; y = 0,8 ; les variables k et k sont de type entier, les variables restantes sont de type réel ; [n] est la partie entière du nombre n.

Le schéma de l'algorithme et des programmes dans les langages QBasic, Pascal, C++ sont présentés dans la Fig. 2.4.2-1.

Veuillez noter que la variable entière k reçu une valeur arrondie n, et la variable entière m- tronqué à l'aide d'une fonction RÉPARER()à la partie entière de la valeur n.

Exemple 2.4.2-2. Calculez et affichez les valeurs suivantes :

où x = 2,9512 ; y = 0,098633 ; les variables i et j sont de type entier ; les variables restantes sont de type réel.

Le diagramme d'algorithme et les codes de programme sont présentés dans la Fig. 3.2.1-2.

Riz. 2.4.2-2.

Les résultats de l'exécution du programme avec les valeurs ci-dessus des données initiales ont la forme suivante :

Exemple 2.4.2-3. Calculez et affichez la valeur de la première vitesse d’échappement.

Formalisons-le. La vitesse minimale à laquelle un engin spatial dans le champ gravitationnel terrestre peut devenir un satellite artificiel est égale à

où est la constante gravitationnelle ; M – masse de la Terre ;
– distance du centre de la Terre au vaisseau spatial.

Le diagramme d'algorithme et les codes de programme sont présentés dans la Fig. 3.2.1-3.

Riz. 2.4.2-3.

Les résultats de l'exécution du programme avec les valeurs ci-dessus des données initiales ont la forme suivante.

Dernièrement, je pense de plus en plus à me tourner vers le métier de développeur. Qu'il s'agisse d'un manager, d'un consultant, d'un officier militaire, d'un physicien nucléaire ou d'un paysagiste, tout le monde voulait devenir programmeur. Essayons de comprendre pourquoi cela se produit et à quoi cela peut conduire.

Image de motivation :

Problème

En règle générale, les nouveaux spécialistes de moins de 30 ans deviennent des développeurs. Et plusieurs problèmes sérieux surgissent immédiatement :
  • 5 à 6 années perdues à étudier des matières et des sciences qui ne seront plus jamais nécessaires ;
  • Un changement nécessaire de pensée de l’humanitaire/technique vers la logique/numérique ;
  • Maîtriser un programme universitaire technique de 5 à 6 ans dans les plus brefs délais ;
  • Créer une menace pour la vie et le bien-être des personnes, des entreprises, des entreprises...

Temps

La question est : pourquoi une personne a-t-elle étudié des sciences dont elle n'avait pas besoin pendant plusieurs années ? Pourquoi vous êtes-vous soumis à un tel stress mental ? Pour ensuite tout laisser tomber et tout recommencer ? Même 5 ans, c'est long. Pendant ce temps, vous pouvez devenir milliardaire ou recevoir un prix Nobel, mais non, une personne étudie quelque chose qui ne l'intéresse pas, dort en cours et dit que la philosophie est un non-sens complet !

C'est bien s'il étudie dans un département rémunéré, mais que se passe-t-il aux frais de l'État ? Cela signifie que quelqu'un qui rêvait de devenir architecte, manager, financier, militaire n'est pas arrivé à cet endroit. Il a dû chercher un autre endroit au soleil, peut-être est-il allé étudier pour devenir programmeur.

Tout y est simple !

Combien de ces nouveaux « programmeurs » ont entendu parler de JAVA par Bruce Eckel. Ils se considèrent tous comme des génies de la programmation, et la POO, MVC, Agile, le système de nombres binaires, la théorie de la complexité informatique... ne sont pas pour eux.

Laissez-moi vous donner quelques exemples concrets :

  1. Le « programmeur » écrit la deuxième version du programme. Le premier avait un formulaire avec 50 boutons. La deuxième version a plus de fonctionnalités, mais sa logique n'est pas aussi transparente. Il est prévu d'écrire le programme sur quelques mois. La fonctionnalité comprend environ 100 boutons sur un formulaire. Après une introduction de 10 minutes à la théorie des graphes, le nombre de boutons a été réduit à un (suppression d'un point), et le temps d'écriture du programme a été réduit à deux jours.
  2. Le « programmeur » s’est vu confier la tâche d’écrire un programme de conversion. La logique est simple : un paquet de la forme clé=valeur arrive, vous devez utiliser une table spéciale pour le convertir en paquet2 de la forme clé2=valeur2 et l'envoyer plus loin. Après deux mois « d'apprentissage de la plateforme », il s'est vu remettre le cadre d'application (réception des paquets, transformation, envoi des colis) par des camarades seniors. Un mois plus tard, le convertisseur était prêt !
  3. Beaucoup vendaient des vélos ;
  4. Parlant pour lui-même http://govnokod.ru ;
Je ne peux dire qu'une chose : si la programmation était si simple, elle ne serait pas enseignée dans les universités avant cinq ans. Un cours de trois mois suffirait.

Talents

Bien sûr, on ne peut s’empêcher de mentionner les talents. Il y a des gens talentueux qui font des métiers différents, ils réussissent partout. Mais ils sont très peu nombreux. Il vaut mieux être un spécialiste compétent dans un domaine que dans plusieurs.

"Trouvez quelque chose que vous aimez et vous ne travaillerez jamais une seule minute de votre vie" - Confucius. Il est important de ne pas passer toute votre vie à chercher ce business, sinon vous devrez travailler dur toute votre vie.

L'odeur de la poudre à canon

C'est une très bonne idée de montrer en quoi consiste le développement. Un reniflement de poudre à canon, pour ainsi dire ! Les maires ont déjà commencé à étudier JS.

Dans une entreprise, mon ami et l'ensemble du service client ont appris comment mettre en page les pages et quelles étaient les balises. Ils ont même créé des pages simples.

Mais vous ne devriez pas considérer que vous savez tout sur la programmation après cela. Ce n'est que le début. Mais il faut ensuite étudier de nombreux matériaux et technologies complexes et plus simples, plusieurs volumes d’algorithmes et d’innombrables bonnes pratiques et techniques.

Conclusion

La programmation est un métier, le développement s'apparente à l'art. Pour les gens ordinaires, c'est de la magie, pour les programmeurs, c'est un travail acharné, la traduction de l'impermanence du monde environnant dans le monde des états finaux, des zéros et des uns, des limitations de la RAM, de la vitesse d'horloge des canaux et du processeur.

Pourtant, je pense que la plupart des « nouveaux programmeurs » s'efforcent de gagner plus : si vous restez là, vous gagnez de l'argent. Certes, ces personnes laissent tomber grandement leur équipe et ne travaillent pas à leur plein potentiel. Et si la direction ferme les yeux sur cela (oui, oui, cela arrive !), alors vous ne pourrez pas cuisiner de porridge avec eux, vous ne développerez pas Google.

Comme le montre la recherche. L'informatique en Russie n'est pas l'industrie la mieux payée. Elle n'occupe que la troisième place. Les industries des matières premières occupent la deuxième place et les cadres supérieurs occupent la première place. En raison des spécificités de l'informatique, un programmeur n'atteindra jamais le niveau de direction. Le maximum que vous puissiez espérer est le poste de chef de service, de direction dirigeante ou de directeur de votre propre entreprise.

Par conséquent, tirez vos propres conclusions. Changer de métier est une étape sérieuse et doit être soigneusement réfléchie. Au minimum, vous devrez suivre un cours de programmation moderne, ce qui prendra plus d'un an.

P.S. Dans les commentaires, ils posent des questions sur les objectifs de la note : être plus sérieux dans le choix d'un métier, ne faire que ce que l'on aime, étudier ce que l'on aime, évoluer professionnellement, et ne pas essayer un peu de tout sans objectif précis . C’est surprenant de voir des gens qui, à 30-40 ans, n’arrivent toujours pas à trouver quelque chose qui leur plaise.

1. Concept d'algorithme

Algorithme - il s'agit d'une instruction précise et compréhensible adressée à l'interprète pour effectuer une séquence d'actions visant à résoudre la tâche. Nom " algorithme" vient de la forme latine du nom du mathématicien d'Asie centrale al-Khwarizmi - Algorithmi.

Exécuteur d'algorithme- il s'agit d'un système abstrait ou réel (technique, biologique ou biotechnique) capable d'effectuer les actions prescrites par l'algorithme. L'interprète se caractérise par : l'environnement, les actions élémentaires, le système de commandement, les échecs. Mercredi(ou le décor) est « l’habitat » de l’artiste interprète ou exécutant . Chaque exécuteur ne peut exécuter des commandes qu'à partir d'une certaine liste strictement définie - systèmes de commande interprète. Pour chaque commande, les conditions d'applicabilité doivent être spécifiées (dans quels états environnementaux la commande peut être exécutée) et les résultats de l'exécution de la commande doivent être décrits. Après avoir appelé la commande, l'interprète exécute le correspondant action élémentaire. Les échecs des erreurs d'exécution se produisent si une commande est appelée alors que l'état de l'environnement est inacceptable pour elle.

En informatique, l’exécuteur universel des algorithmes est l’ordinateur.

2. Propriétés des algorithmes

On peut distinguer ce qui suit principales propriétés des algorithmes :

1) Compréhension pour l'interprète - c'est-à-dire L'exécuteur de l'algorithme doit savoir comment l'exécuter.

2) Discrétion(discontinuité, séparation) - c'est-à-dire l'algorithme doit représenter le processus de résolution d'un problème comme une exécution séquentielle d'étapes simples ou préalablement définies.

3) Certitude- c'est à dire. Chaque règle de l’algorithme doit être claire, sans ambiguïté et ne laisser aucune place à des divergences.

4) Efficacité(ou membre). Cette propriété est que l’algorithme doit conduire à une solution au problème en un nombre fini d’étapes.

5) Caractère de masse- signifie que l'algorithme de résolution du problème est développé sous une forme générale, c'est-à-dire il devrait être applicable à une certaine classe de problèmes qui ne diffèrent que par les données initiales. Dans ce cas, les données initiales peuvent être sélectionnées dans une certaine zone appelée champ d'application de l'algorithme.

3. Formes de présentation des algorithmes

Le plus commun formes de représentation des algorithmes sont : verbaux, graphiques, pseudocodes et logiciels.

1) Forme verbale les enregistrements sont une description des étapes successives du traitement des données en langage naturel (par exemple en russe).

Exemple.Écrivez un algorithme pour trouver le plus grand diviseur commun (PGCD) de deux nombres naturels.

Algorithme : 1) définir deux nombres ; 2) si les nombres sont égaux, prenez l'un d'entre eux comme réponse et arrêtez-vous, sinon continuez à exécuter l'algorithme ; 3) déterminer le plus grand des nombres ; 4) remplacer le plus grand nombre par la différence entre le plus grand et le plus petit nombre ; 5) répétez l'algorithme de l'étape 2.

L'algorithme décrit est applicable à tous les nombres naturels et devrait conduire à résoudre le problème en un nombre fini d'étapes.

La méthode verbale n'est pas répandue, puisque de telles descriptions :

a) ne sont pas strictement formalisés ;

b) souffrent de la verbosité des entrées ;

c) permettre une ambiguïté dans l'interprétation des instructions individuelles.

2) Méthode graphique la représentation des algorithmes est plus compacte et visuelle que la représentation verbale. Lorsqu'il est exécuté graphiquement, l'algorithme est représenté comme une séquence de blocs fonctionnels interconnectés, dont chacun correspond à l'exécution de l'une des actions. Cette représentation graphique est appelée un organigramme ou diagramme . Dans l'organigramme, chaque type d'action correspond à une figure géométrique appelée symbole de bloc. Bloquer la connexion des personnages lignes de transition, déterminant l'ordre d'exécution des actions.

Plus d'informations à ce sujet ci-dessous...

3) Pseudocode est un système de notation et de règles conçu pour un enregistrement uniforme des algorithmes. Il occupe une place intermédiaire entre les langages naturels et formels.

D’une part, il est proche du langage naturel ordinaire, de sorte que les algorithmes peuvent y être écrits et lus comme du texte ordinaire. D'un autre côté, le pseudocode utilise mots de fonction et le symbolisme mathématique, qui rapproche la notation de l’algorithme de la notation mathématique généralement acceptée. Les mots fonctionnels sont surlignés en gras dans le texte imprimé et soulignés dans le texte manuscrit afin de pouvoir être distingués du reste du texte.

Exemple. 1) spécifier deux nombres x et y ; 2) SI x=y, ALORS GCD=x et FIN ; 3) SI x>y, ALORS x=x-y, SINON y=y-x ; 4) ALLER au point 2.

4) Formulaire de programme représente les textes de programmes écrits dans divers langages de programmation.

Vous trouverez ci-dessous les symboles graphiques sur les schémas fonctionnels.

structure « suivre »

Fourche complète

Fourche incomplète

Boucle avec précondition

(cycle BYE)

Boucle avec postcondition (boucle DO)

Boucle avec paramètre

Dans les diagrammes, SÉRIE désigne un ou plusieurs opérateurs quelconques ; CONDITION est une expression logique (LE) (si sa valeur est VRAIE, la transition se produit le long de la branche OUI, sinon - le long de la branche NON). Dans le schéma d'un cycle avec un paramètre, les désignations suivantes sont utilisées : PTs - paramètre de cycle, NZ - valeur initiale du paramètre de cycle, KZ - valeur finale du paramètre de cycle, Ш - étape de changement du paramètre de cycle.

Le début et la fin de l'algorithme dans les diagrammes fonctionnels sont indiqués par un ovale ; les variables d'entrée et de sortie sont écrites dans un parallélogramme.

). Le développement d'un programme utilisant un tel système de programmation comprend deux étapes : 1) création des éléments de l'interface graphique du programme en mode visuel ; 2) développement du code du programme. Cette approche simplifie grandement la création de programmes, car développer manuellement une interface graphique (dans des langages procéduraux) est un processus complexe et chronophage.

La première étape pour comprendre l’importance d’étudier et de connaître les algorithmes est de définir avec précision ce que l’on entend par algorithme. Un algorithme en programmation est séquence d'actions claire et préciseécrit dans un langage de programmation. Selon le livre populaire Algorithms: Construction and Analysis (Cormen, Leiserson, Rivest, Stein), « un algorithme est toute procédure de calcul bien définie dont l'entrée reçoit une certaine quantité ou un certain ensemble de quantités, et dont le résultat est une valeur de sortie ou un ensemble de valeurs. En d’autres termes, les algorithmes sont comme des feuilles de route pour atteindre un objectif clairement défini. Le code de calcul des termes de la séquence de Fibonacci est une implémentation d'un algorithme spécifique. Même une simple fonction d’addition de deux nombres est un algorithme, même s’il est simple.

Pour créer un algorithme (programme), vous devez savoir :

    un ensemble complet de données de tâche initiales (état initial de l'objet) ;

    le but de créer l'algorithme (l'état final de l'objet) ;

    le système de commande de l'interprète (c'est-à-dire un ensemble de commandes que l'interprète comprend et peut exécuter).

L'algorithme (programme) résultant doit avoir l'ensemble de propriétés suivant :

    discrétion(l'algorithme est divisé en étapes distinctes - commandes) ;

    sans ambiguïté(chaque commande détermine la seule action possible de l'interprète) ;

    clarté(toutes les commandes de l'algorithme sont incluses dans le système de commandes de l'exécuteur) ;

    efficacité(l'interprète doit résoudre le problème en un nombre fini d'étapes).

La plupart des algorithmes ont également la propriété caractère de masse(en utilisant le même algorithme, vous pouvez résoudre de nombreux problèmes similaires).

Certains algorithmes, comme ceux permettant de calculer la séquence de Fibonacci, sont intuitifs et font appel à une pensée logique innée et à des compétences en résolution de problèmes. Cependant, la plupart d’entre nous feraient bien d’apprendre des algorithmes complexes afin de pouvoir, à l’avenir, les utiliser comme éléments de base pour résoudre plus efficacement des problèmes de logique. En fait, vous pourriez être surpris du nombre d’algorithmes complexes que les gens utilisent pour consulter leurs e-mails ou écouter de la musique. Cet article présente quelques idées de base sur l'analyse des algorithmes, avec des exemples pratiques illustrant l'importance de l'étude des algorithmes.

Un langage de programmation est un ensemble de règles permettant d'enregistrer des structures et des données algorithmiques.


Analyse du temps d'exécution de l'algorithme

L’un des aspects les plus importants de l’algorithme est sa rapidité. Il est souvent facile de proposer un algorithme qui résout un problème, mais si l'algorithme est trop lent, il est renvoyé pour révision. Étant donné que la vitesse exacte d'un algorithme dépend de l'endroit où l'algorithme s'exécute, ainsi que des détails de mise en œuvre, les informaticiens parlent généralement du temps d'exécution par rapport aux données d'entrée. Par exemple, si l'entrée est constituée de N entiers, alors l'algorithme peut avoir un temps d'exécution proportionnel à N 2 , qui est représenté par O(N 2 ). Cela signifie que si vous exécutez l'implémentation de l'algorithme sur un ordinateur avec une entrée de taille N, cela prendra C*N 2 secondes, où C est une constante qui ne change pas lorsque la taille de l'entrée change.

Cependant, le temps d’exécution de nombreux algorithmes complexes dépend non seulement de la taille des données d’entrée, mais également de nombreux autres facteurs. Par exemple, un algorithme permettant de trier un ensemble d’entiers peut s’exécuter beaucoup plus rapidement si l’ensemble est déjà trié. Il est d'usage de parler du pire cas d'exécution et du cas moyen d'exécution. Le temps d’exécution dans le pire des cas est la durée maximale pendant laquelle un algorithme peut s’exécuter compte tenu de la « pire » de toutes les entrées possibles. Le cas d'exécution moyen est le temps d'exécution moyen de l'algorithme sur toutes les entrées possibles. Parmi les deux types de temps d’exécution, le pire des cas est le plus facile à raisonner et est donc plus souvent utilisé comme référence pour un algorithme donné. Le processus de détermination du temps d’exécution d’un algorithme dans le pire des cas et dans le cas moyen peut être assez complexe car Il n'est généralement pas possible d'exécuter l'algorithme pour toutes les entrées possibles.

Nous avons vu plus haut qu’un même algorithme peut être écrit de différentes manières. Vous pouvez écrire l'algorithme langage naturel. C'est ainsi que nous utilisons les recettes, les instructions, etc. Pour enregistrer des algorithmes destinés aux artistes formels, spéciaux langages de programmation. Tout algorithme peut être décrit graphiquement sous la forme d'un schéma fonctionnel. Un système de notation spécial a été développé à cet effet :

Désignation

Description

Remarques

Début et fin de l'algorithme

Entrée et sortie de données.

La sortie de données est parfois appelée différemment :

Action

Dans les algorithmes informatiques, cela est utilisé pour désigner l'affectation

Fourchette

Fork - un composant nécessaire pour implémenter des branches et des boucles

Démarrer une boucle avec un paramètre

Processus typique

En programmation - procédures ou sous-programmes

Transitions entre les blocs

Donnons un exemple de description de l'algorithme de sommation de deux quantités sous forme de schéma bloc :

Cette façon de décrire l’algorithme est la plus visuelle et la plus compréhensible pour les humains. Par conséquent, les algorithmes d'exécution formels sont généralement développés d'abord sous la forme d'un organigramme, puis seulement un programme est créé sur l'un d'eux.

Tri

Le tri est un bon exemple d’algorithme souvent utilisé par les programmeurs. Le moyen le plus simple de trier un groupe d’éléments est de commencer par supprimer le plus petit élément du groupe et de le placer en premier. Ensuite, le deuxième plus grand élément est supprimé et placé en deuxième position, et ainsi de suite. Malheureusement, le temps d'exécution de cet algorithme est O(N 2), ce qui signifie qu'il prendra un temps proportionnel au nombre d'éléments au carré. Si nous devions trier des milliards d’éléments, alors cet algorithme nécessiterait 10 18 opérations. Si nous supposons que les ordinateurs de bureau typiques effectuent environ 10 9 opérations par seconde, il faudra alors des années pour terminer le tri de ces milliards d'éléments.

Heureusement, il existe un certain nombre d’algorithmes plus avancés, tels que le tri rapide, le tri par tas et le tri par fusion. Ces algorithmes ont un temps d'exécution de O(N * Log(N)). Ainsi, le nombre d'opérations nécessaires pour trier des milliards d'éléments est réduit à des limites tellement raisonnables que même l'ordinateur de bureau le moins cher peut effectuer un tel tri. Au lieu d'un milliard d'opérations au carré (10 18), ces algorithmes ne nécessitent que 10 milliards d'opérations (10 10), soit 100 millions de fois plus rapide.

Chemin le plus court

Les algorithmes permettant de trouver le chemin le plus court d’un point à un autre sont étudiés depuis de nombreuses années. Il existe de nombreux exemples d'applications appliquées de ces algorithmes, mais pour des raisons de simplicité de présentation, nous nous en tiendrons à l'énoncé suivant : nous devons trouver le chemin le plus court d'un point A à un point B dans une ville comportant plusieurs rues et intersections. Il existe de nombreux algorithmes différents pour résoudre ce problème et ils ont tous leurs propres avantages et inconvénients. Avant de nous y plonger, examinons le temps d'exécution d'un simple algorithme de force brute. Si un algorithme considère tous les chemins possibles de A à B (qui ne forment pas de cycles), il est peu probable qu'il se termine de notre vivant, même si A et B se trouvent dans une petite ville. Le temps d'exécution de cet algorithme est exponentiel, qui est noté O(C N) pour certains C. Même pour de petites valeurs de C, C N devient un nombre astronomique lorsque N devient modérément grand.

L'un des algorithmes les plus rapides pour résoudre ce problème a un temps d'exécution de O(E+V*Log(V)), où E est le nombre de segments de route et V est le nombre d'intersections. L'algorithme prendra environ 2 secondes pour trouver le chemin le plus court dans une ville de 10 000 intersections et 20 000 segments de route (généralement environ 2 segments de route par intersection). Cet algorithme est connu sous le nom d'algorithme de Dijkstra, il est assez complexe et nécessite l'utilisation d'une structure de données de file d'attente prioritaire. Cependant, dans certains cas, même ce temps d'exécution est trop lent (prenons par exemple pour trouver le chemin le plus court de New York à San Francisco - il y a des millions d'intersections aux États-Unis), dans de tels cas, les programmeurs tentent d'améliorer le temps d'exécution en utilisant ainsi -appelée heuristique. Une heuristique est une approximation de quelque chose qui est pertinent pour une tâche. Dans un problème de chemin le plus court, par exemple, il peut être utile de connaître la distance entre un point et une destination. Sachant cela, vous pouvez développer un algorithme plus rapide (par exemple, l’algorithme de recherche A* fonctionne dans certains cas beaucoup plus rapidement que l’algorithme de Dijkstra). Cette approche n'améliore pas toujours le temps d'exécution de l'algorithme dans le pire des cas, mais dans la plupart des applications du monde réel, l'algorithme s'exécutera plus rapidement.

Algorithmes approximatifs

Parfois, même l’algorithme le plus avancé doté des heuristiques les plus avancées est trop lent sur l’ordinateur le plus rapide. Dans de tels cas, il est nécessaire de réduire la précision du résultat final. Au lieu d’essayer d’obtenir le chemin le plus court, vous pouvez vous limiter à un chemin qui est, par exemple, 10 % plus grand que le chemin le plus court.

En fait, il existe de nombreux problèmes importants pour lesquels les algorithmes actuellement connus produisent trop lentement le résultat optimal. Le groupe le plus connu de ces problèmes est appelé NP (polynôme non déterministe). Si un problème est appelé NP-complet ou NP-difficile, cela signifie que personne ne connaît une méthode suffisamment efficace pour obtenir la solution optimale. De plus, si quelqu'un développe un algorithme efficace pour résoudre un problème NP-difficile, alors cet algorithme peut être appliqué à tous les problèmes NP-difficiles.

Un bon exemple de problème NP-difficile est le problème du voyageur de commerce. Un vendeur souhaite visiter N villes, et il sait combien de temps il faut pour se rendre d’une ville à une autre. La question est de savoir à quelle vitesse pourra-t-il visiter toutes les villes ? L'algorithme connu le plus rapide pour résoudre ce problème est trop lent - et beaucoup pensent qu'il le sera toujours - donc les programmeurs recherchent des algorithmes suffisamment rapides pour donner une bonne solution, mais souvent pas optimale.

Algorithmes aléatoires

Une autre approche utilisée pour résoudre certains problèmes consiste à rendre l’algorithme aléatoire. Cette approche n'améliore pas le temps le plus défavorable de l'algorithme, mais fonctionne bien souvent dans le cas moyen. L'algorithme de tri rapide est un bon exemple d'utilisation de la randomisation. Dans le pire des cas, l'algorithme de tri rapide trie un groupe d'éléments en O(N 2), où N est le nombre d'éléments. Si la randomisation est utilisée dans cet algorithme, les chances que le pire des cas se produise deviennent négligeables et, en moyenne, l'algorithme de tri rapide s'exécute en un temps O(N*Log(N)). D'autres algorithmes garantissent même le temps d'exécution de O(N*Log(N)) dans le pire des cas, mais sont plus lents dans le cas moyen. Bien que les deux algorithmes aient un temps d'exécution proportionnel à N*Log(N), l'algorithme de tri rapide a un facteur constant plus petit - c'est-à-dire il nécessite C*N*Log(N), tandis que d'autres algorithmes nécessitent plus de 2*C*N*Log(N) opérations.

Un autre algorithme utilisant des nombres aléatoires recherche la médiane d'un groupe de nombres et sa durée d'exécution moyenne est O(N). C'est beaucoup plus rapide que l'algorithme qui trie les nombres et prend la moyenne, et s'exécute en O(N*Log(N)). Il existe des algorithmes déterministes (non aléatoires) qui peuvent trouver la médiane en un temps O(N), mais l'algorithme aléatoire est plus facile à comprendre et souvent plus rapide que ces algorithmes déterministes.

L'idée principale de l'algorithme de recherche médiane est de sélectionner un nombre aléatoire parmi les nombres et de compter combien de nombres dans le groupe sont inférieurs au nombre sélectionné. Disons qu'il y a N nombres, K d'entre eux sont inférieurs ou égaux au nombre sélectionné. Si K est inférieur à la moitié de N, alors nous savons que la médiane est le (N/2-K)ème nombre supérieur au nombre aléatoire, nous rejetons donc K nombres inférieurs ou égaux au nombre aléatoire. Supposons maintenant que nous voulions trouver le (N/2-K)ème plus petit nombre, au lieu de la médiane. L'algorithme est le même, nous sélectionnons simplement un nombre au hasard et répétons les étapes décrites.

Compression

Une autre classe d'algorithmes est conçue pour la compression des données. Cet algorithme n'a pas de résultat attendu (comme un algorithme de tri), mais optimise selon certains critères. Dans le cas de la compression de données, un algorithme (par exemple LZW) essaie de faire en sorte que les données occupent le moins d'octets possible, mais en même temps, afin qu'elles puissent être décompressées dans leur forme originale. Dans certains cas, ce type d’algorithme utilise les mêmes méthodes que d’autres algorithmes, ce qui donne un bon résultat, mais pas optimal. Par exemple, JPG et MP3 compressent les données de telle manière que le résultat final est de moins bonne qualité que l'original, mais également de plus petite taille. La compression MP3 ne préserve pas toutes les caractéristiques du fichier audio d'origine, mais elle tente de préserver suffisamment de détails pour fournir une qualité acceptable tout en réduisant considérablement la taille du fichier. Le format JPG suit le même principe, mais les détails sont sensiblement différents car... le but est de compresser l'image, pas l'audio.

Pourquoi avez-vous besoin de connaître toutes sortes d’algorithmes ?

Pour utiliser correctement les algorithmes, il est important de connaître tous les types d’algorithmes mentionnés. Si vous devez développer un logiciel important, vous devriez alors pouvoir estimer la vitesse de votre algorithme. La précision de votre estimation dépend de votre maîtrise de l’analyse du temps d’exécution des algorithmes. De plus, il est nécessaire de connaître les détails des algorithmes, ce qui nous permettra de prédire les cas particuliers dans lesquels le programme ne fonctionnera pas rapidement ou produira des résultats inacceptables.

Bien sûr, il y aura des moments où vous tomberez sur des problèmes jusqu’alors inexplorés. Dans de tels cas, vous devez proposer un nouvel algorithme ou appliquer l’ancien algorithme d’une nouvelle manière. Plus vous en savez sur les algorithmes, plus vous avez de chances de trouver une bonne solution à un problème. Dans de nombreux cas, un nouveau problème peut facilement être réduit à un ancien, mais pour ce faire, vous devez avoir une compréhension fondamentale des anciens problèmes.

À titre d'exemple, considérons le fonctionnement des commutateurs réseau. Le commutateur est connecté à N câbles et reçoit les paquets de données provenant de ces câbles. Le commutateur doit d'abord analyser les paquets, puis les renvoyer via le câble approprié. Un commutateur, comme un ordinateur, fonctionne en mode discret : les paquets sont envoyés à intervalles discrets plutôt qu'en continu. Un commutateur rapide s'efforce d'envoyer autant de paquets que possible pendant chaque intervalle, sinon ils s'accumuleront et le commutateur plantera. Le but de l'algorithme est d'envoyer le nombre maximum de paquets pendant chaque intervalle, et également de garantir un ordre dans lequel les paquets arrivant plus tôt que les autres sont également envoyés plus tôt que les autres. Dans ce cas, il s’avère qu’un algorithme appelé « correspondance stable » est adapté pour résoudre ce problème, même si à première vue cela n’est pas évident. De telles connexions entre problème et solution ne peuvent être découvertes qu’en utilisant des connaissances algorithmiques déjà existantes.

Exemples réels

Il existe de nombreux exemples de solutions à des problèmes réels qui nécessitent les algorithmes les plus récents. Presque tout ce que vous faites sur un ordinateur dépend d’algorithmes que quelqu’un a mis beaucoup de temps à développer. Même les programmes les plus simples n’existeraient pas sans les algorithmes qui fonctionnent en arrière-plan pour gérer la mémoire et charger les données du disque dur.

Il existe des dizaines d'exemples d'utilisation d'algorithmes complexes, mais nous aborderons deux problèmes dont la solution nécessite les mêmes compétences que la résolution de certains problèmes sur TopCoder. Le premier problème est connu sous le nom de problème de débit maximum, et le second implique la programmation dynamique, une technique qui peut souvent résoudre des problèmes à une vitesse apparemment impossible.

Algorithme pour trouver le débit maximum

Le problème de trouver le débit maximum est d’utiliser le réseau existant pour déplacer au mieux quelque chose d’un endroit à un autre. Ce problème particulier s’est posé pour la première fois dans les années 1950 à propos des lignes ferroviaires de l’Union soviétique. Les États-Unis voulaient savoir à quelle vitesse l’Union soviétique pourrait transporter des matériaux vers ses États satellites d’Europe de l’Est via son réseau ferroviaire.

En outre, les États-Unis voulaient savoir quelle partie des rails pouvait être détruite le plus facilement afin de couper les États satellites du reste de l'Union soviétique. Il s’est avéré que les deux problèmes étaient étroitement liés et que la résolution du problème du débit maximum résolvait également le problème de la coupure minimale, ce qui révélerait finalement le moyen le moins coûteux de couper l’Union soviétique de ses satellites.

Le premier algorithme efficace pour trouver le débit maximum a été inventé par les scientifiques Ford et Fulkerson. L'algorithme a ensuite été nommé algorithme de Ford-Fulkerson et est l'un des algorithmes les plus célèbres dans le domaine de l'informatique. Au cours des 50 dernières années, l’algorithme a subi un certain nombre d’améliorations, le rendant plus rapide (même si certaines de ces améliorations sont redoutables par leur complexité).

La tâche étant clairement définie, de nombreuses applications différentes ont été découvertes. L’algorithme est directement connecté à Internet, où il est important de transporter un maximum de données d’un point à un autre. Le problème se pose également dans divers processus métiers et constitue une partie importante de la recherche opérationnelle. Par exemple, s'il y a N employés et N tâches à accomplir, mais que tous les employés ne peuvent pas gérer toutes les tâches, alors trouver le flux maximum donnera une solution pour affecter N employés à des tâches de telle sorte que chaque tâche soit terminée, à condition que Peut-être . Le problème de graduation de TopCoder SRM 200 est un bon exemple de problème de flux maximum.

Comparaison de séquence

De nombreux codeurs n’ont jamais eu à mettre en œuvre un algorithme utilisant la programmation dynamique au cours de toute leur carrière. Cependant, la programmation dynamique est utilisée dans un certain nombre d’algorithmes importants. L'un des algorithmes consiste à trouver les différences entre deux séquences, que la plupart des programmeurs ont probablement utilisées, même s'ils ne l'ont peut-être pas compris. Cet algorithme calcule le nombre minimum d'insertions, de suppressions et de modifications requises pour convertir la séquence A en séquence B.

Par exemple, considérons les séquences « AABAA » et « AAAB ». Pour convertir la première séquence en seconde, le plus simple est de supprimer le B du milieu et de changer le dernier A en B. Cet algorithme a de nombreuses applications, notamment certains problèmes liés à la détection de l'ADN et du plagiat. Cependant, de nombreux programmeurs l'utilisent principalement pour comparer les versions du même fichier de code source. Si les éléments de la séquence sont des lignes d'un fichier, alors cet algorithme permet de savoir quelles lignes doivent être supprimées, insérées, modifiées afin de convertir une version du fichier en une autre.

Sans programmation dynamique, il faut passer par un nombre exponentiel de transformations pour passer d’une séquence à une autre. Cependant, la programmation dynamique réduit le temps d'exécution de l'algorithme à O(N*M), où N et M sont le nombre d'éléments dans deux séquences.

Conclusion

Comme il existe de nombreux problèmes différents, il existe autant d’algorithmes différents pour les résoudre. Cependant, il y a de fortes chances que le problème que vous essayez de résoudre soit similaire à un autre problème d’une certaine manière. En développant une compréhension approfondie d’un large éventail d’algorithmes, vous serez en mesure de sélectionner le bon algorithme et de l’appliquer pour résoudre un problème. De plus, résoudre des problèmes lors de compétitions sur TopCoder vous aidera à perfectionner vos compétences dans ce domaine. Beaucoup de ces problèmes semblent artificiels et irréalistes, mais ils nécessitent le même ensemble de connaissances algorithmiques que celles requises quotidiennement dans le monde réel.

Avez-vous aimé l'article? Partager avec des amis: