web-dev-qa-db-fra.com

Dans quelle mesure est-il important pour un programmeur de savoir comment implémenter un algorithme QuickSort / MergeSort à partir de la mémoire?

Je revoyais mes notes et suis tombé sur la mise en œuvre de différents algorithmes de tri.

Alors que j'essayais de donner un sens à la mise en œuvre de QuickSort et MergeSort, il m'est venu à l'esprit que même si je fais de la programmation pour gagner ma vie et que je me considère décent dans ce que je fais, je n'ai ni la mémoire photographique ni le cerveau pour mettre en œuvre ces algorithmes sans en s'appuyant sur mes notes. Tout ce dont je me suis souvenu, c'est que certains de ces algorithmes sont stables et d'autres non. Certains prennent O(nlog(n)) ou O (n ^ 2) pour terminer. Certains utilisent plus de mémoire que d'autres ...

Je me sentirais comme si je ne méritais pas ce genre de travail si ce n'était pas parce que ma position n'exige pas que j'utilise un algorithme de tri autre que ceux trouvés dans les API standard. Je veux dire, combien d'entre vous ont une position de programmation où il est en fait essentiel que vous puissiez vous souvenir ou trouver ce genre de choses par vous-même?

59
John Smith

Demandons à Albert et voyons ce qu'il a à dire sur le sujet:

"Je n'ai pas besoin de tout savoir, j'ai juste besoin de savoir où le trouver, quand j'en ai besoin"

- Albert Einstein , paraphrasé

Amen, frère Albert, Amen.

Une fois que vous avez fait un bon aperçu des algorithmes essentiels dans une discipline particulière (tri, recherche, peu importe), vous pouvez ensuite oublier les détails de l'implémentation jusqu'à ce que vous ayez réellement besoin de l'algo, auquel cas vous allez le rechercher ou utiliser un lib préexistante. Il y a 25 ans, j'ai construit un système de recherche majeur utilisant des arbres B *, mais aujourd'hui, je devrais RTFM pour bien les utiliser.

119
Peter Rowell
  1. Ce n'est pas vraiment une question de mémorisation. Il s'agit de comprendre en profondeur des classes générales d'algorithmes comme diviser pour mieux régner. Si vous comprenez vraiment diviser pour mieux régner, vous n'avez pas besoin de mémoriser le tri rapide. Vous pouvez le dériver sur place au besoin. De plus, le véritable avantage n'est même pas de pouvoir dériver le tri rapide par vous-même, c'est que vous pouvez reconnaître quand un problème nouvea se prête à une solution de division et de conquête.

  2. Tous les travaux de programmation ne sont pas identiques. Certains emplois nécessitent une connaissance approfondie des algorithmes, certains ont besoin de personnes qui comprennent la théorie des types et d'autres ont simplement besoin de personnes capables de récupérer des données d'un formulaire Web et de les déplacer vers une base de données. Certains emplois nécessitent même toutes ces compétences à la fois. Dans quel genre d'emploi voulez-vous travailler?

48
Charles E. Grant

Je pense que la seule fois où vous devez vous souvenir de tout cela, c'est lorsque vous postulez pour un emploi lorsque vous devez trouver des réponses sur place et que vous n'avez pas de ressources extérieures.

J'ai eu des collègues réécrire quicksort et ainsi de suite, mais je continue à leur dire de revenir à utiliser les fonctions de tri intégrées qui sont dans la langue. Je sais que selon les types de projets sur lesquels nous travaillons, nous devons nous souvenir d'autres algorithmes car ils ne sont généralement pas inclus dans les bibliothèques standard, mais le tri n'est pas celui qui apparaît car il est généralement intégré au langage.

Cependant, lorsque nous devons nous souvenir de ces algorithmes, nous nous tournons généralement vers Google ou un livre, et généralement il ne recherche pas une implémentation spécifique, mais quelle serait la meilleure implémentation pour notre problème.

10
scaryrawr

Se rappeler simplement quel algorithme est utile dans quels scénarios, serait plus que suffisant pour vous aider pendant votre travail. En fait, la plupart des travaux de programmation ne nécessitent pas la mémorisation d'approche, ils sont plutôt intéressés par votre façon de reconnaître le modèle algorithmique face au problème.

En fait, il y a une abondance d'informations dans la plupart des blogs/articles de programmation sur des sujets d'algorithmes. Ainsi, la mémorisation de la mise en œuvre exacte n'a pas d'importance. Les informations les plus précieuses seraient de se faire une idée de base sur le type d'algorithme disponible et sur ce que les problèmes spécifiques sont-ils bons à résoudre. La recherche d'une implémentation exacte une fois que vous savez ce que vous recherchez est assez rapide.

En résumé, c'est toujours mieux savoir ce que vous cherchez et où sont les références - qui vous guidera vers la source.

6
Yusubov

La mise en œuvre exacte n'est pas très importante. Mais le principe derrière mergesort/quicksort - récursivité, partitionnement, etc., est très basique et tout programmeur doit le comprendre. Ces algorithmes sont en fait très simples à décrire avec des mots une fois que vous comprenez.

Ce n'est pas vraiment un problème de savoir si vous pouvez le rechercher ou si vous pouvez le rechercher sur Google, c'est si le programmeur comprend ces techniques de résolution de problèmes et est capable de l'appliquer à d'autres situations.

5
hgh

Je suis de deux avis sur ce sujet. Je connais de nombreux programmeurs qui ne savent pas ce qu'est un algorithme de tri, mais qui font assez bien leur travail. Je crois aussi à la compréhension des principes pour vraiment comprendre le domaine.

Il est difficile pour moi d'avoir une réponse impartiale à ce sujet car je programme depuis si longtemps que j'ai probablement oublié plus d'algorithmes que je connais actuellement - mais je connais toujours ceux de tri mentionnés dans cette question. Je pense que les leaders d'opinion en Agile (par exemple Ron Jeffries, Alistair Cockburn) ont de bonnes idées à côté de cette idée (par exemple Shu-Ha-Ri).

En résumé de cette réponse décousue: utilisez certainement l'API (NIH est un signe d'immaturité du développeur), mais comprenez toujours les principes sous-jacents. J'espère que ça aide.

3
Mike Polen

Le tri et la recherche sont incroyablement importants, que vous soyez un fan de Donald Knuth ou que vous souhaitiez être la prochaine Larry Page. Selon l'entreprise dans laquelle vous évoluez et le niveau de concurrence que vous pouvez exercer parmi vos candidats, je vous recommande d'inclure certains des concepts suivants dans l'entretien.

Tri

  • Esquisse d'une sorte d'algorithme de tri.
  • Énumérez quelques exemples d'algorithmes de tri.
  • Comparez/contrastez deux sortes avec des caractéristiques de performances différentes.
  • S'ils ne mentionnent pas l'utilisation de la mémoire, renseignez-vous à ce sujet.

Recherche

  • Nommez autant d'algorithmes de recherche que possible.
  • Comparez/contrastez deux algorithmes de recherche.
  • Esquissez toute recherche autre que la recherche linéaire.

Certains pourraient dire que l'exigence du code pour ces algorithmes est exagérée à moins que le travail se fasse sur une île déserte sans connexion Internet. Une autre considération est que si vous disposez de 30 minutes et que vous souhaitez poser des questions sur autre chose, pour de nombreux candidats, la mise en œuvre du tri pourrait prendre une grande partie de votre temps.

2
DeveloperDon