Опубликован: 05.01.2015 | Доступ: свободный | Студентов: 2177 / 0 | Длительность: 63:16:00
Лекция 1:

Введение

Лекция 1: 123456 || Лекция 2 >

Программа 1.4. Сжатие пути делением пополам

Если циклы for в программе 1.3 заменить этим кодом, длина любого проходимого пути будет уменьшаться в два раза. Конечный результат этого изменения — превращение деревьев в почти совершенно плоские после выполнения длинной последовательности операций.

for (i = p; i != id[i]; i = id[i])
  id[i] = id[id[i]];
for (j = q; j != id[j]; j = id[j])
  id[j] = id[id[j]];
        

Конечный результат применения рассмотренных алгоритмов решения задачи связности приближается к наилучшему, на который можно было бы рассчитывать в любом практическом случае. Мы имеем легко реализуемые алгоритмы, время выполнения которых гарантированно пропорционально затратам времени на ввод данных с постоянным коэффициентом. Более того, алгоритмы являются оперативными: они рассматривают каждое ребро только один раз и используют объем памяти, который пропорционален количеству объектов; поэтому какие-либо ограничения на количество обрабатываемых ими ребер отсутствуют. Результаты экспериментального исследования, приведенные в табл. 1.1 таблица 1.1, подтверждают вывод, что программа 1.3 и ее варианты с использованием сжатия пути полезны даже в очень больших практических приложениях. Выбор лучшего из этих алгоритмов требует тщательного и сложного анализа (см. "Принципы анализа алгоритмов" .)

Таблица 1.1. Результаты экспериментального исследования алгоритмов объединения-поиска
N M F U W P H
1000 6206 14 25 6 5 3
2500 20236 82 210 13 15 12
5000 41913 304 1172 46 26 25
10000 83857 1216 4577 91 73 50
25000 309802 219 208 216
50000 708701 469 387 497
100000 1545119 1071 1106 1096

Обозначения:

F быстрый поиск (программа 1.1)
U быстрое объединение (программа 1.2)
W взвешенное быстрое объединение (программа 1.3)
P взвешенное быстрое объединение со сжатием пути (упражнение 1.16)
H взвешенное быстрое объединение с делением пополам (программа 1.4)

Эти сравнительные значения времени, затрачиваемого на решение случайных задач связности с использованием алгоритмов объединения-поиска, демонстрируют эффективность взвешенной версии алгоритма быстрого объединения. Дополнительный выигрыш благодаря использованию сжатия пути менее важен. Здесь M — количество случайных соединений, генерируемых до тех пор, пока все N объектов не оказываются связанными. Этот процесс требует значительно больше операций поиск, чем операций объединение, поэтому быстрое объединение выполняется существенно медленнее быстрого поиска. Ни быстрый поиск, ни быстрое объединение не годятся для очень больших N. Время выполнения при использовании взвешенных методов явно пропорционально значению N, поскольку оно уменьшается вдвое при уменьшении N вдвое.

Упражнения

1.4. Приведите содержимое массива id после выполнения каждой операции объединение при использовании алгоритма быстрого поиска (программа 1.1) для решения задачи связности для последовательности 0-2, 1-4, 2-5, 3-6, 0-4, 6-0 и 1-3. Укажите также количество обращений программы к массиву id для каждой вводимой пары.

1.5. Выполните упражнение 1.4, но для алгоритма быстрого объединения (программа 1.2).

1.6. Приведите содержимое массива id после выполнения каждой операции объединение для алгоритма взвешенного быстрого объединения применительно к примерам, соответствующим рис. 1.7 и рис. 1.8.

1.7. Выполните упражнение 1.4, но для алгоритма взвешенного быстрого объединения (программа 1.3).

1.8. Выполните упражнение 1.4, но для алгоритма взвешенного быстрого объединения со сжатием пути делением пополам (программа 1.4).

1.9. Определите верхнюю границу количества машинных инструкций, требующихся для обработки M соединений N объектов при использовании программы 1.3. Например, можно предположить, что для выполнения оператора присваивания C+ + всегда требуется выполнение менее c инструкций, где c — некоторая фиксированная константа.

1.10. Определите минимальное время (в днях), которое потребовалось бы для выполнения быстрого поиска (программа 1.1) для решения задачи с 109 объектов и 106 вводимых пар на компьютере, который может выполнять 109 инструкций в секунду. Считайте, что при каждой итерации внутреннего цикла for должно выполняться не менее 10 инструкций.

1.11. Определите максимальное время (в секундах), которое потребовалось бы для выполнения взвешенного быстрого объединения (программа 1.3) для решения задачи с 1099 объектов и 106 вводимых пар на компьютере, который может выполнять 109 инструкций в секунду. Считайте, что при каждой итерации внешнего цикла while должно выполняться не более 100 инструкций.

1.12. Вычислите среднее расстояние от узла до корня в худшем случае в дереве из 2n узлов, построенном алгоритмом взвешенного быстрого объединения.

1.13. Нарисуйте диаграмму, подобную рис. 1.10, но начав с восьми узлов, а не девяти.

1.14. Приведите последовательность вводимых пар, для которой алгоритм взвешенного быстрого объединения (программа 1.3) создает путь длиной 4.

1.15. Приведите последовательность вводимых пар, для которой алгоритм взвешенного быстрого объединения с сжатием пути делением пополам (программа 1.4) создает путь длиной 4.

1.16. Покажите, как необходимо изменить программу 1.3, чтобы реализовать полное сжатие пути, при котором после каждой операции объединение все обработанные узлы указывают на корень нового дерева.

1.17. Выполните упражнение 1.4, но используйте алгоритм взвешенного быстрого объединения с полным сжатием пути (упражнение 1.16).

1.18. Приведите последовательность вводимых пар, для которой алгоритм взвешенного быстрого объединения с полным сжатием пути (см. упражнение 1.16) создает путь длиной 4.

1.19. Приведите пример, показывающий, что изменения быстрого объединения (программа 1.2) для реализации полного сжатия пути (см. упражнение 1.16) не достаточно, чтобы гарантировать отсутствие длинных путей в деревьях.

1.20. Измените программу 1.3, чтобы в ней для принятия решения, нужно ли устанавливать id[i] = j или id[j] = i, вместо веса использовалась высота деревьев (самый длинный путь от любого узла до корня). Экспериментально сравните этот вариант с программой 1.3.

1.21. Покажите, что лемма 1.3 справедлива для алгоритма, описанного в упражнении 1.20.

1.22. Измените программу 1.4, чтобы она генерировала случайные пары целых чисел в диапазоне от 0 до N— 1 вместо того, чтобы считывать их из стандартного ввода, и выполняла цикл до тех пор, пока не будет выполнено N — 1 операций объединение. Выполните программу для значений N = 103, 104, 105 и 106 и выведите общее количество ребер, генерируемых для каждого значения N.

1.23. Измените программу из упражнения 1.22, чтобы она выводила в виде графика количество ребер, требующихся для соединения N элементов,100 < N< 1000.

1.24. Приведите приближенную формулу для определения количества случайных ребер, требующихся для соединения N объектов, как функции от N.

Лекция 1: 123456 || Лекция 2 >
Бактыгуль Асаинова
Бактыгуль Асаинова

Здравствуйте прошла курсы на тему Алгоритмы С++. Но не пришел сертификат и не доступен.Где и как можно его скаачат?

Александра Боброва
Александра Боброва

Я прошла все лекции на 100%.

Но в https://www.intuit.ru/intuituser/study/diplomas ничего нет.

Что делать? Как получить сертификат?