Est-ce que la programmation ou l'informatique en général, est tout au sujet des algorithmes?

40

En tant qu'étudiant diplômé, je trouve qu'il est de plus en plus courant que des entreprises prestigieuses (telles que Google, Facebook, Microsoft, ...) insèrent des questions d'algorithme dans leurs tests et leurs entretiens. Quelques startups auxquelles j'ai postulé ont également posé des questions sur les algorithmes. Je me demande si la fluidité des algorithmes est la chose la plus importante pour les développeurs de logiciels dans ces entreprises?

Si la réponse est oui, quelles sont les meilleures méthodes ou ressources pour apprendre et pratiquer efficacement les algorithmes? Je ne peux pas sembler intéressé à résoudre des problèmes apparemment trop compliqués trouvés dans la plupart des manuels ou des sites Web. Bien que je comprenne facilement les algorithmes de base (tels que quicksort, bubblesort, ...), je trouve extrêmement difficile de se rappeler et de les réutiliser plus tard.

Merci.

P / S: Si vous me demandez ce que j’aime, c’est construire de bons logiciels pour résoudre les problèmes des utilisateurs de manière innovante. Je suppose que cela ne signifie pas nécessairement que le logiciel doit être très compliqué.

wakandan
la source
26
Avez-vous une idée de la complexité avec laquelle Google peut vous permettre d'effectuer des recherches sur l'ensemble du Web avec une zone de texte et un bouton?
JeffO
21
@JeffO Je n'utilise même plus le bouton ;-)
maple_shaft
1
Si Google facilite les choses, tous les autres sites de recherche n'auront pas besoin de code.
JeffO
Je pensais que la question concernerait le fonctionnement des ordinateurs, comme le fonctionnement d’un processeur, de la mémoire vive, du wifi, etc. C’est une question assez intéressante qui fait encore l’objet de nombreuses recherches. Je trouve toujours le matériel plus génial que toute la programmation geeks en java ou php.
jokoon
2
Il n’ya pas que des algorithmes, mais ils sont au cœur de CS. Mais la programmation ne se limite pas aux algorithmes et à la logique (la maintenance du code, par exemple, ne nécessite pas uniquement une connaissance des algorithmes).
Hayem

Réponses:

44

Les algorithmes sont clairs

Voici la belle chose à propos des algorithmes: l’espace du problème qu’ils traitent est bien défini, c’est-à-dire que vos exigences sont non seulement réellement connues , mais aussi généralement formalisées, à l’instar des métriques de la qualité de la solution.

Donc, si je vous dis de proposer un algorithme, il n’ya pas beaucoup de risque de problèmes de communication, et mesurer vos performances est une tâche triviale. Dans le même temps, votre performance est un assez bon indicateur de votre capacité à penser de manière logique.

Les algorithmes sont un filtre efficace

Le problème actuel de l'industrie (et de l'éducation) est la piètre qualité moyenne des diplômés. Ceci a été illustré avec le test FizzBuzz , qui est:

Ecrivez un programme qui va parcourir les nombres de 1 à 100 et affichera "fizz" si le nombre est divisible par 3, "buzz" s'il est divisible par 5 et le nombre lui-même s'il n'est divisible par aucun des deux.

Apparemment, la majorité des diplômés de Comp Sci ne parviennent pas à résoudre ce problème. Veuillez noter qu’il s’agit d’une question algorithmique, bien que celle-ci soit d’une simplicité embarrassante. Dans ces conditions, si vous rencontrez quelqu'un qui peut résoudre le type de problèmes décrit dans Google Code Jam ou Project Euler, vous profitez déjà de la crème de la crème.

Les algorithmes sont une infime partie du développement logiciel

La vérité est que, dès que vous travaillerez dans l'industrie, vous n'utiliserez pas vos compétences en algorithme plus de 1% du temps.

Avant même de commencer à écrire du code, vous devez d’abord rassembler et analyser les exigences. Ensuite, vous devez synthétiser votre conception sur cette base. Ensuite, vous devez mettre en œuvre la conception. Ensuite, vous devez évaluer l'implémentation par rapport aux exigences d'origine, puis itérer les exigences, puis itérer la conception, puis itérer l'implémentation, etc.

L'une des exigences est la performance raisonnable . Si cette exigence n'est pas remplie, vous devez définir votre implémentation afin de localiser les goulots d'étranglement, puis de l'optimiser. Il s'agit parfois d'une micro-optimisation simple (ce qui est assez facile à faire), mais parfois d'une question de en utilisant de meilleurs algorithmes (ce qui n’est pas toujours facile à réaliser par la suite). Par conséquent:

Les algorithmes sont critiques

Plus vous maîtriserez mieux les algorithmes, plus grande sera votre chance de réussir du premier coup. Sinon, vous rencontrerez non seulement un problème qui ne peut être résolu qu'en implémentant un meilleur algorithme, mais vous ne pourrez pas le résoudre réellement.
Ainsi, bien que vous n’ayez presque jamais besoin de cette compétence, elle présente un point d’échec unique dans votre méthodologie de développement et si vous n’avez pas cette compétence, vous ne pouvez qu’espérer que la nécessité ne se produira jamais ou que quelqu'un d’autre interviendra pour la réparer. toi.

Ce qui est vraiment important, c’est d’avoir une idée de la complexité informatique et de la façon de la minimiser, comme je l’ai également expliqué en réponse à une question similaire . Ou se spécialiser dans des domaines où cela n’est tout simplement pas important, comme le développement d’interfaces graphiques, mais presque tout le monde le déteste… pour une raison!

