Как решить мои трудности при создании алгоритмов? [закрыто]

11
задан StudioWorks 29 August 2010 в 15:28
поделиться

9 ответов

Я думаю, что есть два способа научиться писать алгоритмы: 1. Попробуйте сами (а затем просмотрите его с «правильным» ответом). Конечно, начинать следует с простых. 2. Реализовать чужие алгоритмы (закодировать). Переход от алгоритмов к коду и наоборот дает вам прекрасное «чувство» того, как создаются алгоритмы.

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

В любом случае, я думаю, что изучение алгоритмов — это в основном практика, а не «абстрактное знание», так что будьте готовы запачкать руки..

Удачи!!

7
ответ дан 3 December 2019 в 01:04
поделиться

возможно, вы захотите пройти курс философии по введению в логику. это то же самое, что и с компьютерами, но в другом контексте.

12
ответ дан 3 December 2019 в 01:04
поделиться

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

Или двойной связанный список: представьте себе ряд людей, хватающих за ремень левого и правого соседа. Теперь вы можете представить, что вы должны сделать, чтобы убрать одного человека: его левый сосед должен схватить за ремень правого соседа, а правый сосед — левого соседа. Затем вы можете «удалить» этого человека (или сборщик мусора сделает это за вас в Java и т. д.)

Второй важный навык — понимание рекурсии. Вам всегда нужен базовый случай, обычно включающий пустой список или пустой узел. Когда вы следуете алгоритму в рекурсивном методе, убедитесь, что он правильный, но не следуйте рекурсивным вызовам внутри этого метода. Это сведет вас с ума и ни к чему не приведет. Просто предположим, что рекурсивные вызовы всегда "поступают правильно". Если ваш текущий метод верен, а также базовый вариант, все готово. Как только вы это поймете, вы поймете рекурсию.

7
ответ дан 3 December 2019 в 01:04
поделиться

Я считаю хорошей практикой использовать диаграммы перед реализацией чего-либо. Вы можете сделать диаграммы или написать псевдокод, они полезны, прежде чем вы начнете разрабатывать или реализовывать реальный код.

3
ответ дан 3 December 2019 в 01:04
поделиться

У меня была похожая проблема, когда я впервые познакомился с языками программирования. Я пропустил много лекций, потому что это был мой первый год в колледже! Для меня не было найденных книг или лекций, которые знали бы, как помочь вам думать как программист. Я всегда обнаруживал, что люди, которые преподают, больше не знают, как «не» думать как программист, и в результате они предполагают, что вы знаете простые концепции. Итак, наконец, к концу моего первого года мне пришлось много зубрить, чтобы наверстать упущенное, и мне пришлось самому заполнять пробелы...! Вот как я сейчас думаю о проблемах программирования:

ОБЪЕКТЫ: Для объектно-ориентированного программирования объекты являются ключом ко всему. Если вы думаете о том, что ваша программа должна уметь делать, вы можете разбить программу на более мелкие фрагменты. Например, если вы представляете, как делаете чашку чая, объекты, которые вам нужны для приготовления чашки чая, это:

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 предоставляют вам, и быть знакомым с синтаксисом. Но, как люди уже упоминали вам, прежде чем практика делает совершенным. Это единственный способ, которым вы начнете понимать это, и, поверьте мне, вы поймете это в конце концов... Однажды все это ПОЛУЧИТ для вас смысл, это просто о том, чтобы думать определенным образом. Разбейте все на маленькие простые шаги, а затем расположите шаги в логическом порядке. Сделайте это, и это начнет иметь для вас смысл. ОБЕЩАЮ!!

3
ответ дан 3 December 2019 в 01:04
поделиться

Я бы посоветовал вам попробовать некоторые из веб-сайтов, которые содержат ряд алгоритмических задач для решения. Обычно вы можете найти ряд очень простых проблем для начала и форумы для их обсуждения. Дальше дело за вами и за тем, сколько времени вы потратите на них. Просто постарайтесь вдаваться в детали как можно подробнее и спросите себя, что именно вы не понимаете, как тогда вы могли это понять (возможно, кто-то уже понял это, и вам просто нужно найти ответ). Для самых простых проблем Google более чем достаточно, чтобы найти ответы, которые вы ищете.

А вот список сайтов, которые вы можете попробовать:
uva.onlinejudge.org — Огромный список задач, связанных с разными алгоритмами.
www.topcoder.com/tc — живые соревнования и множество руководств для начала работы.
www.algorithmist.com — содержит список ссылок, собранных с течением времени специалистами по решению проблем.

1
ответ дан 3 December 2019 в 01:04
поделиться

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

Например, если вам когда-либо приходилось переупорядочивать колоду из 52 перемешанных карт, вы, вероятно, уже знакомы с сортировкой вставками или каким-либо вариантом сортировки слиянием. Если вас просят отсортировать в уме пять двузначных чисел, вы, вероятно, используете сортировку выбором. Если вам нужно было найти определенную карту в перемешанной колоде, вы, вероятно, использовали линейный поиск. Если вы когда-нибудь видели игру High Low Game в программе The Price is Right, вы, вероятно, знаете Binary Search. Если вас попросят решить задачу о восьми ферзях в виде «головоломки», вы почти наверняка воспользуетесь классической техникой поиска с возвратом.

Не позволяйте жаргону вроде «инвариант цикла» или «асимптотическая временная сложность» сразу запугать вас. Подумайте о том, как алгоритм справляется с проблемой, и вы обнаружите, что сами «открываете заново» эти термины, когда хотите рассуждать о его правильности или эффективности.

2
ответ дан 3 December 2019 в 01:04
поделиться

Я не знаю, насколько серьезна эта проблема, но это может помочь.

Алгоритмы и структуры данных для меня намного чище, если я думаю о них просто как о неформальных идеях/коробках/фигурах/формах/связях/..., а не об абстрактных вещах.

То есть каждый раз, когда я сталкиваюсь с новой структурой данных, я пытаюсь как-то визуализировать ее, чтобы иметь возможность «увидеть», что отдельные операции делают со структурой.

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

Возьмем в качестве примера задачу преобразования бинарного дерева в список. Итак, я рисую дерево (произвольного размера и с произвольными элементами, но это "хороший" пример). Затем я думаю, как бы мне преобразовать дерево в список вручную:

        1
    2       3
  4   5   6   7

Итак, я думаю: я хочу получить результат [4,2,5,1,6,3,7]. Как я могу сделать это шаг за шагом?

Хорошо, прежде всего я нахожу самый левый элемент (4); как я могу это сделать? Хорошо, я начинаю просто с корня и иду налево, пока больше ничего не будет. Затем я удаляю этот элемент и продолжаю работать с оставшимся деревом:

        1
    2       3
  .   5   6   7

Хорошо, теперь я выберу 2.Как я могу связаться с 2? Хорошо, я могу либо начать снова с корня и идти влево, пока ничего не останется , либо я просто вернусь с удаленного узла.

Затем я иду дальше и ищу повторяющиеся шаблоны, как можно обобщить шаги и т. д.

В результате часто бывает полезно иметь визуальное представление о том, что делает алгоритм, а затем вы можете реализовать его.

4
ответ дан 3 December 2019 в 01:04
поделиться

Если вы хотите прыгнуть вглубь и готовы много работать, есть "Структура и интерпретация компьютерных программ". Он не издается, но доступен в сети.

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

Не делайте это сразу... не торопитесь с этим, возвращайтесь к нему регулярно и получайте удовольствие!

2
ответ дан 3 December 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: