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

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

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

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

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

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

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

66 голосов | спросил bguiz 17 AMpSat, 17 Apr 2010 10:30:12 +040030Saturday 2010, 10:30:12

14 ответов


0

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

Python и Ruby

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

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

С

С на другом краю. Хорошо, если вы хотите узнать действительно низкоуровневые подробности, такие как управление памятью, но управление памятью внезапно становится важным фактором, как при правильном использовании 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 (не важно, какой именно) будет моим следующим выбором (и очень близким к другому)два) только потому, что динамическая типизация может быть проблематичной на первый взгляд.

ответил cletus 17 AMpSat, 17 Apr 2010 10:58:37 +040058Saturday 2010, 10:58:37
0

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

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

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

ответил codaddict 17 AMpSat, 17 Apr 2010 10:38:18 +040038Saturday 2010, 10:38:18
0

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

ответил Taylor Leese 17 AMpSat, 17 Apr 2010 10:42:10 +040042Saturday 2010, 10:42:10
0

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

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

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

ответил Mantas Vidutis 17 AMpSat, 17 Apr 2010 10:35:25 +040035Saturday 2010, 10:35:25
0

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

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

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

ответил Ernelli 17 AMpSat, 17 Apr 2010 11:44:49 +040044Saturday 2010, 11:44:49
0

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

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

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

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

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

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

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

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

ответил Wildcat 17 PMpSat, 17 Apr 2010 13:36:56 +040036Saturday 2010, 13:36:56
0

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

ответил Daniel Rose 17 AMpSat, 17 Apr 2010 11:55:52 +040055Saturday 2010, 11:55:52
0

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

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

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

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

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

ответил Rob Lachlan 17 AMpSat, 17 Apr 2010 10:36:08 +040036Saturday 2010, 10:36:08
0

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

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

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

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

ответил Anders Abel 5 J0000006Europe/Moscow 2010, 23:56:35
0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ответил gerryLowry 17 AMpSat, 17 Apr 2010 11:10:13 +040010Saturday 2010, 11:10:13
0

Вы можете оценить язык с алгебраическими типами данных и сопоставлением с образцом, таким как 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)
ответил Jon Harrop 13 Mayam10 2010, 00:41:31
0

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

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

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

ответил Pran 17 AMpSat, 17 Apr 2010 11:29:17 +040029Saturday 2010, 11:29:17
0

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

ответил Jeremy Jose 5 J0000006Europe/Moscow 2010, 23:49:22
0

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

ответил Prasoon Saurav 17 AMpSat, 17 Apr 2010 10:32:55 +040032Saturday 2010, 10:32:55

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132