web-dev-qa-db-fra.com

Choix du langage de programmation pour l'apprentissage des structures de données et des algorithmes

Quel langage de programmation recommanderiez-vous à apprendre à propos de structures de données et algorithmes in?

Compte tenu des éléments suivants:

  • Expérience personnelle
  • Fonctionnalités du langage (pointeurs, OO, etc.)
  • Aptitude à l'apprentissage DS & A concepts

Je demande parce qu'il y a des livres qui sont indépendants du langage de programmation (écrits dans une perspective mathématique, et qui utilisent un pseudocode). Si j'apprends de l'un d'eux, je voudrais choisir un langage de programmation pour coder et exécuter les algorithmes.

Ensuite, il y a d'autres livres qui présentent DS & A concepts avec des exemples écrits dans un langage de programmation particulier - et je voudrais également coder ces algorithmes - donc, dans une certaine mesure, le langage choisit le livre aussi.

Dans tous les cas, je dois choisir une langue et je préfère m'en tenir à une partout. Mis à part les préférences linguistiques personnelles, laquelle est la meilleure à cet effet?

70
bguiz

La réponse à cette question dépend exactement de ce que vous voulez apprendre.

Python et Ruby

Les langages de haut niveau comme Python et Ruby sont souvent suggérés car ils sont de haut niveau et la syntaxe est assez lisible. Cependant, ces langages ont tous des abstractions pour le structures de données communes. Rien ne vous empêche d'implémenter vos propres versions comme exercice d'apprentissage, mais vous constaterez peut-être que vous créez des structures de données de haut niveau par-dessus d'autres structures de données de haut niveau, ce qui n'est pas nécessairement utile.

En outre, Ruby et Python sont des langages à typage dynamique. Cela peut être bon mais cela peut aussi être déroutant pour le débutant et il peut être plus difficile (au départ) pour intercepter les erreurs car elles ne seront généralement pas visibles avant l'exécution.

C

C est à l'autre extrême. C'est bien si vous voulez apprendre des détails de bas niveau comme la façon dont la mémoire est gérée, mais la gestion de la mémoire est soudainement une considération importante, comme dans l'utilisation correcte de malloc ()/free (). Cela peut être gênant. De plus, C n'est pas orienté objet. Ce n'est pas une mauvaise chose mais mérite tout simplement d'être noté.

C++

C++ a été mentionné. Comme je l'ai dit dans le commentaire, je pense que c'est un choix terrible. Le C++ est affreusement compliqué même dans un usage simple et a une quantité ridicule de "pièges". De plus, C++ n'a pas de classe de base commune. Ceci est important car les structures de données comme les tables de hachage reposent sur l'existence d'une classe de base commune. Vous pouvez implémenter une version pour une classe de base nominale mais c'est un peu moins utile.

Java

Java a également été mentionné. Beaucoup de gens aiment détester Java et il est vrai que le langage est extrêmement verbeux et manque de certaines des fonctionnalités de langage les plus modernes (par exemple les fermetures) mais rien de tout cela n'a vraiment d'importance. Java est typé statiquement et possède une récupération de place. Cela signifie que le compilateur Java capturera de nombreuses erreurs que les langages typés dynamiquement ne verront pas (jusqu'à l'exécution) et qu'il n'y aura pas de problème de segmentation ( ce qui ne veut pas dire que vous ne pouvez pas perdre de mémoire en Java; vous pouvez évidemment le faire.) Je pense que Java est un bon choix.

C #

C # the language est comme une version plus moderne de Java. Comme Java, il s'agit d'un langage compilé intermédiaire géré (récupéré) qui s'exécute sur une machine virtuelle. Tous les autres langages répertoriés ici, à l'exception de C/C++, s'exécutent également sur une machine virtuelle, mais Python, Ruby, etc. sont interprétés directement plutôt que compilés en bytecode.

C # a les mêmes avantages et inconvénients que Java, essentiellement.

Haskell (etc.)

Enfin, vous avez des langages fonctionnels: Haskell, OCaml, Scheme/LISP, Clojure, F #, etc. Ceux-ci pensent à tous les problèmes d'une manière très différente et méritent d'être étudiés à un moment donné mais encore une fois, cela revient à ce que vous voulez apprendre: programmation fonctionnelle ou structures de données? Je m'en tenir à apprendre une chose à la fois plutôt que de confondre le problème. Si vous apprenez un langage fonctionnel à un moment donné (ce que je recommanderais), Haskell est un choix sûr et fin.

Mon conseil

Choisissez Java ou C #. Les deux ont d'excellents IDE gratuits (Eclipse, Netbeans et IntelliJ Community Edition pour Java, Visual Studio Express pour C #, Visual studio community edition) qui facilitent l'écriture et l'exécution de code Si vous n'utilisez aucune structure de données native plus complexe qu'un tableau et tout objet que vous écrivez vous-même, vous apprendrez essentiellement la même chose que vous le feriez en C/C++ mais sans avoir à gérer réellement la mémoire.

Je m'explique: une table de hachage extensible doit être redimensionnée si suffisamment d'éléments sont ajoutés. Dans toute implémentation, cela signifie faire quelque chose comme doubler la taille de la structure de données de support (généralement un tableau) et copier dans les éléments existants. L'implémentation est fondamentalement la même dans tous les langages impératifs, mais en C/C++, vous devez gérer les erreurs de segmentation lorsque vous n'allouez pas ou ne désallouez pas quelque chose correctement.

Python ou Ruby (peu importe lequel) serait mon prochain choix (et très proche des deux autres) juste parce que le typage dynamique pourrait être problématique au début.

80
cletus

Je recommanderais Java principalement parce que:

  • garbage collection
  • les références
  • riches collections

EDIT: Votez pour les électeurs, veuillez expliquer.

40
codaddict

À mon avis, C serait le meilleur langage pour apprendre les structures de données et les algorithmes, car il vous obligera à écrire les vôtres. Cela vous obligera à comprendre les pointeurs, l'allocation dynamique de mémoire et les implémentations derrière les structures de données populaires telles que les listes liées, les tables de hachage, etc. ).

27
Taylor Leese

Python est super. Facile à lire, entièrement équipé. Si vous allez travailler avec un pseudocode, Python aura l'air assez familier.

Python est déjà le langage d'algorithmes de choix à C Irvine , où il est décrit comme suit:
" Python représente un langage orienté algorithme qui a fait cruellement défaut dans l'enseignement. Les avantages de Python incluent sa syntaxe de type manuel et interactivité qui encourage l'expérimentation. "

Python fonctionne également de manière conviviale pour les débutants avec Gato , un outil de création de graphiques. L'apprentissage des algorithmes et des structures de données est un sommet qui peut aider en étant rendu visuel, quelque chose que Gato rend facile à faire (sans apprendre de bibliothèques graphiques complexes)

14
Mantas Vidutis

Si le but est de se renseigner uniquement sur structures de données et algorithmes, je dirais JavaScript. Vous pouvez exécuter votre code dans un navigateur. Vous avez un traitement d'objet très flexible et vous pouvez vous concentrer entièrement sur les structures de données et les algorithmes et non sur la gestion de la mémoire, les constructions de langage ou d'autres choses qui détourneront l'attention de la véritable informatique que vous apprenez.

Le bonus est également que vous pouvez facilement visualiser diverses structures de données en utilisant le navigateur pour rendre des graphiques et des arbres en utilisant DOM et Canvas.

Au fil des ans, les cours de CS ont tendance à changer la langue dans laquelle le sujet est enseigné, tout simplement parce que des implémentations plus récentes et meilleures des langues qui facilitent l'apprentissage sont arrivées, ce qui facilite la concentration sur le problème réel.

12
Ernelli

Oberon-2 ou Component Pascal . Le dernier est un sur-ensemble du premier.

Einstein a dit un jour "Rendez-le aussi simple que possible, mais pas plus simple." Cette phrase a été choisie par le professeur Niklaus Wirth comme épigraphe de la langue originale d'Oberon rapport. Et c'est vrai pour les descendants d'Oberon mentionnés ci-dessus.

