Чем алгоритмы отличаются от шаблонов проектирования? - PullRequest
1 голос
/ 18 мая 2011

Я новичок в программировании на C;исходящий из OOP PHP фона.

Я нахожу C (не удивительно) гораздо более сложным языком.У меня было особенно много проблем, когда я сначала разбирался с массивами: вроде нет собственного ассоциативного массива.

Теперь, эта часть, я думаю, я поняла понемногу, но теперь у меня есть вопрос относительно разговора, который у меня был вчера с разработчиком C.Она объясняла мне алгоритм бинарного поиска, потому что я спросил ее, существуют ли библиотеки для работы с массивами в C или нет, потому что это кажется более разумным решением, чем постоянное повторное изобретение колеса.

Я бы действительноВы хотите больше узнать об алгоритмах на C, в частности, какие различия существуют между алгоритмами и шаблонами проектирования, которые я привык использовать в PHP?

Ответы [ 2 ]

4 голосов
/ 19 мая 2011

Упорядочение: степень поддержки C для чего-либо вроде ассоциативного массива будет qsort для сортировки массива структур на основе ключа и bsearch для поиска структуры на основе ключа.Есть, конечно, немало альтернатив - в разных других библиотеках есть хеш-таблицы, сбалансированные деревья и т. Д. Точно о том, что подойдет для ваших целей, сложно догадаться.

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

  1. Искусство компьютерного программирования Дональда Кнута.Это в значительной степени книга алгоритмов класса .Сейчас (наконец) до четырех томов.Изначально Кнут начал работу над ним в 1967 году, планируя написать 7 томов.Только три тома были доступны в течение длинного времени.Четвертый был добавлен совсем недавно.При такой скорости он достигнет 7, только если Кнут доживет до 100 лет.Тем не менее, части, которые там есть, чрезвычайно хороши - но (предупреждение!) Он анализирует алгоритмы в значительных деталях;если вы не знаете хотя бы небольшого исчисления, вероятно, будет трудно следовать изрядной сумме.

  2. Введение в алгоритмы от Cormen, Leiserson, Rivest иШтейн.IIRC, теперь есть более новое издание, чем у меня, которое добавляет еще одного автора.Это большая книга (уронить ее на носки было бы очень больно).В нем используется значительное количество математических обозначений и тому подобное, но если вы хотите немного поработать над поиском обозначений, это действительно довольно понятно.Он охватывает довольно много важных основ (например, алгоритмы графа), которые запланированы для более поздних томов Кнута, но недоступны (по крайней мере, пока) там.

  3. Алгоритмы иСтруктуры данных Ахо, Хопкрафта и Уллмана.Это (довольно справедливо) самый маленький, самый легкий и, по крайней мере, для большинства людей, вероятно, самый простой из них.

  4. Хотя он доступен только для использования, если вы можетенайдите копию Algorithms + Структуры данных = Программы от Niklaus Wirth, это то, что я действительно рекомендую.Он использует Паскаль (неудивительно - Никлаус Вирт изобрел Паскаль), но этого достаточно, как С, чтобы это не вызывало реальной проблемы.Это не так глубоко, как Кнут, о каждом алгоритме, но все же достаточно, чтобы дать хорошее представление о том, когда один из них может быть хорошим выбором по сравнению с другим.Для кого-то на вашей должности (некоторый опыт в программировании, но мало в этой области) это моя главная рекомендация.

Хотя я уже говорил это, думаю, стоит повторить: ИМО,следует избегать всех книг Роберта Седжвика по алгоритмам. Алгоритмы в C ++ , вероятно, являются худшими из них, но остальные только незначительно лучше.Код, который они включают (опять же, особенно версия C ++), действительно выполним, а описания алгоритмов часто неполны и / или вводят в заблуждение.В последних выпусках исправлено некоторых проблем, но (IMO) недостаточно для того, чтобы их можно было рекомендовать.Если бы не было никакой альтернативы, вы могли бы , вероятно, обойтись с этими, но учитывая количество альтернатив, которые значительно превосходят, единственная причина читать их вообще, если кто-то дает их вам, и вы абсолютно не может позволить себе что-нибудь еще.

Что касается алгоритмов в сравнении с шаблонами проектирования, то линия может местами размыться, но в целом алгоритм гораздо более четко определен.Алгоритм обычно имеет конкретный, строго определенный ввод, который он обрабатывает особым образом для получения одинаково конкретного результата / вывода.Шаблон дизайна имеет тенденцию быть более свободно определенным, более общим.Алгоритм также может быть универсальным (например, для алгоритмов сортировки может потребоваться тип, который определяет строгое, слабое упорядочение), но все еще предъявляются специфические требования к типу.

Шаблон проектирования имеет тенденциюбыть несколько более свободно определенным.Например, шаблон посетителя включает в себя обработку групп объектов - но мы не хотим изменять типы этих объектов, когда решаем, что нам нужно обрабатывать их новым и другим способом.Мы делаем это, определяя процессы отдельно от обрабатываемых объектов, а также то, как мы проходим группы объектов и позволяем процессу работать с каждым.

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

1 голос
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...