Выбор языка программирования для изучения структур данных и алгоритмов

Какой язык программирования вы бы рекомендовали узнать о структурах данных и алгоритмах в?

Учитывая следующее:

  • Личный опыт
  • Функции языка (указатели, OO и т.д.)
  • Пригодность для обучения концепциям DS и A

Я прошу, потому что есть некоторые книги, которые являются языком программирования-агностиком (написанным с математической точки зрения и использующим псевдокод). Если я узнаю из одного из них, я бы хотел выбрать язык программирования для кодирования и запуска алгоритмов.

Затем есть и другие книги, в которых представлены понятия DS и A с примерами, написанными в определенном программировании laguage, - и я хотел бы также закодировать эти алгоритмы, - поэтому, в определенной степени, язык также выбирает книгу.

В любом случае, я должен выбрать язык, и я бы предпочел придерживаться его во всем. Отказ от предпочтений личного языка, который лучше всего подходит для этой цели?

Ответ 1

Ответ на этот вопрос зависит от того, что именно вы хотите узнать.

Python и Ruby

Высокоуровневые языки, такие как Python и Ruby, часто предлагаются, потому что они являются высокоуровневыми и синтаксис вполне читабелен. Однако у всех этих языков есть абстракции для общих структур данных. Ничто не мешает вам реализовать свои собственные версии в качестве учебного упражнения, но вы можете обнаружить, что вы строите структуры данных высокого уровня поверх других структур данных высокого уровня, что не обязательно полезно.

Кроме того, Ruby и Python являются языками с динамической типизацией. Это может быть хорошо, но это также может сбить с толку новичка, и может быть труднее (на начальном этапе) отлавливать ошибки, поскольку они обычно не будут видны до времени выполнения.

С

С на другом конце. Было бы хорошо, если вы хотите изучить действительно низкоуровневые детали, например, как управлять памятью, но управление памятью внезапно становится важным фактором, например, правильного использования malloc()/free(). Это может отвлекать. Кроме того, C не является объектно-ориентированным. Это не плохо, но просто стоит отметить.

C++

C++ был упомянут. Как я сказал в комментарии, я думаю, что это ужасный выбор. C++ ужасно сложен даже при простом использовании и имеет смешное количество "ошибок". Кроме того, C++ не имеет общего базового класса. Это важно, потому что структуры данных, такие как хеш-таблицы, полагаются на наличие общего базового класса. Вы могли бы реализовать версию для номинального базового класса, но это немного менее полезно.

Джава

Ява также была упомянута. Многие люди любят ненавидеть Java, и это правда, что язык чрезвычайно многословен и лишен некоторых из более современных языковых возможностей (например, замыканий), но ничего из этого не имеет значения. Java статически типизирована и имеет сборщик мусора. Это означает, что компилятор Java поймает много ошибок, которые не будут динамически типизированными языками (до времени выполнения), и не будет иметь дело с ошибками сегментации (что не означает, что вы не можете потерять память в Java; очевидно, вы можете). Я думаю, что Java - хороший выбор.

С#

Язык С# похож на более современную версию Java. Как и Java, это управляемый (сборщик мусора) промежуточный скомпилированный язык, который работает на виртуальной машине. Любой другой язык, указанный здесь, кроме C/C++, также работает на виртуальной машине, но Python, Ruby и т.д. Интерпретируются напрямую, а не компилируются в байт-код.

С# имеет те же плюсы и минусы, что и Java, в принципе.

Хаскель (и т.д.)

Наконец, у вас есть функциональные языки: Haskell, OCaml, Scheme/Lisp, Clojure, F # и т.д. Они думают обо всех проблемах совершенно по-другому и в какой-то момент стоят того, чтобы их изучить, но опять-таки все сводится к тому, что вы хотите выучить: функциональное программирование или структуры данных? Я придерживаюсь изучения одной вещи за один раз, а не путаю проблему. Если вы в какой-то момент выучите функциональный язык (что я бы порекомендовал), Haskell - это безопасный и хороший выбор.

Мой совет

Выберите Java или С#. Оба имеют бесплатные отличные интегрированные среды разработки (Eclipse, Netbeans и IntelliJ Community Edition для Java, Visual Studio Express для С#, Visual Studio Community Edition), которые упрощают написание и запуск кода. Если вы не используете собственную структуру данных, более сложную, чем массив и какой-либо объект, который вы пишете сами, вы узнаете в основном то же самое, что и в C/C++, но без необходимости фактически управлять памятью.

Позвольте мне объяснить: размер расширяемой хеш-таблицы необходимо изменить, если добавлено достаточное количество элементов. В любой реализации это будет означать выполнение чего-то вроде удвоения размера структуры резервных данных (обычно массива) и копирования в существующие элементы. Реализация в основном одинакова во всех императивных языках, но в C/C++ вам приходится иметь дело с ошибками сегментации, когда вы не распределяете или не освобождаете что-то правильно.

Python или Ruby (это не имеет значения, какой) будет моим следующим выбором (и очень близким к двум другим) только потому, что динамическая типизация может поначалу быть проблематичной.

Ответ 2

Я бы рекомендовал Java главным образом потому, что:

  • сбор мусора
  • ссылки
  • богатые коллекции

РЕДАКТИРОВАТЬ: Вниз избиратели, пожалуйста, объясните.

Ответ 3

По моему мнению, C будет лучшим языком для изучения структур данных и алгоритмов, потому что это заставит вас писать свои собственные. Это заставит вас понимать указатели, динамическое распределение памяти и реализации популярных структур данных, таких как связанные списки, хэш-таблицы и т.д. Многие из них - это то, что вы можете считать само собой разумеющимся на языках более высокого уровня (Java, С# и т.д.).).

Ответ 4

Python отлично. Легко читаемый, полнофункциональный. Если вы собираетесь работать с псевдокодом, Python будет выглядеть довольно знакомо.

Python уже является языком алгоритмов выбора UC Irvine, где он описывается так:
"Python представляет собой язык, ориентированный на алгоритм, который очень необходим в образовании. Преимущества Python включают его учебник-подобный синтаксис и интерактивность, которые поощряют эксперименты".

Python также работает дружелюбным для новичков с Gato, инструментом создания графиков. Алгоритмы обучения и структуры данных - это одна вершина, которая может помочь, сделав визуальным, что-то, что Gato делает легко (без изучения каких-либо сложных графических библиотек).

Ответ 5

Если цель состоит в том, чтобы узнать только о структурах данных и алгоритмах, я бы сказал, что JavaScript. Вы можете запустить свой код в браузере. У вас очень гибкая обработка объектов, и вы можете полностью сосредоточиться на структурах данных и алгоритмах, а не на управлении памятью, на языковых конструкциях или других материалах, которые отвлекут внимание от фактической компьютерной науки, которую вы изучаете.

Бонус также заключается в том, что вы можете легко визуализировать различные структуры данных, используя браузер для визуализации графиков и деревьев с помощью DOM и Canvas.

Курсы CS на протяжении многих лет, как правило, меняют язык, на котором обучается предмет, просто потому, что появились более новые и лучшие реализации языков, облегчающих обучение, что облегчает фокусирование на реальной проблеме.

Ответ 6

Оберон-2 или Компонентный Паскаль. Последний является надмножеством первого.

Эйнштейн однажды сказал: "Сделай это как можно проще, но не проще". Эта фраза была выбрана профессором Никлаусом Виртом в качестве эпиграфа к оригинальному сообщению на языке Оберона. И это верно для потомков Оберона, упомянутых выше.

Когда дело доходит до совершенства языка программирования, я хотел бы процитировать Антуана де Сент-Экзюпери: "Дизайнер знает, что он достиг совершенства не тогда, когда больше нечего добавить, но когда уже нет ничего, что можно отнять"., Вирт, даже если этого не достигнуто, идет по правильному пути. В "Виртской строке языков программирования" (Algol → Pascal → Modula-2 → Oberon → Oberon-2) каждый последующий язык проще и в то же время более мощный, чем предыдущий.

Мощные, но простые языки по принципу наименьшего удивления. Строгая статическая типизация, удобные объектно-ориентированные средства, сборка мусора. Список возможностей невелик, но его достаточно, чтобы быть продуктивным и не усложнять ситуацию, особенно на начальных этапах.

Когда вы хотите изучить алгоритмы и структуры данных, вы это имеете в виду. Но если ваш язык "мощный" (имеет много функций, таких как C++, С#, Java, Python,...), вы потратите много времени на изучение языка, а не алгоритмов и структур данных. Вы не увидите лес за деревьями. =) Вы можете рассматривать деревья как элементы синтаксиса (и любые другие функции), а лес как важную концепцию (любой алгоритм, структура данных, может быть ООП, как угодно). Чем больше функций (деревьев) у вас есть в вашем языке, тем сложнее становится задача отступить назад и понять концепции (увидеть лес).

Но если язык действительно мощный (имеет небольшой набор хорошо зарекомендовавших себя возможностей), то сам язык выходит на второе место. Там не так много деревьев, так что вы можете сделать пару шагов назад и... Ну, я думаю, что достаточно аналогий. знак равно

Также во многих книгах по алгоритмам и структурам данных используется псевдокод, подобный Algol/Pascal, и примеры на этих языках будет легко преобразовать. И вы можете непосредственно использовать примеры из книги "Алгоритмы и структуры данных". Оберон издание (2004), PDF (1,2 МБ).

Некоторые дополнительные ссылки:

Ответ 7

Я бы предложил Аду. Он имеет функции для конструктов данных, не найденных на других языках, таких как проверки диапазона type Day is range 1 .. 31; Также у него очень строгая проверка времени выполнения и времени выполнения (если вы не решите отключить его), что облегчает поиск ошибок в вашем реализация.

Ответ 8

Если вы хотите перейти на путь наименьшего сопротивления, то Python. Он будет иметь минимальное количество ненужной плиты котла и т.п.

В идеале, я бы хотел изучить алгоритмы на C, чтобы вы могли узнать, что происходит на уровне памяти; Я также хотел бы изучить алгоритмы на функциональном языке, чтобы вы могли видеть, как похожие алгоритмы работают с постоянными структурами данных.

Известные книги Кнута содержат большое количество (изобретенной платформы) ассемблерного кода. Это рекомендуется, если вы хотите быть супер хардкором. Лично, однако, я работал в C, когда работал над классом алгоритмов (раскрытие: это было всего пару лет назад). Иногда я работаю над некоторыми проблемами в Кнуте, но не знаю, поеду ли я с MMIX в качестве своего языка для изучения алгоритмов. Я немного переживу, я бы чувствовал.

ИЗМЕНИТЬ: Это также зависит от того, с чем вы знакомы. Если вы хотите начать работу с текстом алгоритмов прямо сейчас, и вы никогда не много работали с C, то Python - это правильный ответ. Вы хотите, чтобы язык не был огромным препятствием для преодоления, потому что вы хотите наслаждаться этим. Я знаю, что знаю.

Последний момент: по крайней мере, когда я изучал алгоритмы, я много работал над бумагой. Я думаю, что это важно - я имею в виду, что вы хотите узнать об асимптотике и т.д. Проводите все свое время, внедряя алгоритмы на любом языке, это не то, что нужно делать.

Ответ 9

"Если ваш единственный инструмент - молот, тогда все ваши проблемы будут выглядеть как гвозди"

Изучите как минимум несколько языков.

Кроме того, ваш выбор зависит от вашей цели.

Hobby? Работа в мире Windows? Семейство Linux/UNIX?

Тип приложений: бизнес и научный; аппаратных драйверов или приложений?

Настольные приложения или веб-приложения?

У меня есть несколько советов для вас.

(a) определенно узнайте J (бесплатно от jsoftware.com, преемника APL, а J и APL - творения Кен Айверсона, победителя Тьюринга... Премия Тьюринга - как Нобелевская премия в области вычислений).

(b) если вы находитесь в мире Windows, начните с С#, потому что так много в .NET работает на С#. Если можно, получите копию Tom Archer "Inside С#" от Microsoft Press. Вы можете получить бесплатную систему разработки С#, загрузив версию Microsoft express.

(c) научиться использовать TDD/BDD... независимо от языка, сначала вы пишете небольшой тест под названием unit test; далее вы пишете производственный код для передачи unit test; один маленький шаг за раз... это не только язык, который вы используете, но и методология.

(d) изучите язык ассемблера... ассемблер - это низкий уровень, почти машинный язык, он даст вам хорошее представление о том, что происходит за кулисами.

(e) вне мира Windows, я бы рекомендовал С++.

Нет лучшего языка.

Если бы речь шла только о языке, программирование было бы проще.

Вы не только хотите изучить алгоритмы, которые очень специфичны, но и вы хотите изучить более общие модели, которые помогут вам выбрать подход к решению данной проблемы.

Одно можно сказать наверняка: у вас, вероятно, никогда не закончится все, чтобы узнать, собираетесь ли вы стать программистом.

Ответ 10

Я думаю, что Lisp стоит изучить.

Мой первый курс университетского программирования был в Lisp. До этого я уже десять лет пишу программы на нескольких языках. Я думал, что первый курс программирования будет скучным, но я ошибся.

Lisp - очень интересный язык, потому что он имеет очень простой синтаксис. Фокус смещается от синтаксиса к функциональности. Стиль функционального программирования также чрезвычайно полезен для изучения. После моего курса Lisp я обнаружил, что я пишу программы на С++ совершенно новым, лучшим способом, благодаря новым понятиям, которые Lisp научил меня.

Lisp также использует то же представление для кода и данных, что открывает интересный алгоритм с кодом, сгенерированным на лету, а затем выполняется.

Ответ 11

Вы можете оценить язык с алгебраическими типами данных и шаблоном, например Standard ML, OCaml, F # или Haskell. Например, здесь приведена функция для ребалансировки дерева красных черных двоичных данных, написанного в 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)

Ответ 12

Возможно, я ошибаюсь, но не являются ли структуры данных и алгоритмы независимыми от языков программирования?

В конце концов, структуры данных - это всего лишь способ организации данных; любой язык высокого уровня будет поддерживать это. Конечно, на некоторых языках будут созданы механизмы, реализующие основные структуры данных (такие как Collections Framework в Java или С++ STL), но это не мешает вам программировать структуру данных на выбранном вами языке программирования. Более того, алгоритмы записываются в псевдокоде, делая их независимыми от языка.

Я понимаю, что это не отвечает на ваш вопрос, но у меня проблемы с пониманием того, что вы ищете; изучать структуры данных/алгоритмы или изучать новый язык.

Ответ 13

Любой язык, кроме Fugly С++, должен делать хорошо.

Ответ 14

Я предпочитаю С++:)