back2dos
la source
5
+1 pour une réponse très complète et intelligente. En outre, l'efficacité d'un filtre FizzBuzz est triste. Il n'y a absolument aucune excuse pour ne pas pouvoir le faire.
Adam Crossland
4
Je pensais que vous devriez imprimer fizzbuzzsi le nombre était divisible par les deux et que beaucoup y portaient parce que vous deviez commander avec soin modulo.
Matthieu M.
1
1% peut être un peu trop élevé
chanvre
1
@MatthieuM .: l'impression des deux est inhérente à la formulation de l'exigence. Manquer cela signifie que vous n'avez pas vérifié les exigences avec soin; Maintenant, ce que je trouve intéressant, c'est que cela ne dit pas que vous devez les imprimer dans un ordre particulier, ou même toujours dans le même ordre ...
jmoreno
1
@ back2dos: Oui, mais le faire dans un ordre aléatoire semble plus amusant ... Notez que l'exigence donnée dans cette réponse ne mentionne pas les lignes, mais simplement l' impression . Si vous passez un test FizzBuzz, il peut être intéressant de souligner qu’il renferme de nombreuses hypothèses inexprimées (là encore, cela pourrait vous faire passer pour un sage).
Jmoreno
30

En général, la programmation en tant que travail ne concerne pas les algorithmes. Vous pouvez passer des années à programmer des applications CRUD sans avoir besoin de compétences approfondies en algorithme.

La programmation en tant que travail consiste à:

  1. La communication:

    • Votre code source est un moyen de communiquer vos idées à vos pairs. Si personne ne peut lire / comprendre votre code, cela ne vaut rien.

    • Un développeur isolé qui ne parle à aucun autre développeur commencerait probablement à faire des erreurs dans le code et penserait que sa propre approche est la seule acceptable.

    • Vous devez savoir comment communiquer avec les parties prenantes, le service d'assurance qualité, les utilisateurs, les concepteurs visuels, les administrateurs de base de données, etc.

    • En tant que développeur expérimenté, vous devez former des collègues moins expérimentés qui souhaitent améliorer leurs compétences.

  2. Connaissance des bons outils: contrôle de version, système de suivi des bogues, IDE, quel langage est le mieux adapté à une tâche spécifique et pourquoi, comment utiliser l'analyse de code, etc.

  3. Vaste connaissance et culture: qu'est-ce qu'un langage fonctionnel? Comment les ordinateurs interprètent le code? Pourquoi le LOC n'est-il pas une mesure? etc.

  4. Connaissance approfondie de la ou des langues avec lesquelles vous travaillez.

  5. Algorithmes.

L'informatique, par contre, est davantage orientée vers les algorithmes. Si vous travaillez en tant que scientifique, cela n’a peut-être rien à voir avec un travail de développeur, et vous travaillerez davantage sur la façon d’optimiser un algorithme, de transformer une représentation de données en un autre, etc.

Arseni Mourzenko
la source
12
-1: "Les applications CRUD" sont des algorithmes. Ils sont simplement (généralement) simples. Il n'y a pas de "noble signification".
S.Lott
2
et le code source est votre seul canal de communication avec l'ordinateur qui fait exactement ce que vous lui dites de faire (et presque jamais ce que vous voulez qu'il fasse)
freak freak
5
Il est étonnant de constater à quel point le marché permet de nettoyer les applications CRUDdy dont les équipes d’ingénierie ont ignoré (ou n’ont jamais appris) les bases des algorithmes.
JasonTrue
2
@ S.Lott: "Les applications CRUD sont des algorithmes" est analogue à "Je suis l'Amérique". ;)
Jim G.
1
@ JimG: Comme Steven Colbert a déclaré: "Je suis l'Amérique et vous le pouvez aussi". Les applications CRUD contiennent, sont basées sur, incluent, sont des implémentations de, sont des réalisations de, incarnent, reflètent des algorithmes. Vous vous êtes seulement plaint, sans suggérer une préposition spécifique. Ce qui vous aurait rendu plus heureux?
S.Lott
16

Je pense que les questions sur les algorithmes dans les entretiens sont l’un des principaux moyens par lesquels les entreprises tentent de juger de la compréhension des candidats des bases de l’informatique. Bien que ce ne soit pas le seul domaine de compétences important pour un programmeur professionnel, il fait partie des compétences de base d'un bon programmeur.

Je pense que beaucoup de grandes entreprises mettent l’accent sur les principes de base de la CS dans leur processus d’interview, c’est que c’est la compétence de base qui est le moins développée après l’obtention de son diplôme et son entrée sur le marché du travail. La capacité de programmation pratique, les compétences en conception, les pratiques en matière d’ingénierie logicielle, etc., sont toutes des choses qui sont principalement développées par l’expérience, alors que les principes de base de votre CS sont principalement développés au cours de votre formation.

En ce qui concerne la pratique de la conception d’algorithmes, Steve Yegge recommande le manuel de conception des algorithmes de Skiena dans son excellent guide sur les entretiens en tant que programmeur .