En ce qui concerne la perfection du langage de programmation, j'aime citer Antoine de Saint-Exupéry: "Un designer sait qu'il est arrivé à la perfection non pas quand il n'y a plus rien à ajouter, mais quand il n'y a plus rien à retirer." . Wirth, même s'il n'y est pas parvenu, est sur la bonne voie. Dans la "ligne des langages de programmation Wirth" (ALGOL -> Pascal -> Modula-2 -> Oberon -> Oberon-2), chaque langue suivante est plus simple et en même temps plus puissante que la précédente.

Langages puissants mais simples suivant le principe de la moindre surprise. Typage statique fort, installations orientées objet faciles, collecte des ordures. La liste des fonctionnalités n'est pas grande mais elle est suffisante pour être productive et ne pas compliquer les choses surtout sur les étapes initiales.

Lorsque vous voulez apprendre des algorithmes et des structures de données, vous le pensez. Mais si votre langage est "puissant" (a beaucoup de fonctionnalités comme C++, C #, Java, Python, ...) vous perdrez beaucoup de temps à apprendre le langage, pas les algorithmes et les structures de données. Vous ne verrez pas la forêt pour les arbres. =) Vous pouvez considérer les arbres comme des éléments de syntaxe (et toutes autres fonctionnalités) et la forêt comme un concept important (tout algorithme, structure de données, peut être une POO, peu importe). Plus vous avez de fonctionnalités (arborescences) dans votre langue, plus la tâche devient compliquée de prendre du recul et de comprendre les concepts (voir la forêt).

Mais si le langage est vraiment puissant (a de petites fonctionnalités bien éprouvées), le langage lui-même passe à la deuxième place. Il n'y a pas tellement d'arbres donc vous pouvez faire quelques pas en arrière et ... Eh bien, je pense que c'est assez d'analogies. =)

De plus de nombreux livres sur les algorithmes et les structures de données utilisent un pseudocode de type ALGOL/Pascal et il sera facile de convertir des exemples dans ces langues. Et vous pouvez directement utiliser des exemples du livre "Algorithms and Data Structures" de Wirth. Édition Oberon (2004), PDF (1,2 Mo).

Quelques liens supplémentaires:

8
Wildcat

Je suggérerais Ada. Il possède des fonctionnalités pour les constructions de données introuvables dans d'autres langues, telles que les vérifications de plage type Day is range 1 .. 31; Il a également une vérification très stricte au moment de la compilation et de l'exécution (sauf si vous choisissez de le désactiver), ce qui facilite la recherche de bogues dans votre implémentation.

7
Daniel Rose

Si vous voulez emprunter le chemin de la moindre résistance, alors Python. Il aura le minimum de plaque de chaudière inutile et autres.

Idéalement, je voudrais apprendre des algorithmes en C, afin que vous puissiez apprendre ce qui se passe au niveau de la mémoire; Je voudrais également apprendre des algorithmes dans un langage fonctionnel, afin que vous puissiez voir comment des algorithmes similaires fonctionnent avec des structures de données persistantes.

