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

Прежде всего, извините, но мой английский не очень хорошо.

В третьем семестре я участвую в курсе программирования, и я не могу "получить его".

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