Как решить мои алгоритмы создания затруднений?
Прежде всего, извините, но мой английский не очень хорошо.
В третьем семестре я участвую в курсе программирования, и я не могу "получить его".
Я прошел предыдущие экзамены, потому что я изучал три раза больше моих коллег. И, теперь, в моем классе Data Structures, когда профессор просит нас составить алгоритмы списка (например), мои коллеги начинают писать код, пока я (или был бы "я"?), Даже после этого, Не понимаю.
Мне так тяжело это больно. Мне нужно 1 час, чтобы понять простые алгоритмы.
Итак, вопрос в том, может ли кто-нибудь порекомендовать мне книги или что-то еще, что поможет мне больше походить на программиста? Я имею в виду, что "нормальные" люди, после заданной проблемы, кажутся сразу же заставляют картинку в голове и звезде писать код.
Ответы
Ответ 1
Я думаю, что есть два способа научиться писать алгоритмы:
1. Попробуйте сами (а затем просмотрите его с помощью "правильного" ответа). Конечно, вы должны начать с простых.
2. Внедрить другие алгоритмы (в код). Переход от алгоритмов к коду и наоборот - дает вам отличное "ощущение" того, как создаются алгоритмы.
Но лучший совет, который я могу вам дать (что вы можете использовать двумя способами выше, чтобы приобрести) - старайтесь быть очень хорошими в некоторых алгоритмах.
Если вы помните, пишите и действительно понимаете даже несколько базовых алгоритмов - вы на правильном пути.
В любом случае, я думаю, что алгоритмы обучения - это в основном практика и менее "абстрактное знание", поэтому приготовьтесь к тому, чтобы ваши руки были грязными.
Желаем удачи!!
Ответ 2
вы, возможно, захотите взять класс философии во введении в логику. это точно так же, как и с компьютерами, но в другом контексте.
Ответ 3
Я обнаружил, что самый важный навык для овладения структурами данных - "визуализировать" их. Если у вас нет четкого представления о вашей структуре данных, все остается нечетким и неопределенным. Например. возьмите стек (единственный связанный список). Это может помочь визуализировать его как стопку пластинок или людей в полонезе (у всех руки на плечах человека перед ним).
Или двойной список: Представьте себе ряд людей, хватающих пояс левого и правого соседа. Теперь вы можете себе представить, что вы должны сделать, чтобы удалить одного человека: его левому соседу нужно схватить пояс правого соседа и правого соседа одного из левого соседа. Затем вы можете "удалить" этого человека (или сборщик мусора сделает это для вас на Java и т.д.)
Второй важный навык - понять рекурсию. Вам всегда нужен базовый регистр, обычно содержащий пустой список или пустой node. Когда вы следуете алгоритму в рекурсивном методе, убедитесь, что он правильный, но не следуйте рекурсивным вызовам внутри этого метода. Это приведет вас в бешенство и ничего не приведет. Предположим, что рекурсивные вызовы всегда "делают правильные вещи". Если ваш текущий метод правильный и базовый регистр, вы закончили. Как только вы это поняли, вы понимаете рекурсию.
Ответ 4
Если это поможет, вы можете попробовать книги на своем родном языке. Если в вашем понимании есть какой-то пробел, который исходит из вашего понимания на английском языке, это добавит вам дополнительных трудностей.
Во-вторых, алгоритм - это всего лишь список шагов для достижения чего-то. Попытайтесь сосредоточиться на чем-то простом, таком как алгоритмы сортировки, они интересны и просты в освоении. Надеюсь, что это поможет.
Ответ 5
Я считаю хорошей практикой использовать диаграммы, прежде чем внедрять что-либо. Вы можете сделать диаграммы или написать псевдокод, они полезны, прежде чем вы начнете разрабатывать или реализовывать фактический код.
Ответ 6
Я не знаю, насколько далеко эта проблема, но она может помочь.
Алгоритмы и структуры данных становятся для меня более чистыми, если я думаю о них как о неформальных идеях/коробках/фигурах/формах/связях/... вместо абстрактных вещей.
То есть каждый раз, когда я сталкиваюсь с новой структурой данных, я пытаюсь как-то визуализировать ее, чтобы фактически "видеть", что делают отдельные операции со структурой.
У меня также была проблема, что я действительно не знал мгновенно, как что-то решить алгоритмически, поэтому я просто пошел и начал рисовать.
Возьмем - как пример - проблему преобразования двоичного дерева в список. Итак, я рисую дерево (произвольного размера и удерживая произвольные элементы, но являясь "хорошим" примером). Затем я думаю, что я бы преобразовал дерево в список вручную:
1
2 3
4 5 6 7
Итак, я думаю: я хочу получить результат [4,2,5,1,6,3,7]
. Как я могу сделать это шаг за шагом?
Хорошо, прежде всего, я нахожу самый левый элемент (4
); как я могу это сделать? Хорошо, я начинаю только с корня и ухожу налево, пока там больше ничего. Затем я удаляю этот элемент и продолжаю с оставшимся деревом:
1
2 3
. 5 6 7
Хорошо, теперь я бы выбрал 2
. Как я могу достичь 2
? Хорошо, я могу либо начать снова в корне, и идти влево, пока там ничего больше, или я просто вернусь из удаленной node.
Затем я продолжаю искать и повторяю шаблоны, как можно обобщать шаги и т.д.
Результатом является то, что часто может быть полезно визуальное представление того, что делает алгоритм, и затем вы можете его реализовать.
Ответ 7
У меня была аналогичная проблема, когда я впервые познакомился с языками программирования. Я пропустил много лекций, потому что это был мой первый год обучения в колледже! Для меня не было книг или лекторов, которые я нашел, которые знали, как помочь вам думать, как программист. Я всегда находил, что учение людей не знало, как "не" больше думать как программист, и в результате они предполагают, что вы знаете простые понятия. Итак, наконец, к концу моего первого года мне пришлось втиснуть, чтобы наверстать упущенное, и мне пришлось заполнить пробелы...! Вот как я сейчас думаю о проблемах программирования:
ОБЪЕКТЫ: Объектно-ориентированные объекты программирования являются ключом ко всему этому. Если вы думаете о том, что именно должна делать ваша программа, вы можете разбить программу на более мелкие куски. Например, если вы представляете себе чашку чая, то предметы, необходимые для приготовления чашки чая:
1 -> A cup
2 -> A tea bag
3 -> Water
4 -> A kettle
5 -> A spoon
6 -> Milk
7 -> Sugar
Итак, теперь ваша программа имеет 7 объектов, которые каким-то образом будут взаимодействовать с чашкой чая. Объекты всегда объявляются как их собственный класс и будут иметь методы-конструкторы, которые при вызове создадут копию (экземпляр) вашего объекта, которая затем может быть использована в вашей программе. Весь метод, который находится внутри вашего класса, определит, какую функциональность может предоставить ваш объект.
Kettle kettle = new Kettle();
kettle.boilWater();
Итак, теперь, когда у вас есть свои объекты, вы должны подумать о своем алгоритме.
АЛГОРИТМЫ: Во всех языках программирования алгоритм - это всего лишь список шагов, которые вы предпринимаете, которые помогут вам достичь конечной цели. В нашем случае наша конечная цель - приготовить чашку чая.
Шаги, которые вы предпримете в своем алгоритме, должны проходить один за другим логически, т.е. вы не можете влить молоко в чайник или вылить холодную воду в чашку и варить сахар и т.д.
Таким образом, наш алгоритм может быть следующим:
Step 1: Pour water into Kettle
Step 2: Turn kettle on - to boil the water
Step 3: Put tea-bag into cup
Step 4: "IF" water is boiled -> pour into cup
"ELSE" wait until water has boiled
Step 5: Stir teabag with spoon
Step 6: Pour milk into cup
Step 7: Put sugar into cup
Step 8: Stir
Всегда есть несколько разных способов, которыми вы можете упорядочить шаги в алгоритмах, которые будут работать, но всегда помните, что у вас есть логический порядок, иначе вы сделаете беспорядок!
Тот же принцип может быть применен и к самым сложным проблемам. Самое важное, что нужно сделать, это попытаться разбить проблему на простейшие шаги и организовать шаги в обычном смысле.
Когда дело доходит до более сложных задач, очевидно, очень важно знать, какие инструменты у вас есть, я знаю, какие функциональные API-интерфейсы предоставляют вам и знакомы с синтаксисом. Но, как люди уже говорили вам, прежде чем практика станет совершенной. Это единственный способ, с помощью которого вы начнете понимать это и поверьте мне, что вы его получите в конце концов... Однажды все это будет иметь для вас смысл, это просто мысль об определенном пути. Разбейте все на небольшие простые шаги, а затем выполните шаги логичным образом. Сделайте это, и это начнет иметь смысл для вас. Я ОБЕЩАЮТ!!
Ответ 8
Если вы хотите прыгнуть в глубокий угол и готовы много работать, "Структура и интерпретация компьютерных программ" . Он выходит из печати, но доступен в сети.
Он углубляется в процессы концептуального мышления за программированием и превращает их в код. Он использует схему, но принципы применимы повсюду, и это отличная тренировка для сгибания мышц абстракции.
Не делай этого за один раз... не торопитесь с ним, регулярно возвращайтесь к нему и получайте удовольствие!
Ответ 9
Попробуйте подумать о том, как вы приближаетесь к повседневным когнитивным проблемам, и формализовать шаги, которые вы предпринимаете для их решения, на бумаге.
Например, если вам когда-либо приходилось переупорядочивать колоду из 52 разбросанных карт, вы, вероятно, знаете, что сортировка Insertion или какой-либо вариант Merge Sort уже есть. Если вас попросят отсортировать пять двузначных чисел в вашей голове, вы, вероятно, используете Selection Sort. Если вам нужно было найти определенную карту из перепутанной колоды, вы, вероятно, использовали Linear Search. Если вы когда-либо видели "High Low Game" на "Цена правильная", вы, вероятно, знаете Binary Search. Если вас попросят решить проблему 8-Queens как "головоломку", вы почти наверняка будете использовать классический метод возврата назад.
Не позволяйте жаргону, как "инвариант цикла" или "асимптотическая временная сложность", сразу же запугать вас. Подумайте о том, как алгоритм имеет дело с проблемой, и вы сами обнаружите, что "заново открываете" эти термины, когда хотите рассуждать о его правильности или эффективности.
Ответ 10
Я бы посоветовал вам попробовать некоторые из сайтов, которые содержат ряд алгоритмических проблем для решения. Обычно вы можете найти ряд очень простых проблем для начала и форумы для их обсуждения. Тогда это зависит от вас и сколько времени вы тратите на них. Просто постарайтесь максимально подробно остановиться на себе и спросите себя, что именно вы не понимаете, тогда как вы могли понять это (возможно, кто-то уже понял это, и вам просто нужно найти ответ). Для самых простых проблем Google более чем достаточно, чтобы найти ответы, которые вы ищете.
И вот список сайтов, которые вы могли бы попробовать:
uva.onlinejudge.org - Огромный список проблем, связанных с различными алгоритмами.
www.topcoder.com/tc - Живые конкурсы и множество учебников для начала.
www.algorithmist.com - Создает список ссылок, собранных с течением времени с помощью решателей проблем.