Подтвердить что ты не робот

Улучшить алгоритмическое мышление

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

У вас/были такие же проблемы, как у меня, или у вас есть идеи по этому поводу? Я с нетерпением жду их услышать.

Спасибо всем, заранее.

PS1: Я хочу сказать, что я уже знаю о программировании и о том, как программировать (хотя я на любительском уровне:-)), и я просто хочу улучшить конкретную проблему, а не начинать ее изучать.

P.S.2: Я думаю, что это полезная тема для будущей справки, поэтому я проверил окно wiki сообщества.

4b9b3361

Ответ 1

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

Используйте базы данных проблем и онлайн-судей, как этот сайт, http://uva.onlinejudge.org/index.php, в котором есть сотни проблем, связанных с общими алгоритмами. И вам не обязательно быть экспертом-программистом, чтобы решить любой из них. Вам нужна хорошая способность с логикой и математикой. Там вы можете найти проблемы от самых простых до самых сложных. Большинство из них - программирование марафонов.

Затем вы можете реализовать их на C, С++, Java или Pascal и отправить их онлайн-судье. Если у вас есть хороший алгоритм, он будет принят. Кроме того, судья скажет, что ваш алгоритм дал неправильный ответ на проблему, или потребовалось слишком много времени для решения.

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

Ответ 2

Решать проблемы ежедневно. Следите за светофорами и спросите себя: "Как их синхронизировать, чтобы оптимизировать поток трафика? Или оптимизировать поток пешеходов? Какое лучшее решение для обоих?". Посмотрите на лифты и спросите себя: "Почему эти лифты используют разные правила, чем лифты в этом другом здании, которое я вчера посетил? Как это реально реализовано? Как его можно улучшить?".

Попробуйте увидеть проблему повсюду, даже если она уже решена. Подумайте о решении. Спросите себя, почему ваше собственное превосходное решение, вероятно, не так хорошо, как тот, который вы видите - что вам не хватает?

И так далее. Каждый день. Все время.

Идея состоит в том, что почти все можно рассматривать как алгоритм (цель, которая имеет какой-то смысл для кого-то, и метод, с помощью которого ее можно достичь). Постарайтесь иметь это в виду в следующий раз, когда вы смотрите игру на ТВ, или когда вы читаете новости о последнем банкротстве банка. Спросите себя: "Какова цель?", "Чья это цель?" и "Что такое метод?".

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

Ответ 3

Polya "How To Solve It" - отличная книга для размышлений о том, как решать математические проблемы и делать доказательства, и я бы рекомендовал ее для тех, кто занимается решением проблем.

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

И наряду с этим все это, конечно, практика практической практики.

Ответ 4

Вы можете проверить "Математика и правдоподобное рассуждение" Г. Поля. Это редкая математическая книга, которая на самом деле касается мыслительного процесса, связанного с созданием математических открытий. Я думаю, что это тот же самый мыслительный процесс, который участвует в разработке алгоритмов.

Ответ 5

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

В вашем случае, как насчет проблем в Project Euler? http://projecteuler.net

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

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

Ответ 7

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

Это хорошее начало, но я думаю, что лучший способ изучить и применить алгоритмическое знание -

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

Ответ 8

Я бы предложил этот путь для вас:

1. Сначала изучите элементарные части языка.

2. Затем узнайте о некоторых основных математиках.

3. Переходите к topcoder div2 простым проблемам. Обычно, если вы не можете набрать 250 очков. в любой день, то это означает, что вам нужно много практики, продолжайте практиковать.

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

5.Now перейти к марафонов, не расстраивайтесь, если вы не можете решить quickly.Improvement не произойдет в одночасье, вы должны будете терпеливо продолжать работать трудно.

6. Продолжайте действие шага 5 с этого момента, и вы станете лучшим программистом.

Ответ 9

Еще несколько книг, которые стоит прочитать (в определенном порядке):

  • <я > Ага! Insight (Мартин Гарднер)
  • Любая из книг Programming Pearls (Джон Бентли)
  • Конкретная математика (Грэм, Кнут и Паташник)
  • Математическая теория коммуникации (Клод Шеннон)

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

Ответ 10

Прочитайте SICP/Структура и Интерпретация компьютерных программ и выполните все проблемы; затем прочитайте Искусство компьютерного программирования (все тома), работая над всеми упражнениями, когда идете; затем выполните все проблемы в Project Euler.

Если после этого вам не хватит хороших алгоритмов, у вас, вероятно, нет надежды. LOL!

P.S. SICP доступен бесплатно в Интернете, но вам нужно купить AoCP (получить международный, не для релиза в Северной Америке издание, используемое за 30 долларов США). И я еще не сделал этого сам (я пытаюсь, когда у меня есть свободное время).

Ответ 11

Я могу порекомендовать книгу "Вводная логика и наборы для компьютерных ученых" от Nimal Nissanke (Addison Wesley). Основное внимание уделяется теории множеств, логике предикатов и т.д. В основном математика решения проблем в коде, если хотите. Хороший материал и не слишком сложно работать.

Удачи... Кевин

Ответ 12

Большой как насчет проблем в Project Euler? http://projecteuler.net

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

Ответ 13

Хорошо, поэтому подведем итоги:

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

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

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