Генерация m -последовательностей 0 и 1.
Для решения можно использовать алгоритм генерации размещений с повторениями, где xi = 0 и yi = 1.
Однако если в условии задано ограничение на количество 0 или 1, то при таком подходе заведомо будут генерироваться лишние последовательности. В этом случае лучше использовать алгоритм генерации сочетаний без повторений для номеров мест, на которые будут расставляться 0 или 1. При получении каждой сгенерированной комбинации номеров мест для 1 (0) в массиве С, нужно обнулить (заполнить 1) массив А требуемых m-последовательностей, а затем расставить в нём на места из массива С единицы (нули).
Вычисление кратного интеграла.
Для приближенного вычисления кратного интеграла использовать формулу центральных прямоугольников
,
где , , k – кратность интеграла, h – шаг разбиения (вводится с клавиатуры). Для решения используется алгоритм генерации размещений с повторениями для номеров интервалов по каждой переменной.
4. Раскрытие полиномиальной формулы.
Для раскрытия полиномиальной формулы используется алгоритм генерации размещений с повторениями для получения степеней разложения, в котором для каждой сгенерированной комбинации проверяется условие . На экран монитора выводится формула разложения полинома с использованием знака ^ для операции возведения в степень.
Использование принципа включений и исключений.
Для вычисления по формуле включений и исключений генерируются сочетания без повторений для номеров проверяемых свойств. Для каждого числа свойств генерируются различные сочетания, а для каждой сгенерированной комбинации вычисляется (или извлекается) и суммируется количество элементов, удовлетворяющих соответствующему свойству или набору свойств, затем вычисление суммы добавляются в формулу включений и исключений с нужным знаком.
|
|
6. Решение задачи коммивояжера.
Используется алгоритм генерации перестановок без повторений, в котором для каждой комбинации вычисляется суммарное расстояние, пройденное коммивояжером, и определяется минимальное из этих расстояний.
Варианты заданий
1. Написать программу разгадки числового ребуса
П Ч Ё Л К А * 7 = Ж Ж Ж Ж Ж Ж
2. Написать программу разгадки числового ребуса
П Р О П : О = Р Ц И Я
3. Написать программу разгадки числового ребуса
С С С Р = Р Ф
4. Написать программу разгадки числового ребуса
(М + О + С + К + В + А) 4 = М О С К В А
5. Написать программу разгадки числового ребуса
6. Написать программу разгадки числового ребуса
С А Р = А Т О В
7. Написать программу генерации m-последовательностей 0 и 1, удовлетворяющих обоим требованиям:
1) число единиц должно быть чётно (включая 0 единиц);
|
|
2) число нулей должно быть не меньше числа единиц.
8. Написать программу генерации m-последовательностей 0 и 1, удовлетворяющих обоим требованиям:
1) число единиц должно быть не меньше m / 2 - 2;
2) хотя бы 2 единицы шли подряд.
9. Написать программу генерации m-последовательностей 0 и 1, удовлетворяющих обоим требованиям:
1) число нулей должно быть не больше m / 2 + 2;
2) никакие 2 нуля не шли подряд.
10. Написать программу генерации m-последовательностей 0 и 1, удовлетворяющих обоим требованиям:
1) число нулей должно быть нечётно;
2) число нулей должно быть меньше числа единиц не больше, чем на 3.
11. Написать программу генерации m-последовательностей 0 и 1, удовлетворяющих обоим требованиям:
1) никакие 3 единицы не стоят рядом;
2) число единиц превосходит число нулей.
Лабораторная работа №3.
Машинное представление графа
Приведем вначале сравнительную характеристику существующих способов представления графа в памяти ЭВМ, их достоинства и недостатки.
Рассмотрим конечный граф G=(V , E), где |V|=n, |E|=m.
Матрица инциденций.
Ориентированный граф задается прямоугольной матрицей B(n´m), элементы которой определяются по правилу:
где a – любое натуральное число, отличное от 1. У неориентированного графа оба элемента матрицы, соответствующие вершинам, инцидентным ребру ej, равны 1.
|
|
Это представление графа является самым неудобным, так как объем занимаемой памяти равен n × m единиц, причем в каждом столбце только две ненулевые ячейки. Кроме нерационального использования памяти недостатком этого способа представления является неудобный доступ к информации. Например, для ответа на вопросы:
а) существует ли ребро (дуга) (vi , vj);
б) к каким вершинам ведут ребра (дуги) из вершины vi
требуется, в худшем случае, перебор n × m элементов, т.е. порядка n × m шагов алгоритма. От этого недостатка свободен следующий способ представления графа.
Матрица смежности.
Элементы квадратной матрицы A(n´n) определяются следующим образом:
Проверка существования ребра (дуги) (vi , vj) осуществляется за один шаг, в отличие от матрицы инциденций, однако, проверка свойств графа на основе такого представления требует, в худшем случае, порядка n2 шагов алгоритма. При этом способе объем неиспользованной памяти по-прежнему велик.
Заметим, что для сокращения объема используемой памяти возможно использование 1-го бита для хранения элемента aij, но при этом, выигрывая в памяти, мы затрудняем доступ к информации. В этом случае придется применять операции для работы с битами информации, используя различные маски.
|
|
При работе со взвешенными графами для хранения весов ребер (дуг) требуются дополнительные одномерные массивы размера m (для случая матрицы инциденций) или матрицы размера n´n (для случая матрицы смежности). Это обстоятельство делает неприемлимым использование матрицы смежности для взвешенных графов, так как количество неиспользованных единиц памяти увеличивается в k раз, где k – число весов ребер (дуг).
Съэкономить объем используемой памяти можно, применяя представление графа в виде
Таблицы ребер.
Она представляет собой матрицу размером m´2, каждая строка которой содержит вершины инцидентные i-му ребру (i-ой дуге). Для работы со взвешенными графами нужно добавить к матрице столбцы, соответствующие весам ребер (дуг).
Однако, этому способу представления графа присущ тот же недостаток, что и матрице инциденций, - неудобство доступа к информации, хотя число шагов при поиске ребра здесь значительно меньше (порядка m). Поиск можно ускорить, введя лексикографический порядок в упорядочении пар и применяя двоичный поиск.
Наиболее удобной и экономичной формой представления графа являются
Списки инцидентности.
Для каждой вершины viÎV создается список записей, характерезующих ребра (дуги), инцидентные этой вершине. Таким образом, это представление использует объем памяти порядка (n+m), поиск вершины смежной с данной требует порядка (n+m) шагов, проверка свойств графа осуществляется за число шагов порядка . Поэтому остановимся подробнее на этом способе задания графа.
Каждая запись содержит две части: информационную и ссылочную. В информационную часть включаются поля:
а) вершина vj, смежная с вершиной vi;
б) веса ребер (дуг) при работе со взвешенными графами;
в) другая вспомогательная информация о ребре (дуге), если это необходимо для работы с графом.
Ссылочная часть содержит:
а) ссылку на следующую запись списка;
б) ссылку на предыдущую запись списка (для двунаправленных списков);
в) ссылку на запись, содержащую вершину vi, в списке инцидентности вершины vj (для неориентированного графа).
Типы «запись» и «ссылка на запись» должны быть предварительно описаны в программе. Например, описание
type ref = Ù Elem;
Elem = record
num: integer;
ves: array [1 .. kv] of real;
sled, pred, ref_vi: ref;
end;
определяет запись, характерезующую ребро взвешенного неориентированного графа с числом весов kv, и ссылку на эту запись (типизированный указатель). В данном примере используется двунаправленные списки.
Ссылки на первую запись каждого списка хранятся в массиве, размер которого равен числу вершин графа. В программе должна быть описана переменная типа «массив», элементы которого имеют тип «ссылка на запись». Например,
var mas_ref: array [1 .. n] of ref;
Если вершина vi является изолированной, то mas_ref [vi]= nil.
Структуру представления графа в памяти ЭВМ можно схематично представить следующим образом:
Рис. 1
На этом рисунке изображены фрагменты списков инцидентности неориентированного графа, соответствующие ребру графа . У ориентированного графа в каждой записи будет отсутствовать третье ссылочное поле, и не будет дублирования в списке инцидентности конечной вершины дуги.
Например, неориентированный граф
Рис. 2
имеет cледующее представление в памяти
Рис. 3
Для ориентированных графов могут формироваться как списки вершин, следующих за текущей, так и предшествующих ей вершин.
Для формирования машинного представления графа необходимо сформировать список инцидентности для каждой вершины графа и заполнить массив ссылок на эти списки. Формирование списка инцидентности может осуществляться по принципу стека (LIFO), когда новая запись включается в начало списка, или по принципу очереди (FIFO), когда новая запись ставится в конец списка.
Напомним, что для включения записи в список нужно выделить область динамической памяти, соответствующую размеру записи, и заполнить ее поля.
При работе с графом часто требуется выполнить действия, изменяющие его структуру. К ним относятся:
1. Добавление ребра (дуги) (vi, vj) в граф G.
Для этого нужно:
а) добавить запись с вершиной vj в список инцидентности вершины vi;
б) для неориентированного графа добавить запись с вершиной vi в список инцидентности вершины vj.
2. Удаление ребра (дуги) (vi, vj) из графа G (осуществляется аналогично добавлению ребра (дуги)).
3. Удаление вершины vi из графа G.
Для этого нужно удалить все ребра (дуги) инцидентные вершине vi (т.е. удалить все записи из списка вершины vi, а для неориентированных графов – и соответствующие записи из списков смежных с ней вершин) и изменить ссылку в массиве ссылок на списки инцидентности mas_ref [vi]= nil.
Часто кроме изменения структуры графа для более эффективной работы алгоритмов требуется сортировка (упорядочение) списков инцидентности. При этом применяются известные алгоритмы сортировки, следует лишь заметить, что при изменении порядка записей в списке изменяются только поля sled, pred в записях списка.
Ввод графа осуществляется из текстового файла одного из двух видов: «таблица смежности» или «таблица ребер». Такие файлы по-разному формируются и интерпретируются для неориентированных и ориентированных графов: для неориентированного графа задаются ребра графа, а для ориентированного – дуги. То есть, ребро неориентированного графа задается один раз, а соответствующие ему записи автоматически включаются в списки инцидентности обоих его концов.
Файл «таблица смежности» состоит из блоков, соответствующих вершинам графа. Каждый блок имеет следующую структуру:
начальная вершина: список смежных с ней вершин
соответствующие ребрам веса
Количество строк с весами ребер равно kv, число вершин списка равно числу весов в строках. Блоки в таком файле могут располагаться в произвольном порядке, причем, если вершина не является начальной ни для одного ребра (дуги) или ребро уже включено в список инцидентности другого его конца, то соответствующий ей блок может отсутствовать в файле.
Например, файл «таблица смежности» графа, изображенного на рис.2 имеет вид
v1: v3 v4
5 10
v3: v4
7
v4: v5
4,
а ориентированный граф
Рис.4
задается «таблицей смежности»
1: 2 3
2: 3
3: 1
Файл «таблица ребер» имеет следующую структуру:
начальные вершины ребер (дуг)
конечные вершины ребер (дуг)
веса ребер (дуг)
Также как и для «таблицы смежности» количество элементов в каждой из строк должно быть одинаковым, а число весов равно kv. Если строка данных не умещается на экран монитора, то для удобства просмотра файла можно перенести оставшиеся части ниже в том же порядке, отделив одну часть от другой пустой строкой.
Например, файл «таблица ребер» графа, изображенного на рис.2 имеет вид.
v 1 v 1 v 4 v 4
v 4 v 3 v 3 v 5
10 5 7 4
Вывод списков инцидентности графа на экран или в файл осуществляется в соответствии со структурой аналогичной файлу «таблица смежности». При этом просматривается список каждой вершины, если он непуст, то выводится: СП, затем в скобках вершина, : , список вершин смежных с ней. Например, выводимая информация имеет вид:
а) для графа (рис.2)
СП(v 1): v 3 v 4
СП(v 3): v 1 v 4
СП(v 4): v 1 v 3 v 5
СП(v 5): v 4;
б) для графа (рис.4)
Списки следования: Списки предшествования:
СП [1]: 2 3 СП [1]: 3
СП [2]: 3 СП [2]: 1
СП [3]: 1 СП [3]: 2 1.
Дата добавления: 2020-12-12; просмотров: 117; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!