Andrew B
la source
4
+1: les langages de programmation, les frameworks, les systèmes d'exploitation, les éditeurs, les outils, tout ça va et vient, mais savoir comment résoudre efficacement les problèmes dépend de la connaissance des bases des structures de données et des algorithmes. Ces choses restent avec nous toujours.
Adam Crossland
"En ce qui concerne la pratique de la conception d’algorithmes, Steve Yegge recommande le manuel de conception des algorithmes de Skiena dans son excellent guide sur les entretiens en tant que programmeur." Désolé, mais cela pourrait ne pas s’appliquer à la personne qui a posé cette question, car il s’agit d’un étudiant diplômé. Google / MS est passé de Skiena (pour les étudiants diplômés) à poser des questions qui sont apparues dans les compétitions internationales de programmation collégiale. (Cela je le sais avec certitude par expérience anecdotique). Le livre de Skiena est toujours utilisé, mais principalement pour les candidats de premier cycle.
user396089
En ce qui concerne les questions qui apparaissent dans les compétitions de programmation - vous êtes quasiment désemparé si vous n’avez pas vu la question auparavant (à moins que votre QI soit également à 3
écarts
11

En tant que développeur de logiciels à succès, autodidacte et n'ayant suivi que quelques cours d'informatique à l'université, je dirai que les plus gros problèmes auxquels sont confrontées les entreprises aujourd'hui ne sont pas la capacité pour tous leurs programmeurs d'écrire un algorithme de tri à bulles de la manière la plus efficace. possible. Les vrais problèmes que rencontrent les entreprises:

  • Les développeurs qui ne peuvent pas apprendre rapidement et s'adapter à de nouveaux domaines

  • Les développeurs qui ne peuvent pas socialement interagir avec les clients ou les parties prenantes de manière significative

  • Développeurs qui ne peuvent pas deviner et remettre en question des exigences commerciales incorrectes ou mal conçues

  • Les développeurs qui ne comprennent pas comment tester en profondeur leur code et leurs fonctionnalités

  • Développeurs qui ne peuvent pas fournir d’estimations significatives en temps voulu

  • Les développeurs qui ne peuvent pas créer une documentation claire et concise

  • Les développeurs qui ne peuvent pas être autonomes ou prendre en charge une situation

Neuf fois sur dix, je parierai que presque toutes les circonstances dans lesquelles un développeur s'effondre dans une entreprise sont dues au fait qu'elles échouent désespérément à l'une des qualités décrites ci-dessus. Oubliez Google et Facebook, ils constituent des cas exceptionnels et ont un besoin légitime de personnes qui comprennent profondément la science informatique.

Les vraies entreprises ne se heurtent pas aux complexités de l'informatique, elles se heurtent aux complexités de l'humanité. Le problème est qu’il est VRAIMENT difficile de tester les qualités mentionnées ci-dessus. La plupart du temps, vous devez juger les personnes sur ces qualités en fonction de votre réaction instinctive. C’est difficile si vous n’avez pas de bonnes aptitudes en relations humaines ni d’intuition, il est beaucoup plus facile de tester la connaissance des algorithmes.

arbre_érable
la source
+1 Les entreprises habituelles et celles qui ne ressemblent pas à Google ressemblent à des monstres ont besoin de personnes possédant de bonnes compétences en affaires, notamment pour comprendre comment inventer / appliquer / gérer / modifier des processus. Ce n’est pas une erreur si les entreprises de type Google n’ont pas éclos le mouvement Agile, car l’informatique n’a pas pour but de résoudre des problèmes commerciaux.
S.Robins
10

Personnellement, je vois des algorithmes et des infrastructures de données "standard" dans le vocabulaire d'un programmeur. Et bon nombre des problèmes pratiques auxquels vous êtes confrontés en tant que programmeur ont souvent une solution qui est (au moins partiellement) exprimable dans ce vocabulaire.

Avoir ce vocabulaire à votre disposition vous évite d'avoir à proposer vos "propres" solutions (réinventer la roue pour ainsi dire), ce qui vous permet de travailler plus intelligemment et souvent plus rapidement.

"Je ne peux pas sembler intéressé à résoudre des problèmes apparemment trop compliqués trouvés dans la plupart des manuels ou des sites Web"

"Je trouve qu'il est extrêmement difficile de me souvenir et de les réutiliser plus tard"

Forcez-vous à les compléter. Vous vous remercierez plus tard. Même si vous ne vous en souvenez pas en détail (avec suffisamment de pratique, vous pourrez certainement dire: "Je me souviens d'avoir résolu quelque chose de similaire à l'aide de l'algorithme X ou de la structure de données Y", ce qui vous aidera énormément. Même si cela vous oblige à rechercher les détails et à vous rafraîchir la mémoire.

Bart
la source
+1 pour les structures de données. Ils sont l'autre moitié de la pièce algorithmique.
Spencer Rathbun
9

Bien que vous ne puissiez pas être un bon programmeur sans connaître vos algorithmes, il est injuste de laisser de côté d’autres aspects du métier de programmeur. Par exemple, une discipline stricte et une bonne maîtrise de votre langue maternelle sont au moins aussi importantes pour être un bon programmeur que votre connaissance des algorithmes. Il ne faut pas non plus sous-estimer l’importance de la compréhension de vos outils de base, tels que les langages de programmation, les systèmes de contrôle de source, les environnements de test, etc.

Toutefois, en ce qui concerne les entretiens, mesurer votre compréhension des algorithmes est beaucoup plus simple que de mesurer vos autres capacités liées au travail de programmeur. C'est pourquoi les intervieweurs se concentrent souvent sur des algorithmes et accordent une attention particulière à la façon dont vous les expliquez au cours de l'entretien. Ce n'est pas parce que d'autres choses sont moins importantes, mais parce qu'il est difficile d'évaluer ces autres choses dans les 30 minutes allouées à l'entretien.

dasblinkenlight
la source
1
+1 réponse parfaite! Il est plus facile de tester la connaissance de l'algorithme.
maple_shaft
"vos algorithmes" - Je suis autodidacte. Existe-t-il une source ou une liste quelque part qui indique quels sont ces algorithmes courants que tout programmeur devrait connaître? Je voudrais lire à travers eux. Merci!
Ominus
2
@Ominus Bien qu'il n'y ait pas de consensus général sur la "liste de gentlemen" d'algorithmes, il s'agirait dans la plupart des cas de rechercher, trier, parcourir des structures de données dépourvues de continuité spatiale (listes chaînées, arbres binaires, etc.) et rudimentaires applications de récursivité (factorielle récursive, séquence de Fibonacci, etc.)
dasblinkenlight
@ Ominus - Moi aussi, je suis autodidacte mais je pense "Introduction aux algorithmes" - Le CLRS est un bon moyen de se familiariser avec le domaine. Le livre de Skiena "The Algorithm Design Manual" est également bon.
Tod
5

Oui, la programmation concerne principalement les algorithmes.

Mais peut-être pas dans le sens où vous réfléchissez.

J'ai l'impression que nous utilisons tous différentes définitions d'algorithme. Pour être honnête, il est difficile de répondre à cette question car algorithme est un terme vague. Je vais utiliser la définition de Wikipedia pour répondre à cette question:

Un ensemble de règles qui définit avec précision une séquence d'opérations.

C'est le coeur et l'âme de la programmation. Lorsque vous écrivez un code, vous ne faites que mettre en œuvre un algorithme. Si vous écrivez des applications CRUD, vous implémentez un algorithme simple. Savoir programmer est un algorithme pour résoudre un problème. Le reste ne sont que des détails.

Je ne suis pas d'accord avec l'affiche précédente qui disait qu'une compréhension profonde d'une langue était plus importante qu'une compréhension des algorithmes. Tout bon programmeur devrait être capable d’apprendre en profondeur une langue, mais sans algorithme, vous ne pouvez créer aucun code par vous-même.

Casey Patton
la source
D'un autre point de vue, en mathématiques, le cœur et l'âme peuvent être des algorithmes, mais pour la programmation, c'est autre chose. Vous pouvez écrire un logiciel sans avoir besoin d’algorithmes en soi (ce n’est peut-être pas un bon logiciel), mais vous ne pouvez pas écrire de logiciel sans logique, ni pensée abstraite. En son cœur cependant, il s’agit de résoudre des problèmes. Trouver la solution est un processus algorithmique, mais la solution elle-même n'est pas nécessairement un algorithme.
S.Robins
4

La réponse dépend entièrement du travail que vous poursuivez. Certains champs sont particulièrement plus axés sur les algorithmes que d'autres. En répondant à cette note, j’ai eu le plaisir d’interviewer plusieurs fois avec Amazon. Même si la position aurait peu à voir avec ces algorithmes complexes, j'ai été grillé sur la façon de rendre une tâche amortie temps constant.

Ce que prouve une bonne compréhension des algorithmes est la preuve pour votre employeur potentiel que vous êtes un solutionneur de problèmes. Ce n'est pas vraiment un bon indicateur (OMI) d'un bon employé, mais certains employeurs l'utilisent pour le filtrage. Si vous postulez pour un poste exigeant un diplôme d'études supérieures, vous aurez probablement une base plus rigoureuse en matière d'algorithmes.

En pratique, quoi (IMO) est extrêmement utile, ce n’est pas de mémoriser des algorithmes spécifiques, mais si vous comprenez comment fonctionnent certains algorithmes, vous verrez à l’arrière de vous un petit pépin dans lequel vous direz «j’ai déjà vu cela auparavant» ou «je sais que je peut le faire mieux ", ce qui engendrera un peu de recherche sur la solution à votre problème.

Plate-forme
la source
+1 pour parler de la barre d'embauche pour les étudiants diplômés. Certaines entreprises embauchent beaucoup plus de jeunes diplômés que les étudiants de premier cycle. Mais pour être juste envers eux, les étudiants des cycles supérieurs sont également mieux rémunérés et sont généralement recrutés à un niveau supérieur au sein de leur entreprise.
user396089
1

Je pense toujours que la programmation est plus basée sur les données que sur les algorithmes. Donc en fait, oui, la programmation est presque entièrement basée sur des algorithmes.

Cela ne ressemble peut-être pas à des maths, et beaucoup de travail algorithmique que vous feriez au jour le jour consiste très simplement à envoyer des données entre une interface graphique et un programme, mais cela compte également comme algorithme. L'insertion d'un élément dans une liste est un algorithme d'insertion standard qui présente ses propres problèmes, tels que les performances et les manipulations de structure de liste.

gbjbaanb
la source
1

Seuls les programmeurs qui travaillent pour ces entreprises peuvent vraiment répondre à votre question. Les types d'algorithmes traités dans "Introduction aux algorithmes", par exemple, ont probablement joué un rôle dans 0,01% de ma vie de programmation au cours des 25 dernières années. Lorsque j'ai besoin d'une structure de données ou d'une sorte, les bibliothèques ou les frameworks fournis ont généralement ce dont j'ai besoin. Lorsque j'ai besoin d'une FFT très rapide, je trouve quelque chose comme Intel Math lib plutôt que d'en écrire un moi-même. Cependant, je peux expliquer en quoi leur travail chez Google est très différent de ce que j'ai fait dans ma carrière. Le livre de Skiena "The Algorithm Design Manual" ouvrit les yeux à cause des histoires de guerre qu'il raconte. Vous pouvez dire qu'il utilise beaucoup d'algorithmes dans son travail.

D'après mon expérience en tant que consultant en programmation indépendant, le succès repose sur trois facteurs: 1. Communiquer efficacement avec les clients 2. Écrire un code qui fonctionne. 3. Gérer la complexité

Ne faire que les numéros 1 et 2 ne suffit pas. Si le code n'est pas maintenable (par quelqu'un d'autre que le (s) programmeur (s) qui l'a écrit, il est condamné.

Le numéro 3 est la compétence de programmation la plus difficile à maîtriser. Cela nécessite une réflexion sur l’architecture, la conception et le codage. Cela nécessite de maîtriser le refactoring. Cela nécessite une compréhension des principes SOLID / DRY. Si je devais engager un programmeur qui avait lu Intro to Algorithms et s’être consacré à le maîtriser ou à lire The Pragmatic Programmer et qui se consacrait à le devenir, j’engagerais ce dernier à chaque fois. (Pas qu'ils doivent s'exclure mutuellement).

Tod
la source
1

Oui.

L'informatique est principalement constituée d'algorithmes (en pourcentage).

Non.

Mais c'est la "science" de l'informatique. L'application la plus courante de l'informatique est le génie logiciel. Le génie logiciel n'est pas principalement des algorithmes. Il s’agit principalement de l’art de créer, de la recherche de la perfection, et a une incidence positive sur la vie de personnes réelles qui existent aujourd’hui. Bien que l’informatique puisse partager une partie de la même motivation, elle est loin du génie logiciel.

Demandez à un professeur titulaire d'une grande université d'informatique quelle est la chose la plus critique à comprendre à propos de la programmation. Ils vous diront probablement "algorithmes et structures de données".

Demandez à un développeur expérimenté d’une grande entreprise de logiciels quelle est la chose la plus critique à comprendre en matière de programmation, et ils vous diront probablement: "apprendre à ravir les clients" (ce qui implique implicitement que comprendre continuellement, en faisant des choses qui fonctionnent , etc.)

Cela peut sembler être une sémantique, mais si je comprends bien, les deux sont remarquablement différents, en pratique comme en théorie.

Paul Hazen
la source
1

Si je devais choisir une chose en informatique comme étant la partie la plus importante, je choisirais des abstractions , pas des algorithmes.

Thomas Eding
la source
1

En informatique, les concepts que vous apprendrez ne seront d'aucune utilité tant que vous ne les aurez pas montrés. Le problème est une préoccupation majeure qui doit être résolue. Un algorithme est donc une brève planification de la façon dont le problème sera résolu en général. C'est donc une préoccupation majeure dans le monde de l'informatique.

Je pense que presque tous les aspects de l'informatique ont besoin d'un algorithme. Permettez-moi de vous montrer ceci. La liste suivante comprend différents domaines d'informatique et les algorithmes qu'ils utilisent.

Les automates

Construction de Powerset. Algorithme de conversion d'automate non déterministe en automate déterministe. Algorithme de Todd-Coxeter. Procédure pour générer des coset.

Intelligence artificielle

Alpha Beta. Alpha max plus beta min. Largement utilisé dans les jeux de société. Ant-algorithmes. L’optimisation des colonies de fourmis est un ensemble d’algorithmes inspirés par le comportement des fourmis pour résoudre un problème, trouver le meilleur chemin entre deux endroits. DE (évolution différentielle). Résoudre le problème d’ajustement polynomial de Chebyshev. Reconnaissance semi-supervisée des peines sarcastiques dans les revues de produits en ligne. Algortithme reconnaissant les sacarsmes ou l'ironie dans un tweet ou un document en ligne. Un tel algorithme sera également essentiel pour la programmation de robots humanoïdes.

Vision par ordinateur

Exemple. Représenter une image ou une vidéo par un plus petit. Comptage d'objets dans une image . Utilise l'algorithme d'étiquetage des composants connectés pour étiqueter d'abord chaque objet, puis compter les objets. Algorithme O'Carroll. À partir d’une conversion mathématique de la vision des insectes, cet algorithme évalue comment se déplacer en évitant les objets.

Algorithmes génétiques

Ils utilisent trois opérateurs. sélection (choisir la solution), reproduction (utiliser les solutions choisies pour en construire d'autres), remplacement (remplacer la solution si elle est meilleure).

Sélection proportionnelle de remise en forme. Également appelée sélection de la roue de roulette, cette fonction est utilisée pour sélectionner des solutions. Sélection de la troncature. Une autre méthode de sélection des solutions, ordonnée par forme physique. Sélection du tournoi. Sélectionnez la meilleure solution par une sorte de tournoi. Échantillonnage universel stochastique. Les individus sont mappés sur des segments contigus d'une ligne, de telle sorte que le segment de chaque individu a la même taille que son niveau de forme, exactement comme dans la sélection par roue de roulette.

Les réseaux de neurones

Hopfield net. Réseau de neurones artificiels récurrents servant de systèmes de mémoire à adressage de contenu avec unités de seuil binaires. Ils convergent vers un état stable. Propagation arrière. Technique d'apprentissage supervisé utilisée pour la formation de réseaux de neurones artificiels. Carte auto-organisée (carte de Kohonen). Réseaux de neurones formés à l'aide d'un apprentissage non supervisé pour produire une représentation en basse dimension (2D, 3D) des échantillons d'apprentissage. Bon pour visualiser des données de grandes dimensions.

Bioinformatique

Needleman-Wunsch. Effectue un alignement global sur deux séquences, pour des séquences protéiques ou nucléotidiques. Smith-Waterman. Variation du Needleman-Wunsch.

Compression

Algorithmes de compression sans perte

Transformation de Burrows-Wheeler. Le prétraitement est utile pour améliorer la compression sans perte. Dégonfler. Compression de données utilisée par ZIP. Codage Delta. Aide à la compression des données dans lesquelles des données séquentielles sont fréquentes. Encodage incrémental. Le codage delta appliqué aux séquences de chaînes. LZW. (Lempel-Ziv-Welch). Successeur de LZ78. Construit une table de traduction à partir des données à compresser. Est utilisé par le format graphique GIF. LZ77 et 78. La base de nouvelles variations de la ZS (LZW, LZSS, ...). Ils sont tous les deux codeurs de dictionnaire. LZMA. Abréviation de l'algorithme de chaîne de Lempel-Ziv-Markov. LZO. Algorithme de compression de données axé sur la vitesse. PPM(Prédiction par correspondance partielle). Technique de compression de données statistiques adaptative basée sur la modélisation et la prédiction de contexte. Shannon-Fano codant. Construit des codes de préfixes basés sur un ensemble de symboles et leurs probabilités. Binaire tronqué. Un codage entropique généralement utilisé pour les distributions de probabilité uniformes avec un alphabet fini. Améliorer l'encodage binaire. Encodage en longueur. Compression primaire qui remplace une séquence du même code par le nombre d'occurrences. Sequitur. Inférence incrémentielle de grammaire sur une chaîne. EZW (Embedded Zerotree Wavelet). Encodage progressif pour compresser une image dans un flux de bits avec une précision croissante. La compression avec perte peut également produire de meilleurs résultats.

Codage entropique Schéma de codage qui attribue des codes aux symboles afin de faire correspondre les longueurs de code aux probabilités des symboles.

Huffman codant. Compression simple sans perte tirant parti des fréquences relatives des caractères. Codage adaptatif de Huffman. Technique de codage adaptatif basée sur le codage de Huffman. Codage arithmétique. Codage d'entropie avancé. Encodage de plage. Identique au codage arithmétique, mais sous un angle légèrement différent. Codage unaire. Code qui représente un nombre n avec n uns suivis d'un zéro. Elias delta, gamma, codage oméga. Code universel codant les entiers positifs. Codage de Fibonacci. Code universel qui code des entiers positifs en mots de code binaires. Codage de Golomb. Forme de codage entropique optimale pour les alphabets suivant des distributions géométriques. Codage du riz. Forme de codage entropique optimale pour les alphabets suivant des distributions géométriques.

Algorithmes de compression avec perte

Codage prédictif linéaire. Compression avec perte en représentant l'enveloppe spectrale d'un signal numérique de parole sous forme comprimée. Algorithme de loi A. Algorithme de companding standard. Algorithme de Mu-loi. Algorithme standard de compression ou de compression de signal analogique. Compression fractale. Méthode utilisée pour compresser des images à l'aide de fractales. Transformer le codage. Type de compression de données pour des données telles que des signaux audio ou des images photographiques. Quantification vectorielle. Technique souvent utilisée dans la compression de données avec pertes. Compression en ondelettes. Forme de compression de données bien adaptée à la compression d’image et audio.

Cryptographie

Clé secrète (cryptage symétrique)

Utilisez une clé secrète (ou une paire de clés directement associées) pour le décryptage et le cryptage.

Advanced Encryption Standard (AES) , également connu sous le nom de Rijndael. Blowfish. Conçu par Schneier comme un algorithme à usage général, destiné à remplacer le DE vieillissant. Data Encryption Standard (DES) , anciennement DE Algorithm. IDEA (algorithme international de cryptage de données) . Anciennement IPES (PES amélioré), un autre remplaçant pour le DES. Est utilisé par PGP (Pretty Good Privacy). Effectue des transformations sur des données divisées en blocs, à l'aide d'une clé. RC4 ou ARC4. Cryptage de flux largement utilisé dans les protocoles tels que SSL pour le trafic Internet et WEP pour les réseaux sans fil. Algorithme de cryptage minuscule. Facile à mettre en œuvre un algorithme de chiffrement par blocs en utilisant certaines formules. PES (Proposition de norme de cryptage). Ancien nom pour IDEA.

Clé publique (cryptage asymétrique)

Utilisez une paire de clés, désignées comme clé publique et clé privée. La clé publique crypte le message, seule la clé privée permet de le décrypter.

DSA (algorithme de signature numérique). Générer des clés avec des nombres premiers et aléatoires. A été utilisé par les agences américaines, et maintenant domaine public. ElGamal. Basé sur Diffie-Hellman, utilisé par le logiciel GNU Privacy Guard, PGP et d'autres systèmes cryptographiques. RSA (Rivest, Shamir, Adleman). Largement utilisé dans les protocoles de commerce électronique. Utilisez des nombres premiers. Échange de clé Diffie-Hellman (Merkle) (ou échange de clé exponentiel). Méthode et algorithme pour partager le secret sur un canal de communication non protégé. Utilisé par RSA. NTRUEncrypt. Utiliser des anneaux de polynômes à multiplications par convolution.

Fonctions de résumé du message

Un résumé de message est un code résultant du cryptage d'une chaîne ou de données de longueur quelconque, traité par une fonction de hachage.

MD5. Utilisé pour vérifier les images ISO de CD ou de DVD. RIPEMD (Résumé de message d'évaluation de primitives d'intégrité RACE). Basé sur les principes de MD4 et similaire à SHA-1. SHA-1 (algorithme de hachage sécurisé 1). Le plus couramment utilisé de l'ensemble SHA de fonctions de hachage cryptographiques connexes. A été conçu par l'agence de la NSA. HMAC. authentification du message de hachage par clé. Tigre (TTH). Habituellement utilisé dans les hachages de tigres.

Cryptographique utilisant des nombres pseudo-aléatoires Voir. Générateurs de nombres aléatoires

Techniques de cryptographie

Partage de secrets, fractionnement de secrets, fractionnement de clés, algorithmes M de N.

Le plan de partage secret de Shamir. Ceci est une formule basée sur une interpolation polynomiale. Le plan de partage secret de Blakley. De nature géométrique, le secret est un point situé dans un espace à m dimensions.

Autres techniques et décryptage

Somme de sous-ensemble. Étant donné un ensemble d’entiers, la somme des sous-ensembles est-elle égale à zéro? Utilisé en cryptographie. Algorithme de Shor. Algorithme Quantum capable de décrypter un code basé sur des fonctions asymétriques telles que RSA.

Géométrie

Emballage cadeau. Déterminer la coque convexe d'un ensemble de points. Gilbert-Johnson-Keerthi distance. Déterminer la plus petite distance entre deux formes convexes. Graham scanner. Déterminer la coque convexe d'un ensemble de points dans le plan. Intersection de segment de ligne. Déterminer si les lignes se croisent avec un algorithme de ligne de balayage. Point en polygone. Teste si un point donné se situe dans une donnée. Intersection Ray / Plan. * Intersection Ligne / Triangle. * Cas particulier de l'intersection Ray / Plan. Polygonisation des surfaces implicites. Approximer une surface implicite avec une représentation polygonale. Triangulation Méthode d'évaluation de la distance à un point d'angles à d'autres points, dont la distance est connue.

Graphes 3D Surface Tracker Technology. Processus pour ajouter des images sur les murs d'une vidéo tout en tenant compte des surfaces cachées. Bellman-Ford. Calcule les chemins les plus courts dans un graphique pondéré (où certaines pondérations sur les arêtes peuvent être négatives). Algorithme de Dijkstra. Calcule les chemins les plus courts dans un graphique avec des pondérations de bord non négatives. Méthodes de perturbation. Un algorithme qui calcule les chemins les plus courts localement dans un graphique. Floyd-Warshall. Résout le problème du plus court chemin de toutes les paires dans un graphe orienté pondéré. Cycle de recherche de Floyd. Trouve des cycles dans les itérations. Johnson Algorithme du plus court chemin de toutes les paires dans un graphe dirigé pondéré de faible densité. Kruskal.Trouve un arbre couvrant minimal pour un graphique. Prim's. Trouve un arbre couvrant minimal pour un graphique. Aussi appelé algorithme DJP, Jarník ou Prim – Jarník. * Boruvka. * Recherche un arbre couvrant minimal pour un graphique. Ford-Fulkerson. Calcule le débit maximum dans un graphique. Edmonds-Karp. Mise en œuvre de Ford-Fulkerson. Commutateur Spanning Minimal non bloquant. Pour un central téléphonique. Woodhouse-Sharp. Trouve un arbre couvrant minimal pour un graphique. À base de printemps. Algorithme pour le dessin graphique. Hongrois. Algorithme pour trouver une correspondance parfaite. Algorithme de coloration. Algorithme de coloration graphique. Voisin le plus proche.Trouver le voisin le plus proche. Type topologique. Triez un graphe acyclique dirigé de manière à ce que chaque nœud soit placé avant tous les nœuds sur lesquels il a des arêtes (selon les directions). Algorithme moins commun des ancêtres hors ligne de Tarjan. Calcule les plus bas ancêtres communs pour des paires de nœuds dans une arborescence.

Graphique

Algorithme de ligne de Bresenham. Utilise des variables de décision pour tracer une ligne droite entre 2 points spécifiés. Paysage Dessine un paysage en 3D. * Algorithme de ligne DDA. * Utilise des mathématiques en virgule flottante pour tracer une ligne droite entre 2 points spécifiés. Remplir inondé. Remplit une région connectée avec une couleur. Restauration d'image. Restaurer la photo, améliorer les images. Algorithme de ligne de Xiaolin Wu. Anti-crénelage de ligne. Algorithme du peintre. Détecte les parties visibles d'un paysage en 3 dimensions. Tracé laser. Rendu d'image réaliste. Phong shading. Un modèle d'éclairage et une méthode d'interpolation en infographie 3D. Ombrage Gouraud.Simulez les effets de lumière et de couleur sur la surface d'un objet 3D. Rendu Scanline. Construit une image en déplaçant une ligne imaginaire. Illumination globale. Considère l'éclairage direct et la réflexion d'autres objets. Interpolation. Construire de nouveaux points de données tels que dans le zoom numérique. Resynthesizer. Supprimez un objet sur une photo et reconstruisez le fond utilisé par Photoshop et The Gimp. Tutoriel de resynthèse. Algorithme d'interception de pente. C'est une implémentation de la formule d'interception de pente pour tracer une ligne. Interpolation spline. Réduit les erreurs avec le phénomène de Runge. Technologie de suivi de surface 3D. Ajout d'images ou de vidéos sur les murs d'une vidéo, les surfaces cachées étant prises en compte.

Listes, tableaux et arbres

Recherche

Recherche par dictionnaire. Voir recherche prédictive. Algorithme de sélection. Trouve le kème élément le plus volumineux de la liste. Algorithme de recherche binaire. Localise un élément dans une liste triée. Largeur-première recherche. Parcourt un graphique niveau par niveau. Profondeur d'abord. Traverse une branche de graphe par branche. Meilleure première recherche. Parcourt un graphique dans l'ordre d'importance probable à l'aide d'une file d'attente prioritaire. Une recherche dans les arbres. * Cas particulier de la meilleure recherche en premier qui utilise des méthodes heuristiques pour améliorer la vitesse. Recherche à coût uniforme. Une recherche dans l’arbre qui trouve l’itinéraire le moins coûteux où les coûts varient. Recherche prédictive.Binaire comme recherche qui détermine l’ampleur du terme recherché par rapport aux valeurs hautes et basses de la recherche. Table de hachage. Associez les clés aux éléments d'une collection non triée pour les récupérer dans un délai linéaire. Recherche interpolée. Voir recherche prédictive.

Tri

Tri des arbres binaires. Tri d'un arbre binaire, incrémental, similaire au tri par insertion. Bogosort. Sorte aléatoire inefficace d'une carte de bureau. Sorte de bulle. Pour chaque paire d'indices, échangez les éléments s'ils sont en panne. Sorte de seau. Divisez une liste en compartiments et triez-les individuellement. Généraliser le tri par casier. Sorte de cocktail (ou bulle bidirectionnelle, shaker, ondulation, navette, sorte de happy hour). Une variante du type de bulle qui trie dans les deux sens passe à travers la liste. Peigne sorte. Variation efficace du type de bulle qui élimine les "tortues", les petites valeurs proches de la fin de la liste et utilise les écarts entre les valeurs. Compter le genre.Il utilise la plage de nombres de la liste A pour créer un tableau B de cette longueur. Les index de B permettent de compter le nombre d'éléments de A dont la valeur est inférieure à i. Sorte de gnome. Semblable au tri par insertion, sauf que le déplacement d'un élément à sa place s'effectue par une série d'échanges, comme dans le tri à bulles. Heapsort. Convertissez la liste en tas, continuez à supprimer le plus gros élément du tas et à l'ajouter à la fin de la liste. Tri par insertion. Déterminez l'emplacement de l'élément en cours dans la liste des éléments triés et insérez-le dans la liste. Introsort. Ou genre introspective. Il commence par un tri rapide et passe en ordre de tri à un certain niveau de récursivité. Tri par fusion.Triez séparément la première et la seconde moitié de la liste, puis fusionnez les listes triées. Sorte de crêpes. Inverser les éléments d'un préfixe d'une séquence. Sorte de casier. Remplissez un tableau vide avec tous les éléments d'un tableau à trier, dans l'ordre. Type de facteur. Variante hiérarchique du tri par seau, utilisée par les bureaux de poste. Tri rapide. Divisez la liste en deux, avec tous les éléments de la première liste devant tous les éléments de la deuxième liste .; puis triez les deux listes. Souvent la méthode de choix. Sorte de Radix. Trie les clés associées aux éléments, ou un nombre entier en traitant des chiffres. Tri de sélection. Choisissez le plus petit des éléments restants, ajoutez-le à la fin de la liste triée. Sorte de coquille.Améliore le tri par insertion en utilisant les espaces entre les valeurs. Smoothsort. Voir Heapsort. Tri stochastique. Voir bogosort.

et beaucoup plus...

Chitrank Dixit
la source
0

Vous avez posé deux questions dans l'en-tête de la question, je vais donc y répondre.

Oui, l'informatique est entièrement axée sur les algorithmes. Eh bien ... en fait, c'est un peu trompeur car il y a beaucoup d'aspects en informatique, alors je vais reformuler. L'informatique telle qu'elle est appliquée dans le monde du travail concerne principalement les algorithmes. Des entreprises comme Google, Facebook et tous ces endroits loufoques de Wall Street qui embauchent des physiciens et des développeurs veulent des problèmes extrêmement complexes réduits à une simple forme, ce qui nécessite une compréhension approfondie des mathématiques et du développement d'algorithmes.

Non, la programmation ne concerne pas uniquement les algorithmes. La programmation consiste à prendre des spécifications et à les convertir en code pouvant être compilé pour exécution.

La partie supplémentaire de la réponse: le développement de logiciel n'est pas la programmation, et pourtant beaucoup semblent confondre les termes et les utiliser de manière interchangeable. La programmation est simplement une fonction ou une technique du processus plus large du développement logiciel. Le développement logiciel ne concerne certainement pas que des algorithmes, il consiste à résoudre des problèmes logiciels et à appliquer des processus compatibles avec le monde du travail afin de résoudre efficacement les problèmes. Bien que les processus de développement logiciel - et même la programmation elle-même - puissent être des processus algorithmiques par nature, cela n’est pas la même chose que s’agissant d’ algorithmes.

S.Robins
la source