Choix de langage de programmation pour l'apprentissage des structures de données et algorithmes
Qui langage de programmation recommanderiez-vous pour en savoir sur structures de données et algorithmes dans?
Tenant compte des éléments suivants:
- Expérience personnelle
- Fonctionnalités de langage (pointeurs, OO, etc)
- Pertinence pour l'apprentissage de la DS & Un des concepts
Je demande car il y a des livres là-bas qui sont de programmation indépendant de la langue (écrite à partir d'une perspective Mathématique, et l'utilisation de pseudo). Si j'ai appris de l'un de ces, je voudrais choisir un langage de programmation pour le code et exécuter les algorithmes.
Puis, il y a d'autres livres qui introduisent DS & Un des concepts avec des exemples écrit dans une langue de programmation - et je voudrais le code de ces algorithmes ainsi - ainsi, dans une certaine mesure, la langue prend le livre.
De toute façon, je dois choisir une langue, et je préfère garder tout au long de. Mettant de côté les préférences linguistiques personnelles, lequel est le meilleur pour cette fin?
- Il n'est pas possible de répondre à cette question, sauf dans le spécifique, et qui a besoin de plus d'informations.
- Thornley : je ne comprends c'est un peu ouvert, mais il a obtenu un grand nombre de très grandes réponses!
- Il y a beaucoup de bruit à propos de l'énergie(utilisé pour être: le temps) de l'efficacité des algorithmes&structures de données: si et quand vous voulez pour la mesurer, regardez pour les systèmes où un nombre important sont reproducably (et facilement) obtenus.
Vous devez vous connecter pour publier un commentaire.
La réponse à cette question dépend exactement ce que vous voulez apprendre.
Python et Ruby
De haut niveau des langages comme Python et Ruby sont souvent proposés car ils sont de haut niveau et la syntaxe est tout à fait lisible. Cependant, ces langues ont tous des abstractions pour le commun des structures de données. Il n'y a rien qui vous empêche de mise en œuvre de vos propres versions de l'apprentissage de l'exercice, mais vous pouvez trouver que vous êtes en train de construire de haut niveau des structures de données au-dessus des autres niveau élevé de structures de données, ce qui n'est pas forcément utile.
Aussi, Ruby et Python sont typées dynamiquement langues. Cela peut être bon, mais il peut aussi être source de confusion pour les débutants et il peut être plus difficile (à l'origine) pour attraper des erreurs, car en général, ils ne se manifeste qu'à l'exécution.
C
C est à l'autre extrême. Il est bon si vous voulez vraiment 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 tout à coup une considération importante, comme dans l'utilisation correcte de la fonction malloc()/free(). Qui peut être une source de distraction. Aussi, C n'est pas orienté objet. Ce n'est pas une mauvaise chose, mais simplement de noter.
C++
C++ a été mentionné. Comme je l'ai dit dans le commentaire, je pense que c'est un terrible choix. C++ est affreusement compliqué, même en simple d'utilisation et a un montant ridicule de "pièges". Aussi, le C++ n'a pas de classe de base commune. Ceci est important parce que les structures de données comme les tables de hachage de s'appuyer sur l'existence d'une classe de base commune. Vous pourriez mettre en œuvre une version pour un nominal de la classe de base, mais c'est un peu moins utile.
Java
Java a également été mentionnée. Beaucoup de gens aiment à détester Java et c'est vrai que la langue est extrêmement détaillé et manque de quelques de la de la plus moderne des fonctionnalités du langage (par exemple, des fermetures) mais rien de ce qui compte vraiment. Java est statiquement typé et a la collecte des ordures. Cela signifie que le compilateur Java va attraper de nombreuses erreurs qui typées dynamiquement langues ne va pas (jusqu'à l'exécution) et il n'y a pas de traiter avec la segmentation des défauts (qui n'est pas à dire que vous ne pouvez pas présenter une fuite de mémoire en Java; vous pouvez bien évidemment). Je pense que Java est un excellent choix.
C#
C# le langue est comme une version plus moderne de Java. Comme Java, il est géré (garbage collector) intermédiaire langage compilé qui s'exécute sur une machine virtuelle. Toute autre langue énumérés ici, à l'exception de C/C++ aussi s'exécuter sur une machine virtuelle, mais Python, Ruby, etc sont interprétés directement plutôt que compilés en bytecode.
C# possède les mêmes avantages et inconvénients que Java, dans le fond.
Haskell (etc)
Enfin, les langages fonctionnels: Haskell, OCaml, Régime/Lisp, Clojure, F#, etc. Ces réfléchir à tous les problèmes dans une manière très différente et sont vaut la peine d'apprendre à un certain point, mais encore une fois on en revient à ce que vous voulez apprendre: la programmation fonctionnelle ou de structures de données? Je collerais à l'apprentissage d'une chose à la fois, plutôt que de confondre la question. Si vous ne vous en apprendre un langage fonctionnel à un certain point (que je recommande), Haskell est un excellent choix.
Mon Avis
Choisir Java ou C#. Les deux ont gratuit, excellente Ide (Eclipse, Netbeans et IntelliJ Community Edition pour Java, Visual Studio Express pour le C#, Visual studio community edition) qui font de l'écriture et l'exécution de code d'un composant logiciel enfichable. Si vous n'utilisez aucun de données native structure plus complexe qu'un tableau et tous les objets que vous vous écrire, vous apprendrez essentiellement la même chose que vous feriez dans C/C++, mais sans avoir à gérer la mémoire.
Laissez-moi vous expliquer: extensible table de hachage doit être redimensionnée si suffisamment d'éléments sont ajoutés. La mise en application qui oblige à faire quelque chose comme le doublement de la taille de la sauvegarde de la structure de données (généralement un tableau) et la copie des éléments existants. La mise en œuvre est essentiellement la même dans tous les langages impératifs, mais en C/C++, vous aurez à traiter avec la segmentation fauls lorsque vous n'avez pas à allouer ou libérer quelque chose correctement.
Python ou Ruby (il n'a pas vraiment d'importance qui) serait mon prochain choix (et très proche pour les deux autres) tout simplement parce que le typage dynamique qui pourrait être difficile au premier abord.
Je recommanderais
Java
principalement parce que:EDIT: en Bas, les électeurs veuillez expliquer.
Java
est bon pour les structures de données et un algorithme d'apprentissage 🙂À mon avis, C serait le meilleur langage pour apprendre les structures de données et algorithmes, car il va vous forcer à écrire votre propre. Il va vous forcer à comprendre les pointeurs, allocation dynamique de la mémoire, et les implémentations derrière la populaire structures de données comme les listes, les tables de hachage, etc. Nombreuses sont les choses que vous pouvez prendre pour acquis dans un langage de haut niveau (Java, C#, etc.).
Python
est grande. Facile à lire, complet. Si vous allez travailler avec des pseudo-code, Python va paraître assez familier.Python est déjà les algorithmes de la langue de son choix à UC Irvine, où il est décrit comme suit:
"Python représente un algorithme langage orienté qui a été cruellement défaut dans l'éducation. Les avantages de Python inclure son manuel de syntaxe et de l'interactivité qui encourage l'expérimentation."
Python travaille également à un débutant de manière conviviale avec Gato, un graphique de l'outil de prise. L'apprentissage d'Algorithmes et Structures de Données est un haut qui peut aider en étant visuel, quelque chose qui Gato le rend facile à faire (sans apprentissage complexes graphique bibliothèques)
Si l'objectif est seulement de se renseigner sur structures de données et algorithmes, je dirais JavaScript. Vous pouvez exécuter votre code dans un navigateur. Vous avez une très flexible objet de manipulation et vous pouvez vous concentrer entièrement sur les structures de données et algorithmes et pas de gestion de la mémoire, des constructions d'un langage ou d'autres choses qui vont prendre l'attention loin de l'ordinateur réel science de l'apprentissage.
Le bonus est que vous pouvez facilement visualiser les différentes structures de données en utilisant le navigateur pour le rendu des graphiques et des arbres à l'aide du DOM et de la Toile.
CS des cours au fil des ans ont tendance à changer la langue dans laquelle le sujet est enseigné, tout simplement parce que de nouvelles et meilleures implémentations de langues que la facilité d'apprentissage est arrivé ce qui rend plus facile de se concentrer sur le problème réel.
Oberon-2 ou Composant Pascal. Le dernier est un sur-ensemble de la première.
L'a dit Einstein "le Rendre aussi simple que possible, mais pas plus." Cette phrase a été choisi par le professeur Niklaus Wirth comme épigraphe à l'origine Oberon rapport linguistique. Et c'est vrai pour Oberon descendants mentionnés ci-dessus.
Quand il s'agit de la perfection du langage de programmation que j'aime à citer Antoine de Saint-Exupéry: "Un concepteur sait qu'il est arrivé à la perfection, non pas lorsqu'il n'y a plus rien à ajouter, mais quand il n'y a plus rien à enlever.". Wirth, même si c'est pas atteint cet, est sur la bonne voie. Dans "Wirth langages de programmation ligne" (Algol -> Pascal -> Modula-2 -> Oberon -> Oberon-2) par la suite, chaque langue est plus simple et en même temps plus puissante que la précédente.
Puissant mais simple langues suivant le principe de moindre surprise. Typage statique fort, facile orientée objet, les installations, la collecte des ordures. La liste des fonctionnalités est pas grand, mais c'est assez pour être productif et de ne pas compliquer les choses, notamment sur les étapes initiales.
Quand vous voulez apprendre les algorithmes et structures de données, vous l'entendez. Mais si votre langue est "puissant" (a beaucoup de fonctionnalités comme C++, C#, Java, Python, ...), vous allez perdre beaucoup de temps à l'apprentissage de la langue, pas d'algorithmes et structures de données. Vous ne pourrez pas voir la forêt pour les arbres. =) Vous pouvez penser à des arbres comme les éléments de la syntaxe (et toutes les autres fonctionnalités) et de la forêt en tant que concept important (de l'algorithme, structure de données, peut-être de la programmation orientée objet, peu importe). Le plus de fonctionnalités (les arbres), vous avez dans votre langue la plus compliquée devenir la tâche de prendre du recul et à comprendre les concepts (voir la forêt).
Mais si le langage est vraiment puissant (a petit ensemble bien prouvé caractéristiques) de la langue elle-même va à la deuxième place. Il n'y a pas beaucoup d'arbres, de sorte que vous pouvez faire quelques pas en arrière et ... eh Bien, je pense que c'est assez analogies. =)
Aussi de nombreux livres sur des algorithmes et structures de données utilisation Algol/Pascal-comme pseudocode et il sera facile de convertir des exemples dans cette langue. Et vous pouvez directement utiliser les exemples de Wirth est "Algorithmes et Structures de Données" livre. Oberon édition (2004), PDF (1,2 MO).
Quelques liens supplémentaires:
environnement de développement pour le Composant
Pascal. Pour Windows uniquement. Fonctionne très bien dans le Vin.
Je dirais Ada. Il a des fonctionnalités pour les données constructions ne trouve pas dans d'autres langues, telles que des vérifications
type Day is range 1 .. 31;
Aussi il a très stricte au moment de la compilation et de l'exécution de la vérification (sauf si vous choisissez de désactiver), le rendant plus facile de trouver des bugs dans votre mise en œuvre.Si vous voulez prendre le chemin de moindre résistance, puis Python. Il va falloir le montant minimum de l'inutile de la chaudière de la plaque et telles.
Idéalement, je veux apprendre des algorithmes en C, de sorte que vous pouvez apprendre ce qui se passe au niveau de la mémoire; j'avais aussi envie d'apprendre des algorithmes dans un langage fonctionnel, de sorte que vous pouvez voir à quoi ressemblent les algorithmes de travail avec la persistance des structures de données.
Knuth célèbres livres contiennent de grandes quantités de (inventé plate-forme) du code assembleur. Cette option est recommandée si vous souhaitez être super hardcore. Personnellement, si, j'ai travaillé dans C quand je travaillais à travers mes algorithmes de la classe (divulgation: c'était seulement il y a quelques années). Je suis parfois, sur certains problèmes dans Knuth, mais je ne sais pas si j'irais avec MMIX entièrement comme langue de choix pour les algorithmes d'apprentissage. C'est un peu exagéré, je me sentirais.
MODIFIER:
Il dépend aussi de ce que vous êtes familier avec. Si vous souhaitez commencer à travailler par l'intermédiaire d'un des algorithmes de texte à droite maintenant, et vous n'avez jamais travaillé beaucoup avec C, le Python est, et de loin, la réponse correcte. Vous voulez que la langue ne pas être un grand obstacle à surmonter, parce que vous voulez profiter de cette. Je sais que j'ai fait.
Dernier point: au moins quand j'étais algorithmes d'apprentissage, j'ai passé beaucoup de temps à travailler sur papier. Je pense que c'est important -- je veux dire, vous voulez vous renseigner sur asymptotique, etc. Dépenser tout votre temps à la mise en œuvre des algorithmes quelle que soit la langue n'est pas la chose à faire.
Je pense que Lisp est intéressant de regarder dans.
Ma première université au cours de programmation a été en Lisp. Avant que j'avais écrit des programmes en plusieurs langues pour les 10 ans. Je pensais que le premier cours de programmation serait ennuyeux, mais j'ai eu tort.
Lisp est très intéressant de langage, car il a une syntaxe simple. L'accent se déplace de la syntaxe de la fonctionnalité. La programmation fonctionnelle style est également une chose extrêmement précieuse pour apprendre. Après mon Lisp sûr, je me suis retrouvé à écrire des programmes en C++ dans un complètement nouveau, de meilleure façon, grâce à de nouveaux concepts Lisp m'avait enseigné.
Lisp utilise également la même représentation pour le code et les données, ce qui ouvre d'intéressantes au sujet de la conception d'un algorithme avec le code généré à la volée, puis exécuté.
"Si votre seul outil est un marteau, puis tous vos problèmes ont tendance à ressembler à des clous"
Apprendre au moins quelques langues.
Aussi, votre choix dépend de votre but.
Hobby? L'emploi dans le monde de Windows? Linux/UNIX famille?
Type d'applications: entreprise rapport scientifique; les pilotes de matériel ou d'applications?
Des applications de bureau ou des applications web?
J'ai plusieurs suggestions pour vous.
(a) certainement apprendre quelques J (gratuit à partir de jsoftware.com; successeur à la VAE; les deux J et APL sont des créations de Ken Iverson, Turing gagnant ... prix Turing est comme le prix Nobel de l'informatique).
(b) si vous êtes dans le monde de Windows, démarrer avec c# parce que tellement .NET s'exécute sur c#. Si vous le pouvez, obtenir une copie de Tom de l'Archer "à l'Intérieur de c#" Microsoft Press. Vous pouvez obtenir gratuitement un développement c# système en téléchargeant Microsoft version express.
(c) apprendre à utiliser TDD/BDD ... quelle que soit la langue, d'abord vous écrire un petit test appelé un test unitaire; ensuite, vous écrivez le code de production pour passer le test de l'unité; un petit pas à la fois ... ce n'est pas seulement la langue que vous utilisez, c'est aussi la méthodologie.
(d) apprendre certaines langage assembleur, ... assembleur est de faible niveau, près de langage machine, il vous donnera une bonne compréhension de ce qui se passe derrière les coulisses.
(e) à l'extérieur du monde de Windows, je vous recommande de c++.
Il n'y a pas de meilleur langage.
Si c'était seulement à propos de la langue, de la programmation serait plus facile.
Non seulement voulez-vous apprendre les algorithmes qui sont très spécifiques, vous aussi vous voulez apprendre des modèles qui sont plus générales et peut vous aider dans le choix de l'approche à la résolution d'un problème donné.
Une chose est certaine: vous n'aurez probablement jamais à court de choses à apprendre si vous allez devenir un programmeur.
Vous pouvez apprécier un langage algébrique de types de données et le filtrage comme Standard ML, OCaml, F# ou Haskell. Par exemple, voici une fonction pour rééquilibrer un rouge-noir binaires un arbre de recherche écrit en OCaml/F#:
J'ai peut-être tort, mais ne sont pas des structures de données et algorithmes indépendant des langages de programmation?
En fin de compte, les structures de données sont juste une façon d'organiser les données; tout langage de haut niveau permettra de soutenir que. Bien sûr, certaines langues possèdent des mécanismes de mise en œuvre de structures de données de base (telles que les Collections Cadre en Java ou en C++ STL), mais cela ne vous empêche pas de données de programmation de la structure dans le langage de programmation de votre choix. En outre, les algorithmes sont écrits en pseudo-code, les rendant indépendants de la langue.
Je me rends compte qu'il n'est pas vraiment répondre à votre question, mais je vais avoir du mal à saisir ce que vous cherchez; l'apprentissage des structures de données/d'algorithmes ou de l'apprentissage d'une nouvelle langue.
N'importe quelle langue à l'exception de la fugly C++ doit faire amende.
Je préfère le C++ 🙂