Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
14.04.2015
Размер:
204.29 Кб
Скачать

ГЛАВА 5. Р А З Р А Б О Т К А А Л Г О Р И Т М А

5.1. ОБЩИЕ ПОЛОЖЕНИЯ

. . .

5.2. ПРИМЕР ПОЛНОГО ПОСТРОЕНИЯ АЛГОРИТМА

Пусть перед нами поставлена следующая задача: необходимо разработать алгоритм, формирующий всевозможные сочетания без повторений из заданных символов. Алгоритм должен быть применим для класса задач, которые могут быть представлены как процедура построения собственного подмножества В множества А отдельных объектов (их число равно N); собственное подмножество состоит из множества подмножеств, элементами которых являются сочетания без повторений объектов из данного множества А (напоминаем, что в собственное подмножество не входят как пустое так и полное подмножества , то есть В НА , B №Ж, В№ A).

При разработке алгоритма воспользуемся методом "сверху-вниз". Очевидно, алгоритм должен включать в себя процедуру ввода исходного множества А символов (объектов), инициализацию, процедуру формирования всех подмножеств выборок, а также процедуру вывода сформированных подмножеств (рис. 5.2а). Далее заметим, что подмножества должны быть сгруппированы по признаку одинаковой длины L выборок и, соответственно, вывод сформированного подмножества PL с выборками длины L может быть произведен сразу, в цикле по L (рис.5.2б). Это дает экономию памяти по сравнению с предыдущим вариантом алгоритма .

Рассмотрим один из возможных способов формирования подмножества PL. Очевидно, что новое подмножество (назовем его NP) может быть получено из предыдущего дописыванием к его элементам символов из множества А. При этом нужно учесть, что если элемент qОPL имеет последний символ ls (last symbol), ls=A[N], то к нему уже больше нечего дописывать. Поэтому имеет смысл из подмножества PL образовать подмножество PLl, не содержащее элементов, последний символ p которых совпадает с ls; такие элементы мы будем называть особыми, а процедуру удаления особых элементов будем называть DEL. Процедуру дописывания к выбранным из подмножества PLl элементам q символов xОA обозначим INS. Тогда процедура формирования нового подмножества NP из подмножества PL может быть реализована последовательным применением процедур DEL и INS (рис.5.2в).

Более тщательное рассмотрение процедур показывает, что изолированная реализация каждой из них является избыточной по временной сложности, так как и в первой, и во второй процедуре используется перебор в цикле элементов подмножеств PL и PLl, но поочередно. Поэтому целесообразно организовать общий для них цикл по К, где К - номер элемента qОPL (рис.5.2г). Тогда эти процедуры необходимо несколько изменить и увязать их в общем цикле (рис.5.2д); число повторений цикла определяется количеством элементов в подмножестве PL: Q=СLn. При выходе из цикла подмножествo NP следует переименовать в PL, т. е. переписать содержимое файла с именем NP в файл с именем PL (NP обнуляется) . В процедуре DEL теперь будет решаться вопрос: "Удалить элемент q=PL[K] ?"; в случае положительного ответа процедура INS для элемента q не выполняется; исключение элемента q осуществляется по признаку cовпадения символов: p=ls (предварительно для q определяется его последний символ - last symbol of the element - p = LSE (q) ). Этот фрагмент СА представлен на рис. 5.2д. В случае отрицательного ответа элемент q обрабатывается процедурой INS, где на его основе формируются новые элементы множества NP. Отметим здесь же, что имеет смысл вынести из цикла по К (и по L тоже) определение ls, ибо эта вершина не зависит от параметров этих циклов.

Рассмотрим процедуру INS . Должно быть ясно, что к элементу q надо дописывать не все символы хОА, а только те, которые во множестве А идут после символа, содержащего с последним символом р элемента q . Так, если А={a,b,c,d,e} и q= ab, то LSE(q)=b, и {c,d,e}. Обозначим NA множество дополнительных к р символов из множества А; для нашего примера NA ={c,d,e} . Тогда процедура NA - это формирование множества NA, которое получается исключением из А всех элементов слева до р включительно. Далее можно непосредственно реализовать в цикле по I (I - номер символа в множестве NA) процедуру дописывания по одному символу хОNA к элементу q, пока выбранный из NA символ не окажется последним; полученные новые элементы эаносятся в множество NP слева направо. Затем призводится переименование множества (PL:=NP). Этот фрагмент СА представлен на рисунке 5.2е.

Отметим, что процедура LSE, NA, а также операции занесения элемента в множество нами не определены. Конкретная их реализация зависит от выбора структуры данных; доработать данный алгоритм с учётом выбранных структур данных можно самостоятельно. "За бортом" остались также вопросы формирования имени подмножества, переменной длины подмножества, ввода и вывода данных; решение этих вопросов в большей мере определяется языком программирования. Мы же "соберём" наш алгоритм из отдельных, уже продуманных фрагментов. При этом с целью стыковки фрагментов СА в неё включены дополнительные блоки: блоки инициализации всех циклов (L:=1; K:=0; I:=0), блоки общей инициализации (ls:=A[N]- это константа; NP:=A - для единообразия обработки подмножества Р1); блок вывода PL переставлен в начало цикла по L с целью единообразия обработки всех подмножеств PL (включая Р1). Схема алгоритма построения собственного подмножества, составленного из фрагментов СА с учётом их стыковки и замечаний о неполноте проработки, приведена на рис. 5.3.

Рис. 5.2. Поэтапнное построение СА.

Рис.5.3. Полная схема алгоритма построения собственного подмножества.