Ответ 1
Математика для программистов. Хорошо прочитано.
С момента выхода из очень маленькой школы в 2006 году с плохо сформированной и устаревшей программой (я иностранец и не знал лучшей школы в то время), я понял, что пропустил много основных концепции из математической и программной перспективы, которые в основном являются основой других высших концепций.
т.е. Я пытался слушать/смотреть открытые учебные материалы из MIT на Введение в алгоритмы, но быстро понял, что мне не хватает нескольких математических понятий, чтобы лучше понять курс.
Итак, каковы основные математические концепции, которые должен знать хороший инженер-программист? И каковы возможные книги/сайты, которые вы мне порекомендуете?
Математика для программистов. Хорошо прочитано.
Булева алгебра фундаментальна для понимания структур управления и рефакторинга. Например, я видел много ошибок, вызванных программистами, которые не знали (или не могли использовать) закон deMorgan. В качестве другого примера, сколько программистов сразу узнают, что
if (condition-1) {
if (condition-2) {
action-1
} else {
action-2
} else {
action-2
}
можно переписать как
if (condition-1 and condition-2) {
action-1
} else {
action-2
}
Дискретная математика и комбинаторика чрезвычайно полезны в понимании производительности различных алгоритмов и структур данных.
Как упоминалось в "Балтимарке", математическая индукция очень полезна в рассуждениях о циклах и рекурсии.
Теория множеств является основой реляционных баз данных и SQL.
По аналогии, позвольте мне отметить, что плотники обычно используют различные техники большого пальца при построении таких вещей, как крыши и лестницы. Однако знание геометрии позволяет решать проблемы, для которых у вас нет "законсервированного" эмпирического правила. Это, как научиться читать через фонетику против восприятия зрения базового словаря. 90 +% времени там нет большой разницы. Но когда вы сталкиваетесь с незнакомой ситуацией, ОЧЕНЬ приятно иметь инструменты для выработки решения самостоятельно.
Наконец, строгость/точность, требуемые математикой, очень полезны для программирования, независимо от конкретной техники. Опять же, многие ошибки в программировании (или даже спецификации), которые я видел в своей карьере, небрежно думают по их первопричине.
Я бы пошел с полями, которые Ландон сказал:
Дискретная математика, линейная алгебра, Комбинаторика, вероятность и Статистика, теория графов
и добавьте математическую логику.
Это позволит вам захватить большинство областей CS. Если вы хотите перейти в специальные поля, вам нужно совершить погружение в некоторые области, особенно:
Computer graphics -> Linear Algebra
Gaming -> Linear Algebra, Physics
Computer Linguistics -> Statistics, Graph Theory
AI -> Statistics, Stochastics, Logic, Graph Theory
В порядке важности:
Все более продвинутое, чем обычно, зависит от конкретного алгоритма или зависит от домена. В зависимости от того, в каких областях вы заинтересованы, может также быть актуальным следующее:
Понимание функций также полезно (не помните, что такое математический термин для этой области), но если вы знаете, как программировать, вы, вероятно, уже это сделали.
Моя точка зрения: десятилетний должен знать достаточную математику, чтобы понимать программирование. Для базового понимания вещей не требуется очень много математики. Это все о логике, действительно.
"Доказательство по индукции" является основной математической концепцией для программистов.
нотация Big O в общем алгоритме анализа и в отношении стандартных коллекций (сортировка, вставка и удаление извлечения)
Для дискретной математики здесь является удивительным набором из 20 лекций из Университета Арсджигита. Каждый из них составляет около часа и двадцать минут.
Начните с того, что мы, люди СС, называем "дискретной математикой". Исчисление и линейная алгебра могут оказаться весьма полезными, потому что они получают вашу ногу в дверь во многие области приложений. Как только вы освоите эти три, перейдите к теории вероятностей. Эти 4 получат доступ к компетенции в 95% (я сделал это) домены приложений.
Конкретная математика охватывает большинство основных тем. Хорошая книга по дискретной математике, например, Rosen дискретная математика и ее приложения, заполнит любые пробелы.
Я думаю, это зависит от вашего внимания. Несколько лет назад я купил набор Art of Computer Programming Дональда Кнута. Посмотрев на книги, я понял почти все исчисления. Если вы заинтересованы в разработке своих собственных универсальных алгоритмов и доказательств для них, я рекомендую понять эти книги с тех пор, с чем вы столкнулись в этом мире. С другой стороны, если вы хотите или нужно использовать различные процедуры сортировки/поиска/дерева/etc..., тогда большая нотация O как минимум, логическая математика и общая алгебра будут в порядке. Если вы имеете дело с 3D, тогда геометрия и триггер также.
Я склонен быть больше на стороне использования, чем делать доказательства, и хотя мне хотелось бы думать, что я делал некоторые умные вещи за годы, которые я никогда не садился, и разработал новую процедуру сортировки. Лучший совет, который я могу дать, это узнать, что вам нужно для вашей области, но выставляйте себя на более высокие уровни, чтобы вы знали, что он существует, и сколько еще нужно учиться, в противном случае вы не получите большого роста.
Я бы сказал логическую логику. И, ИЛИ, XOR, NOT. Я нашел в качестве программиста, что мы используем это чаще, чем остальные математические понятия.
Базовая алгебра и статистика являются хорошими отправными точками и основой для многих других областей.
Вот простой, который меня озадачивает, когда я вижу разработчиков, которые этого не понимают:
- Порядок действий
Глава 1 "Искусство компьютерного программирования" призвана обеспечить именно это.
Была книга, которая была рекомендована... название было чем-то вроде Concrete Mathematics. Это было рекомендовано в нескольких вопросах.
Вернувшись в школу, мои преподаватели сказали, что для бизнес-приложений все, что вам нужно знать, знайте, добавляйте, вычитайте, умножьте и разделите. Все остальные формулы, которые запрашивающий запросит, будут знать и сообщать вам, что необходимо. Теперь поймите, что это для финансирования отчетности и школы, ориентированной на приложения. До сих пор это подтвердилось для меня. Мне никогда не нужно было больше знать.
Проверить книгу Основы компьютерной науки
Эта книга создана: Al Aho и Jeff Ullman, а вся книга доступна в Интернете.
Это то, что авторы в своем предисловии говорят о цели этой книги:
" Основы компьютерной науки охватывают предметы, которые часто встречаются раздвоенными
между дискретным курсом математики и последовательностью второго уровня в компьютере
науки в структурах данных. Мы намеревались выбрать математический
основы с глазу на то, что пользователю компьютера действительно нужно, а не
что математик может выбрать.
сайт для чистки по математике: http://www.khanacademy.org/
Мой математический фон действительно беден (геолог по образованию), но я взял дискретный математический класс в старшей школе, и я использую понятия каждый день в качестве программиста. Это, наверное, самый ценный класс, который я получил во всем своем образовании, поскольку это касается моей нынешней профессии.
Дискретная математика
Линейная алгебра
Комбинаторика
Вероятность и статистика
Теория графа
Хорошо, это зависит от цели. Как сказал кто-то, линейная алгебра, комбинаторика, вероятность и статистика и теория графов важны, если вы решаете сложные проблемы. Асимптотический рост функций (бит-О-нотация) очень важен. Вам также потребуется освоить суммы и серии, если вам нужно будет работать над анализом некоторых более сложных алгоритмов (см. Приложение к Cormen & others Intro to Algorithms).
Даже если вы входите в "Java для предприятия" или "серверный PHP", вы найдете некоторую статистику и сложность алгоритма (следовательно, комбинаторика, индукция, суммирование, серия и т.д.) полезны, когда ваш босс хочет, чтобы вы заставить сервер работать быстрее, а добавление нового оборудования, похоже, не поможет.:-) Я прошел через это один раз.
Почему все, включая вероятность и статистику в золотом списке, не упоминают исчисление? Невозможно понять, что такое вероятность и статистика, без хотя бы рабочего знания границ, производных, интегралов и рядов. И в целом, исчисление (вместе с линейной алгеброй) является рабочей лошадкой всей математики.
Я считаю, что алгоритмы и теория имеют большое значение. Возможность быстрого и правильного решения отличает отличных программистов от остальных. Также важно иметь возможность доказать свой алгоритм (используя стандартные методы доказательства - индукция, противоречие и т.д.).
Да, я бы сказал, что базовое понимание индукции помогает понять, что n представляет в алгоритмах. Также полезно использовать некоторые логические и дискретные структуры.
Вероятность и статистика очень полезны, если вам когда-либо приходилось делать что-либо похожее на машинное обучение.
Я освещаю основы в своем блоге "" Вычислить свой навык", где я обсуждаю, как работает Xbox Live TrueSkill и алгоритм Matchmaking.