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


79

Яку мову програмування ви б порадили вивчити про структури даних та алгоритми ?

Враховуючи наступне:

  • Особистий досвід
  • Мовні особливості (покажчики, ОО тощо)
  • Придатність для вивчення концепцій DS & A

Я запитую, тому що там є деякі книги, які є агностичними для програмування (написані з математичної точки зору та використовують псевдокод). Якщо я навчусь одному з них, я хотів би вибрати мову програмування для кодування та запуску алгоритмів.

Потім є інші книги, які представляють концепції DS & A із прикладами, написаними в певній мові програмування - і я хотів би також закодувати ці алгоритми - таким чином, певною мірою мова також обирає книгу.

У будь-якому випадку, мені доводиться вибирати мову, і я волів би дотримуватися такої протягом усього часу. Якщо відкинути особисті мовні уподобання, який із них найкращий для цієї мети?


Існує неможливий спосіб відповісти на це запитання, крім конкретного, і для цього потрібна додаткова інформація.
Девід Торнлі,

@Девід Торнлі: Я розумію, це трохи відкрито, але на це було багато справді чудових відповідей!
bguiz

Існує багато сумнівів щодо енергоефективності (раніше: часу) алгоритмів та структур даних: якщо і коли ви хочете виміряти це, шукайте системи, де значущі числа можна відтворити (і легко).
greybeard

Відповіді:


88

Відповідь на це питання залежить від того, що саме ви хочете дізнатись.

Пітон і Рубін

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

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

C.

С - в іншій крайності. Добре, якщо ви хочете дізнатися дійсно низькорівневі подробиці, наприклад, як управляється пам’яттю, але управління пам’яттю раптом є важливою проблемою, як, наприклад, правильне використання malloc () / free (). Це може відволікати увагу. Крім того, C не є об'єктно-орієнтованим. Це не погано, але просто варто зазначити.

C ++

Згадано C ++. Як я вже сказав у коментарі, я вважаю, що це жахливий вибір. С ++ дуже жахливо ускладнений навіть у простому використанні і має смішну кількість "прийомів". Крім того, C ++ не має загального базового класу. Це важливо, оскільки структури даних, такі як хеш-таблиці, покладаються на те, що існує загальний базовий клас. Ви можете реалізувати версію для номінального базового класу, але вона трохи менш корисна.

Java

Також згадано про Java. Багато людей люблять ненавидіти Java, і це правда, що мова надзвичайно багатослівна і не має деяких сучасних мовних функцій (наприклад, закриття), але нічого з цього насправді не має значення. Java має статичний тип і має збирання сміття. Це означає, що компілятор Java буде виявляти багато помилок, яких динамічно набрані мови не будуть (до часу виконання), і не буде мати справу з помилками сегментації (що не означає, що ви не можете просочити пам'ять у Java; очевидно, що можете). Я думаю, що Java - чудовий вибір.

C #

Мова C # схожа на більш сучасну версію Java. Як і Java, це керована (зібране сміття) проміжна компільована мова, яка працює на віртуальній машині. Будь-яка інша мова, перерахована тут, крім C / C ++, також працює на віртуальній машині, але Python, Ruby тощо обробляються безпосередньо, а не компілюються в байт-код.

В основному C # має ті самі плюси і мінуси, що і Java.

Хаскелл (і т.д.)

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

Моя порада

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

Дозвольте пояснити: розширювану хеш-таблицю потрібно змінити, якщо додати достатню кількість елементів. У будь-якій реалізації це означатиме щось на зразок подвоєння розміру резервної структури даних (як правило, масиву) та копіювання в існуючі елементи. Реалізація в основному однакова у всіх імперативних мовах, але в C / C ++ вам доводиться стикатися з помилками сегментації, коли ви не розподіляєте або не виділяєте щось правильно.

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


1
@cletus: Дякую за аргументовану відповідь! Яку книгу DS&A / інші навчальні матеріали ви б порекомендували (для Java або python)?
bguiz

3
@bguiz, ви можете задати окреме запитання щодо цього. Є кілька запитань на цю тему щодо посилання на stackoverflow.com/search?q=book+data+structures+algoritms. Ви можете уточнити це, додавши [java] або [python] до пошуку.
cletus

2
Я б НЕ використовував Java та C # головним чином через сувору орієнтацію на ОО, яка для цього просто непотрібна. Крім того: хто піклується про написання загального коду, коли справа в тому, щоб вивчити структуру даних? На мою думку, ви обираєте мову сценаріїв (Python) і зосереджуєтесь на високому рівні, або вибираєте мову низького рівня C / C ++ і намагаєтесь побачити, як це реалізовано на машинному рівні. Зупинятися між ними, здається, не варто.
Matthieu M.

3
Python спочатку не компілюється в байт-код? Новини для мене: docs.python.org/release/2.5.2/lib/bytecodes.html
Адам Кросленд

Це не має сенсу: "Це важливо, оскільки структури даних, такі як хеш-таблиці, покладаються на те, що існує загальний базовий клас". Хеш-таблиці покладаються на елементи, які можна хешувати, але особливості того, як це може бути реалізовано мовою програмування, не мають значення в абстрактному визначенні структури даних.
pyon

45

Я б рекомендував Javaголовним чином тому, що:

  • вивіз сміття
  • посилання
  • багаті колекції

РЕДАГУВАТИ: Виборці, просимо пояснити.


3
чому всі голосують за це?
Мантас Відутіс,

19
Я думаю, що проголосувати за це, бо вам не подобається Java (що, здається, відбувається), є безвідповідально. Можливо, вам не подобається Java, але її досить просто використовувати як навчальну мову. Тож +1 від мене.
cletus

7
+1. Не мій вибір, але насправді, це не страшно. Оцінка голосів така, як ви запропонували COBOL.
Роб Лаклан,

4
+1, оскільки для початківця: 1. Точно, вам не доведеться турбуватися про розподіл пам'яті / ділоку (як мінімум для невеликих програм). Ви можете замість цього зосередитись на тому, чого ви повинні навчитися на даний момент. 2. Так, ніяких підступних покажчиків чи покажчиків на покажчики. Не зрозумійте мене неправильно, я люблю C ++. 3. Колекції на Java - це, мабуть, найдосконаліший набір структур даних, які я бачив. Вони справді повинні бути у словнику під структурами даних. :)
crunchdog

9
Якщо ви не розумієте, як керувати власними ресурсами, ви не багато дізналися про структури даних.
Алан,

30

На мою думку, C буде найкращою мовою для вивчення структур даних та алгоритмів, оскільки це змусить вас писати власну. Це змусить вас зрозуміти покажчики, динамічне розподіл пам’яті та реалізації популярних структур даних, таких як зв’язані списки, хеш-таблиці тощо. Багато з них - це речі, які можна сприйняти як належне на мовах вищого рівня (Java, C # тощо). ).


11
Покажчики та динамічне розподіл пам'яті нічого не вчать вас про структури даних та алгоритми, але вони серйозно заважають досягненню.
JD

1
Я згоден. Після спілкування з десятками різних мов і, вивчивши спочатку вищу, високо абстраговану, було боляче, коли я вирішив вивчити C / C ++, і раптом мені довелося мати справу з багатьма речами, які мені ніколи не пояснювали раніше. Спершу вивчити C (а не C ++) - чудовий вибір, оскільки він розкриває вам, як насправді працює машина, і ви маєте всі обмеження, які в першу чергу створюються примусовими структурами даних. Вся мова надає вам функції (для алгоритмів) та структури (для структур даних). Розрив між теорією та мовою справді незначний.
Рафаель Беккель

17

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

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

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


@mvid: Чи є рекомендована книга DS & A на основі пітона?
bguiz

1
@bguiz: Хоча я її особисто не читав, існує ця безкоштовна електронна книга, яка зосереджується на алгоритмах та структурах даних з використанням ОО в Python: brpreiss.com/books/opus7
Мантас

Python чудовий лише в тому випадку, якщо ви вважаєте кодування з пробілами як деліметр чудовим
Woot4Moo

Пробіл як роздільник - це чудово!
Марсель Вальдес Ороско,

Я особисто не люблю Python через його синтаксичне використання відступів. Я вважаю, що важче знайти дурні помилки через неправильне вирівнювання, ніж для синтаксису на основі фігурних дужок та подібних, що підтримується додатковим вирівнюванням, подібним до nroff.
Майкл

13

Якщо метою є лише вивчення структур даних та алгоритмів , я б сказав JavaScript. Ви можете запустити свій код у браузері. Ви маєте дуже гнучку обробку об’єктів, і ви можете повністю зосередитись на структурах даних та алгоритмах, а не на керуванні пам’яттю, мовними конструкціями чи іншими речами, які відвернуть увагу від фактичної інформатики, яку ви вивчаєте.

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

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


+1, оскільки JavaScript дозволяє легко навчитися функціональному програмуванню та широкій застосовності можливості розробляти веб-програми з ним.
Дан Даскалеску,

Дуже правильно. Я тестую свій код у фрагменті інструментів розробника. Крім того, я можу подібним чином писати в ньому власні структури даних. Немає зв’язаного списку або будь-якої іншої структури, вбудованої в нього. Все є лише об'єктом. Якщо я не займаюся конкурентним програмуванням, це працює для вивчення двійкового пошуку, трие та всіх інших понять. Ні?
HalfWebDev

повністю погодьтесь, давайте зосередимось на логіці без особливих церемоній та синтаксису оголених кісток.
jtroconisa

8

Якщо ви хочете піти шляхом найменшого опору, тоді Python. У ньому буде мінімальна кількість непотрібної котлової плити тощо.

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

Знамениті книги Кнута містять велику кількість коду асемблера (винайденої платформи). Це рекомендується, якщо ви хочете бути супер хардкором. Однак особисто я працював у C, коли працював над класом алгоритмів (розкриття: це було лише пару років тому). Я іноді працюю над деякими проблемами в Кнуті, але я не знаю, чи хотів би я повністю піти на MMIX як мою мову для вибору алгоритмів. Я відчував би це трохи надмірно.

EDIT : Це також залежить від того, з чим ви знайомі. Якщо ви хочете почати працювати з текстом алгоритмів прямо зараз, і ви ніколи не працювали багато з C, тоді Python - далеко і правильна відповідь. Ви хочете, щоб мова не була величезною перешкодою, тому що ви хочете цим насолоджуватися. Я знаю, що зробив.

Останній момент: принаймні, коли я вивчав алгоритми, я провів пекельно багато часу, працюючи на папері. Я думаю, що це важливо - я маю на увазі, що ви хочете дізнатись про асимптотику тощо. Витрачаючи весь свій час на впровадження алгоритмів будь-якою мовою, не потрібно.


@Rob Lachlan: Чи є якась книжка DS & A на основі пітона, яку ви б порадили?
bguiz

@bguiz: більшість пристойних книг про алгоритми, які мені подобаються, є агностиками щодо відмови - Кормен та ін., Кляйнберг та Тардос. Я б справді не вибрав його на основі мови.
Роб Лахлан

8

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


8

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

Одного разу Ейнштейн сказав: "Зробіть це якомога простішим, але не простішим". Цю фразу обрав професор Ніклаус Вірт як епіграф до оригінального мовного звіту на Обероні. І це справедливо для згаданих вище нащадків Оберона.

Коли мова заходить про досконалість мови програмування, я люблю цитувати Антуана де Сент-Екзюпері: "Дизайнер знає, що він досяг досягнення досконалості не тоді, коли вже нічого не можна додати, але коли у нас вже немає чого забрати". . Вірт, навіть якщо цього не досяг, йде правильним шляхом. У "Лінії мов програмування Wirth" (Algol -> Pascal -> Modula-2 -> Oberon -> Oberon-2) кожна наступна мова простіша і водночас потужніша за попередню.

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

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

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

Також у багатьох книгах про алгоритми та структури даних використовується псевдокод, подібний до Алгола / Паскаля, і буде легко перетворити приклади на ці мови. І ви можете безпосередньо використати приклади з книги Вірта "Алгоритми та структури даних". Видання Oberon (2004), PDF (1,2 МБ).

Деякі додаткові посилання:


@kemiisto: дякую за uniuue, і роман, відповідь - і аналогії! Я також розгляну Оберон-2.
bguiz

2
Англійська версія прислів'я "Не бачу лісу за деревами".
Даніель Роуз,

6

"Якщо ваш єдиний інструмент - це молоток, тоді всі ваші проблеми будуть мати тенденцію виглядати як цвяхи"

Вивчіть принаймні кілька мов.

Крім того, ваш вибір залежить від вашої мети.

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

Тип заявок: бізнес проти наукового; драйвери обладнання чи програми?

Настільні програми чи веб-програми?

У мене є кілька пропозицій для вас.

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

(b) якщо ви перебуваєте у світі Windows, почніть з c #, тому що стільки в .NET працює на c #. Якщо можете, отримайте копію "Внутрішнього c #" Тома Арчера від Microsoft Press. Ви можете отримати безкоштовну систему розробки c #, завантаживши експрес-версію Microsoft.

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

(г) вивчити якусь мову асемблера ... асемблер - це низький рівень, майже машинна мова, це дасть вам гарне розуміння того, що відбувається за лаштунками.

(e) за межами світу Windows я б рекомендував c ++.

Не існує найкращої мови.

Якби мова йшла лише про мову, програмування було б простішим.

Ви не тільки хочете вивчити алгоритми, які є дуже конкретними, ви також хочете вивчити закономірності, які є більш загальними і можуть допомогти вам у виборі підходу до вирішення даної проблеми.

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


Структури даних @bguiz можуть бути для всіх намірів повністю незалежними від мови; це одна з причин вивчення різних мов. Ви також зіткнетеся з тонкими розбіжностями, які можуть викликати розчарування і навіть горе; Наприклад, іменування типів даних: біт для SQL Server є bool для c # і логічний для vb. розмір типу даних теж змінюється; Наприклад, int в c # встановлено на 32 біти, де в c ++ його розмір і, отже, його ємність залежить від платформи. Набори символів також впливають на розмір вашої структури даних; приклади, 7-бітний ASCII, 8-бітний ASCII, Unicode. Тоді є фіксований розмір проти різного тощо.
gerryLowry

"структури даних можуть бути для всіх намірів повністю незалежними від мови". Для реалізації більшості чисто функціональних структур даних на мові, яка не забезпечує збирання сміття, вам в основному доведеться написати збирач сміття. Це серйозна перешкода.
JD

Опанувавши ОО, спробуйте охопити декларативне програмування.
greybeard

4

Ви можете оцінити мову з алгебраїчними типами даних та збігом шаблонів, таких як 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)

10
Ваш сарказм оцінений, сер.
ergosys

4

Я думаю, що Ліспа варто розглянути.

Мій перший університетський курс програмування був у Ліспе. До цього я 10 років писав програми кількома мовами. Я думав, що перший курс програмування буде нудним, але я помилявся.

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

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


2

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

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

Я усвідомлюю, що це насправді не відповідає на ваше запитання, але мені важко зрозуміти те, що ви шукаєте; вивчення структур даних / алгоритмів або вивчення нової мови.


1
@Pran: Я знаю, що алгоритми знаходяться в псевдокоді, але псевдокод не компілюється. Я практичний студент, тому, щоб по-справжньому зрозуміти поняття, мені потрібно було б закодувати його мовою, яка може компілюватися та запускатися. Тому моє питання насправді полягає в тому, яка мова найкраще підходить для цього, в тому сенсі, що кожна мова повинна мати свої плюси і мінуси, що робить деякі з них більш придатними для вивчення DS&A, ніж інші.
bguiz

@Pran: "Можливо, я помиляюся, але хіба структури даних та алгоритми не залежать від мов програмування?". Якщо мова не передбачає GC, можливо, вам доведеться написати його.
JD


0

Я віддаю перевагу C ++ :)


19
-1 C ++ - це жахлива мова для вивчення (і, можливо, ви можете вилучити з цього твердження кваліфікаційний означення).
cletus

4
Йому не потрібно вивчати темні кути C ++, щоб кодувати свої алгоритми на C ++. C ++ цілком чудовий.
Prasoon Saurav

9
тому ви вважаєте, що це гарна ідея спробувати кодувати клас для DS в C ++ і враховувати різницю між конструктором копіювання та перевизначенням оператора equals, посиланнями та вказівниками, що виходять за межі області дії, витоком пам’яті через неправильне new / delete використання тощо? Всі вони є досить фундаментальними для С ++.
cletus

5
але справа в тому, що вам НЕ ПОВИННО вивчати ці речі на python або java. C ++ вимагає набагато більших початкових інвестицій і ні в якому разі не є більш цінним для запитуваної функції ОП
Мантас Відутіс,

2
Будь-яка поважна причина, по якій Javascript не рекомендується використовувати для навчання @cletus?
HalfWebDev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.