Les livres célèbres de Knuth contiennent de grandes quantités de code assembleur (plateforme inventée). Ceci est recommandé si vous voulez être super hardcore. Personnellement, cependant, j'ai travaillé en C lorsque je travaillais dans ma classe d'algorithmes (divulgation: c'était il y a seulement quelques années). Je travaille parfois sur certains problèmes dans Knuth, mais je ne sais pas si j'opterais entièrement pour MMIX comme langue de choix pour l'apprentissage des algorithmes. C'est un peu exagéré, je pense.

[~ # ~] modifier [~ # ~] : Cela dépend aussi de ce que vous connaissez. Si vous voulez commencer à travailler sur un texte d'algorithmes en ce moment, et que vous n'avez jamais beaucoup travaillé avec C, alors Python est de loin la bonne réponse. Vous voulez que le langage ne soit pas un énorme obstacle à surmonter, parce que vous voulez en profiter. Je le sais.

Dernier point: au moins quand j'apprenais les algorithmes, j'ai passé beaucoup de temps à travailler sur du papier. Je pense que c'est important - je veux dire que vous voulez en savoir plus sur l'asymptotique, etc. Passer tout votre temps à implémenter des algorithmes dans n'importe quel langage n'est pas la chose à faire.

5
Rob Lachlan

"Si votre seul outil est un marteau, alors tous vos problèmes auront tendance à ressembler à des clous"

Apprenez au moins quelques langues.

De plus, votre choix dépend de votre objectif.

Loisir? Un emploi dans le monde Windows? Famille Linux/UNIX?

Type d'applications: affaires versus scientifiques; pilotes matériels ou applications?

Applications de bureau ou applications Web?

J'ai plusieurs suggestions pour vous.

(a) certainement apprendre un J (gratuit de jsoftware.com; successeur d'APL; J et APL sont des créations de Ken Iverson, gagnant de Turing ... Le prix Turing est comme le prix Nobel en informatique).

(b) si vous êtes dans le monde Windows, commencez par c # car tant de choses dans .NET s'exécute sur c #. Si vous le pouvez, obtenez une copie de "Inside c #" de Tom Archer auprès de Microsoft Press. Vous pouvez obtenir un système de développement c # gratuit en téléchargeant la version express de Microsoft.

(c) apprendre à utiliser TDD/BDD ... quelle que soit la langue, vous écrivez d'abord un petit test appelé test unitaire; ensuite vous écrivez le code de production pour réussir le test unitaire; une petite étape à la fois ... ce n'est pas seulement la langue que vous utilisez, c'est aussi la méthodologie.

(d) apprendre un langage assembleur ... assembleur est un langage bas niveau, presque machine, il vous donnera une bonne compréhension de ce qui se passe dans les coulisses.

(e) en dehors du monde Windows, je recommanderais c ++.

Il n'y a pas de meilleure langue.

S'il ne s'agissait que de langage, la programmation serait plus facile.

Non seulement vous voulez apprendre des algorithmes très spécifiques, vous voulez aussi apprendre des schémas plus généraux et vous aider à sélectionner l'approche pour résoudre un problème donné.

Une chose est sûre: vous ne manquerez probablement jamais de choses à apprendre si vous devenez programmeur.

4
gerryLowry

Je pense que LISP mérite d'être étudié.

Mon premier cours de programmation universitaire était en LISP. Avant cela, j'écrivais des programmes en plusieurs langues depuis 10 ans. Je pensais que le premier cours de programmation serait ennuyeux, mais je me trompais.

LISP est un langage très intéressant car il a une syntaxe très simple. Le focus passe de la syntaxe à la fonctionnalité. Le style de programmation fonctionnel est également une chose extrêmement précieuse à apprendre. Après mon cours LISP, je me suis retrouvé à écrire des programmes en C++ d'une manière complètement nouvelle et meilleure, grâce aux nouveaux concepts que LISP m'avait appris.

LISP utilise également la même représentation pour le code et les données, ce qui ouvre la porte à une conception d'algorithme intéressante avec du code généré à la volée puis exécuté.

4
Anders Abel

Vous pouvez apprécier un langage avec des types de données algébriques et des correspondances de modèles tels que Standard ML, OCaml, F # ou Haskell. Par exemple, voici une fonction pour rééquilibrer un arbre de recherche binaire rouge-noir écrit en OCaml/F #:

let balance = function
  | R(R(a, x, b), y, c), z, d | R(a, x, R(b, y, c)), z, d
  | a, x, R(R(b, y, c), z, d) | a, x, R(b, y, R(c, z, d)) ->
      R(B(a, x, b), y, B(c, z, d))
  | a, x, b -> B(a, x, b)
3
Jon Harrop

Je me trompe peut-être, mais les structures de données et les algorithmes ne sont-ils pas indépendants des langages de programmation?

Au final, les structures de données ne sont qu'un moyen d'organiser les données; n'importe quelle langue de haut niveau le supportera. Bien sûr, certains langages auront des mécanismes implémentant des structures de données de base (comme Collections Framework en Java ou C++ STL), mais cela ne vous empêche pas de programmer la structure de données dans le langage de programmation de votre choix. De plus, les algorithmes sont écrits en pseudocode, ce qui les rend indépendants du langage.

Je me rends compte que cela ne répond pas vraiment à votre question, mais j'ai du mal à comprendre ce que vous recherchez; apprendre des structures/algorithmes de données ou apprendre un nouveau langage.

2
Pran

N'importe quel langage, à l'exception du C++, devrait faire l'affaire.

2
Jeremy Jose