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

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

Рассмотрение следующего:

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

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

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

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

72
задан ngrant 24 December 2014 в 16:37
поделиться

14 ответов

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

Python и Ruby

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

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

C

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

C ++

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

Java

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

C #

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

В основном C # имеет те же плюсы и минусы, что и Java.

Haskell (и т. Д.)

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

Мой совет

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

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

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

81
ответ дан 24 November 2019 в 12:29
поделиться

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

7
ответ дан 24 November 2019 в 12:29
поделиться

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

-1
ответ дан 24 November 2019 в 12:29
поделиться

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

Выучите хотя бы несколько языков.

Также ваш выбор зависит от вашей цели.

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

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

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

У меня есть несколько предложений для вас.

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

(б) если вы работаете в мире Windows, начните с C #, потому что многое в .NET выполняется на C #. Если можете, получите копию книги Тома Арчера "Inside c #" в Microsoft Press.Вы можете получить бесплатную систему разработки на C #, загрузив экспресс-версию Microsoft.

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

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

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

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

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

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

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

4
ответ дан 24 November 2019 в 12:29
поделиться

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

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

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

12
ответ дан 24 November 2019 в 12:29
поделиться

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

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

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

2
ответ дан 24 November 2019 в 12:29
поделиться

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

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

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

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

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

5
ответ дан 24 November 2019 в 12:29
поделиться

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

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

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

14
ответ дан 24 November 2019 в 12:29
поделиться

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

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

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

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

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

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

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

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

8
ответ дан 24 November 2019 в 12:29
поделиться

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

28
ответ дан 24 November 2019 в 12:29
поделиться

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

  • сборка мусора
  • ссылается на
  • расширенные коллекции

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

40
ответ дан 24 November 2019 в 12:29
поделиться

Возможно, вам понравится язык с алгебраическими типами данных и сопоставлением с образцом, такой как 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)
3
ответ дан 24 November 2019 в 12:29
поделиться

Подойдет любой язык, кроме уродливого C ++.

2
ответ дан 24 November 2019 в 12:29
поделиться

Думаю, стоит обратить внимание на Lisp.

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

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

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

4
ответ дан 24 November 2019 в 12:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: