УДК 510.52:372.851
Рублев В.С., Юсуфов М.Т.
Ярославский государственный университет им. П.Г. Демидова, г. Ярославль, Россия
АВТОМАТИЗИРОВАННАЯ СИСТЕМА ДЛЯ ОБУЧЕНИЯ АНАЛИЗУ ВЫЧИСЛИТЕЛЬНОЙ СЛОЖНОСТИ АЛГОРИТМОВ
АННОТАЦИЯ
Исследуются вопросы построения автоматизированной обучающей системы «Анализ сложности алгоритмов», которая позволит учащемуся освоить сложный математический аппарат и развить логико-математическое мышление в этом направлении. Вводится технология символьной прокрутки алгоритма, позволяющая получать верхние и нижние оценки вычислительной сложности. Приводятся утверждения, облегчающие анализ в случае целочисленного округления параметров алгоритма, а также при оценке сложности сумм. Вводится нормальная система символьных преобразований, позволяющая, с одной стороны, делать учащемуся любые символьные преобразования, а с другой стороны - упростить автоматический контроль корректности таких преобразований.
КЛЮЧЕВЫЕ СЛОВА
Автоматизированное обучение; анализ сложности алгоритмов; оценка вычислительной сложности алгоритмов; таблица символьной прокрутки алгоритма; теоремы об анализе сложности алгоритма; нормальная система символьных преобразований.
Rublev V.S., Yusufov M.T.
Yaroslavl State University of Demidov, Yaroslavl, Russia
AUTOMATED SYSTEM FOR TEACHING COMPUTATIONAL COMPLEXITY OF
ALGORITHMS COURSE
ABSTRACT
Article describes problems of designing automated teaching system for "Computational complexity of algorithms" course of study. This system should provide its students with means to familiarize themselves with complex mathematical apparatus and improve their mathematical thinking in respective area. Then article introduces the technique of algorithms symbol scroll table that allows estimating lower and upper bounds of computational complexity. Further, we introduce a set of theorems that facilitate analysis in cases when integer rounding of algorithm's parameters is involved and when analyzing complexity of a sum. At the end, article introduces a normal system of symbol transformations that both allows one to perform any symbol transformations and simplifies automated validation of such transformations.
KEYWORDS
Automated learning; algorithm complexity analysis; estimating algorithms' computational complexity; algorithm's symbol scroll table; theorems on analysis of computational complexity; normal system of symbol transformations.
Введение
Однои из важных сторон образования специалиста по компьютерным наукам является обучение анализу вычислительнои сложности алгоритмов. Это позволяет в практическои его деятельности выбирать лучшии в тех или иных условиях алгоритм и прогнозировать время выполнения программы. Успех в этом направлении может быть достигнут только при индивидуальном обучении. Однако большое количество индивидуальных задании требует
больших временных затрат от преподавателя. Возможным решением этой проблемы может являться некий программный комплекс, позволяющий управлять индивидуальной работой каждого из студентов - автоматизированная обучающая система. Обучение на расстоянии - это альтернативныи способ обучения, не требующии непосредственного контакта с преподавателем. Рост популярности дистанционных методов обучения в настоящее время основан на том, что они предоставляют возможность заниматься в удобное время и практически в любом месте.
Исследование подходов к построению автоматизированной обучающей системы
Существующие автоматизированные системы обучения хорошо решают проблемы обучения в тех областях знании, где определениям и неглубоким связям между ними можно обучить при помощи тестов. Но анализ алгоритмов требует развития логико-математического мышления, следовательно, существует необходимость в интеллектуальных системах обучения, направленных на развитие такого мышления и приобретения знании и навыков в сложнои области знании [1].
Существует большое количество программных систем, называющихся обучающими (например, Moodle, С1агоНпе, Dokeos, АТМог), но большинство из них не поддерживают полньш цикл обучения (методики) - это всего лишь приложения, которые предоставляют доступ к текстам, выдают задания и проверяют их [2]. Более продвинутым решением является использование в процессе обучения различных методик, которые изменяют поведение системы по отношению к конкретному пользователю в зависимости от его индивидуальных особенностеи. Для решения этои задачи предлагается использовать адаптивные обучающие системы (АОС), основная парадигма которых - адаптация к каждому студенту. Адаптивные технологии обучения появились сравнительно недавно, но завоевали популярность среди разработчиков обучающих систем. В основе адаптивного обучения лежат следующие методологии:
• построение последовательности курса обучения;
• интеллектуальным анализ решении задач;
• интерактивная поддержка в решении задач;
• поддержка в решении задач на примерах;
• адаптивная поддержка в навигации;
• адаптивное представление;
• адаптивная поддержка сотрудничества пользователеи системы (обучающихся). Применение этих методологии обеспечивает систему гибкостью в отношении к пользователю и в отношении к представлению материала для изучения.
В дополнение к концепции адаптивных систем теоретической и методологической базой становится утверждение о том, что обучение может быть сведено к совокупности следующих составляющих:
• информации, необходимои для изучения;
• контрольным мероприятиям, позволяющим проверять знания по данным материалам;
• способу оценки уровня полученных знании;
• последующему управлению - важному и самому сложному механизму, делающему систему именно обучающеи.
Следовательно, необходимо ответить на следующие вопросы: как провести разбиение, как вести контроль и насколько гибкои будет система по отношению к пользователю.
Методология адаптивного обучения хорошо ложится на следующие постулаты о процессе обучения:
• любои сложныи для понимания материал может быть разбит на последовательность таких малых порции, что каждая порция после освоения предыдущих может быть понята;
• для любой порции изучаемого материала может быть разработано некоторое конечное количество контрольных тестов, упражнений, задач таких, что при выполнении их студентом можно с достаточной точностью гарантировать усвоение им материала этой порции.
Поэтому весь материал, подлежащии обучению, и контрольные тесты, упражнения, задачи разобьем на секции так, что каждая секция будет представлять совокупность материала (текста для обучения) и контроля (обучения этому материалу).
Весь материал для обучения можно разделить на две большие категории. В первую категорию воидут секции, дающие основные теоретические знания и понятия по определению алгоритма, вычислительнои сложности и асимптотическим оценкам трудоемкости. Основная цель этих секции - развитие и тренировка памяти обучаемого с использованием навыков запоминания. Контроль этих секции, чаще всего, производится с помощью тестирования.
Однако, в программу курса также входит обучение неформальному использованию математического аппарата, и в этом месте возникают дополнительные трудности. К ним относятся технические трудности, связанные с вводом формул и их преобразованием, и трудности, связанные с недостаточным уровнем логического мышления учащегося, которьш должен достигнуть цели, конструируя последовательность ведущих к неи преобразовании. Таким образом, определяется вторая категория секции, связанных с математическими методами оценки сложности алгоритма и направленных на развитие логико-математического мышления.
Выделяются следующие черты, отличающие вторую категорию секции от первои. Во-первых, контроль материала секции второи категории не может быть основан только на тестировании, потому что необходимо проверять умение учащегося использовать различные математические приемы. Во-вторых, при изучении материала требуется научить обучаемого связывать отдельные приемы в целенаправленным процесс путем конструирования последовательности изученных приемов. В-третьих, нужно проконтролировать умение связывать несколько процессов при решении итоговои задачи по оценке вычислительнои сложности алгоритма. Одним из инструментов, используемых в контроле материала секции второи категории, является алгоритм проверки символьных преобразовании.
Материал и контроль взаимодеиствуют с помощью третьего компонента системы, ответственного за определение объема материала за один сеанс, набор задании и их количество, а также другие параметры системы. Именно этот компонент придает системе гибкость и отличает АОС от приложения, которое умеет только выдавать текст и набор тестов по нему. Далее следует описание предлагаемого сценария взаимодеиствия системы и пользователя.
При входе в систему пользователь видит список секции курса, которые делятся на доступные и недоступные в соответствии с планом прохождения курса. Каждая секция должна быть проидена одна за другои по порядку (принцип линеиного обучения). При входе в секцию студенту предоставляется для изучения ее материал. После изучения материала он переходит к контролю полученных знании, для прохождения которого он должен выполнить определенное в секции начальное количество задании (тестов, упражнении, задач). На каждыи вопрос теста предлагается несколько вариантов ответов (обычно 6), случаино выбранных из заранее определенного для каждого задания множества ответов. Среди предлагаемых ответов может быть несколько правильных, или все правильные, или ни одного правильного. Студент должен отметить все правильные ответы. Но если, по его мнению, правильных ответов нет, то он должен выбрать именно такои ответ. Система считает задание выполненным, если студент отметил все правильные ответы и ни одного неправильного. В противном случае она выводит на экран или один из текстов: «Не все правильные ответы отмечены», «Некоторые из отмеченных ответов не верны», или их комбинацию и предоставляет фрагмент текста материала секции, связанный с совершеннои ошибкои. После изучения этого фрагмента или повторного изучения всего материала секции студент имеет возможность повторно ответить на вопрос задания. Если же он опять не выполнит задание, то оно будет заменено на два дополнительных задания. Таким образом, число задании для прохождения секции может расти. Сеанс работы со студентом будет прекращен при достижении некоторого предельного количества задании секции, и он сможет вернуться к обучению только после определенного перерыва. Если студент добивается прерывания сеанса несколько раз подряд, то его учетная запись в системе временно блокируется, а сам он вызывается к преподавателю. В случае, когда сначала студент заработал много дополнительных задании, а затем начал отвечать безошибочно, число контрольных задании начинает снижаться по некоторои прогрессии. Такои подход заставляет студента внимательно и вдумчиво относиться к материалу секции. Таким образом, организуется не только контроль знании секции, но и обучение. Только после выполнения всех задании студент сможет переити к изучению материала следующеи секции.
Однако, существуют секции, материал которых опирается на предыдущие секции и не может быть освоен без безусловного владения материалом этих предыдущих секции. В таких секциях проводится дополнительным контроль знании предыдущих секции. При этом количество начальных задании для повторения секции снижается до одного.
Вычислительная сложность алгоритмов и методика получения оценок сложности
Переидем к описанию предметнои области, поскольку материал секции тесно связан с нею. Сначала напомним определение вычислительнои сложности алгоритма. Под вычислительнои сложностью алгоритма чаще всего понимают время (число шагов), требующееся для выполнения алгоритма в зависимости от некоторых входных параметров. И хотя в некоторых случаях интерес представляет не только рост времени с ростом параметров, но и рост памяти, используемои для работы алгоритма, мы будем использовать термин сложность алгоритма для обозначения его
временной сложности.
Для оценки быстроты роста числа шагов Т(п), где п - выделенный параметр данных, используют О-нотацию: Т(п) = 0(f(n)), означающую оценку сверху быстроты роста Т(п) скоростью изменения f(n), т. е.
ЗС > 0,n0,Vn > п0:Т(п) < С ■ f(n), а также используют П-нотацию: Т(п) = П(д(п)), означающую оценку снизу быстроты роста Т(п) скоростью изменения д(п), т. е.
ЗС > 0, n0,Vn > п0:Т(п) > С ■ д(п). Эти оценки могут быть как завышенными, так и заниженными соответственно. Например, для Т(п) = п2 — п + 3 нотации Т(п) = П(п), Т(п) = 0(п3) дают соответственно заниженную и завышенную оценку быстроты роста Т(п).
Поэтому наиболее удачны двусторонние оценки, используемые 0-нотациеи [2]: Т(п) = &(f(n)), означающую оценки сверху и снизу быстроты роста однои и тои же функциеи f(n), т. е.
ЗСх > 0,С2 > 0,n0,Vn > п0: С1 • f(n) < Т(п) < С2 • f(n). Так, в примере выше: Т(п) < С • п2.
Очень важен выбор видов функции f(n), которые участвуют в оценке скорости роста сложности алгоритма. В теории сложности алгоритмов принят некоторьш ряд из функции
logn, nm'k, 2п,
где п - параметр алгоритма (как правило, целочисленным), т,к - некоторые целочисленные константы, а также из функции, полученных суперпозициеи функции этого ряда. Например,
loglogn,log1/2n,n3/2,nlog",22 . Если выделено несколько параметров данных алгоритма, то 0-нотация скорости роста сложности алгоритма определяется через суперпозицию функции от каждого параметра. Например, Т(п,т,к) = ®(2nmlogk).
Переидем к методике получения оценок вычислительнои сложности алгоритмов. Нашеи целью является получение оценок сложности алгоритмов в виде 0-нотации скорости ее роста, если это возможно, или в противном случае в виде О-нотации и П-нотации. Но так как эта оценка связана с оценкои сложности циклов, то в первую очередь мы рассмотрим, как получить эту оценку для одного цикла.
Поскольку сложность алгоритма, содержащего циклы, определяется количеством выполнения этих циклов, то в основе методики получения оценок лежит составление символьной таблицы прокрутки алгоритма. В этои таблице каждои переменнои алгоритма соответствует свои столбец, а также в неи есть некоторые специальные столбцы:
• для каждого цикла столбец с номером выполнения цикла и символьным обозначением этого номера при последнем выполнении цикла;
• столбец Условие цикла, в котором записывается символьное условие выполнения цикла для последнего его выполнения с комментарием посл. вып. и условие выхода из цикла с комментарием выход.
В эти условия входит символьное значение параметра номера последнего выполнения цикла. Использование этих условии дает 2 оценки количества выполнения цикла, определенного символом: снизу и сверху. Анализ этих оценок позволяет определить временную сложность цикла, если выражения условии не являются сложными. Чаще всего ([2]) оценки снизу и сверху разнятся только константным множителем, что приводит к 0-нотации Т(п) = e(f(n)) скорости роста времени выполнения цикла по параметру алгоритма п. Рассмотрим пример 1 алгоритма с одним циклом:
void f1 (unsigned long n) { float x = n; while (x > 2) x = sqrt(x);
}
Составим таблицу символьнои прокрутки, включив в нее столбец i с номером выполнения цикла, столбец со значением параметра цикла и столбец с условием выполнения цикла. При этом р в столбце i обозначает номер последнего выполнения цикла.
Анализ последнего выполнения цикла дает неравенство п(1/2)Р 1 >2, из которого следует log2 п > 2Р_1, откуда получаем неравенство р < log2 log2 п + 1. Из условия выхода из цикла п(1/2)р < 2 следует неравенство р > log2 log2 п, и так как р определяет временную сложность алгоритма, то мы получаем
Тп(п) = 0 (log logn).
i X условие цикла
п
1 п1/2 п > 2
2 п(1/2)2 п1/2 > 2
3 п(1/2)3 п(1/2)2 > 2
i п(1/2); n(1/2)i_1 > 2
Р П(1/2)Р n(l/2)P" 1 > 2 посл. вып.
р + 1 n(1/2)P > 2 выход
Таблица 1. Символьная прокрутка алгоритма 1
Если циклы не являются вложенными и не являются зависимыми (параметр, определяемый первым циклом, не участвует во втором), то, определив временную сложность каждого из циклов, для временнои сложности алгоритма берем наибольшую из них.
Если циклы вложены, но независимы (количество выполнения внутреннего цикла не зависит от номера выполнения внешнего цикла), то для определения общеи сложности таких циклов их сложности перемножаются. Так, если внешнии цикл А имеет сложность ТА(пА) = 0(/(пл)), а внутреннии цикл В имеет сложность Тв(пв) = 0(д(пв)), то их общая сложность
ТАв(пА,пв) = в(/(пА)-д(пв)). При невложенных, но зависимых циклах для первого из них надо определять значение параметра, участвующего во втором цикле. Рассмотрим пример 2 алгоритма для этого случая: void f2 (unsigned long n) { float x = n, z = n; while (x > 2) { x = sqrt(x);
}
while (z /= 2 > 1);
}
Составим таблицу символьнои прокрутки, включив в нее столбец Иц с номерами циклов 1 и 2, столбцы i1, ¿2 с номерами выполнения каждого цикла, столбцы х, z со значением этих переменных и столбец с условием выполнения цикла. При этом рг в столбце i± обозначает номер последнего выполнения цикла 1 (внешнего), а р2 в столбце i2 - номер последнего выполнения цикла 2 (внутреннего). В таблице мы будем записывать только изменение значении объектов каждого столбца.
Анализ цикла 1 такои же, как и в предыдущем примере 1, и приводит к оценкам снизу и сверху для количества выполнения этого цикла log2 log2 п < рг < log2 log2 п + 1, из которого следует рг = log2 log2 п. Это дает следующую временную сложность цикла 1: ^(n) = 0(loglogn).
N„
Pi Pi + 1
1
2
P2 P?. + 1
г1/2 (1/2)2
п
п(1/2)г n(l/2)P!
Таблица 2. Символьная прокрутка алгоритма 2 условие цикла
п2Р i/2 n2pi/22
п2Р1/2
Р 2
п > 2
п1/2 > 2
n(i/2)i"1 > 2
n(i/2)Pi"1 > 2 посл. вып. n(i/2)Pi > 2 выход
П2Р1 > 1
n2pi/2 > 1
nzpi/2P2-i > 1 посл. вып. n2pi/2Р2 > 1 выход
Анализ условия последнего выполнения цикла 2: п2 1 /2Р2 1 > 1, учитывая значение рх
2
приводит к неравенству 2Р2 1 < n2l0S2l0g2 п = п1°ё2 п. Логарифмируя неравенство получаем р2 — 1 < log| п, что дает р2 < log| п + 1, а учитывая целочисленность р2 получаем р2 < log2 п.
Анализ выхода из цикла 2: n2Pl/2P2 < 1 приводит, учитывая значение р1, к неравенству 2Р2 > ^2iog2iog2n = niog2n. Логарифмируя его, получаем p2>\og2n, что вместе с предыдущим неравенством дает р2 = log^n, и, следовательно, временная сложность цикла 2: Т2(п) = 0(log|n). Выбирая максимальную оценку временнои сложности циклов окончательно получаем временную сложность алгоритма:
Tf2(n) = 0(log2n).
Если циклы вложены и зависимы, то временная сложность алгоритма образуется из суммарного количества выполнения вложенного цикла по всем выполнениям внешнего. Рассмотрим пример 3 для этого случая.
void f3 (unsigned long n) { float x = n, y, z = n; while (x > 2) { x = sqrt(x); z = z * z; У = z;
while (y /= 2 > 1);
}
}
Составим таблицу символьнои прокрутки (на следующеи странице), включив в нее столбец Л/ц с номерами циклов 1 и 2, столбцы i1, i2 с номерами выполнения каждого цикла, столбцы х, z, у со значением этих переменных и столбец с условием выполнения цикла. При этом рг в столбце i± обозначает номер последнего выполнения цикла 1 (внешнего), а р2 в столбце i2 - номер последнего выполнения цикла 2 (внутреннего). В таблице мы будем записывать только изменение значении объектов каждого столбца.
Таблица 3. Символьная прокрутка алгоритма 3
¿1 ¿2 X z У условие цикла
п n
1 2 1 1 2 ni/2 n2 n2 n2/2 n2/22 n > 2 n2/2 > 1 n2'/22 > 1
1 2 Р2(1) р2(1) + 1 n(i/2)2 22 n2/2P2(l) n2/2P2(1) + 1 г2 n2/2P2(l) > 1 n2/2P2(l) + l > 1 n1/2 > 2 посл. вып. выход
2 1 2 Рг (2) р2(2) + 1 n2'/2 n2'/22 n22/2P2(2) n22/2P2(2) + l n2'/2 > 1 n2l/22 > 1 n22/2P2(2) > 1 n22/2P2(2) + l > 1 посл. вып. выход
1 i n(i/2); 2l 2l n(l/2)i"1 > 2
2 1 2 р2(0 Рг(0 + 1 n2l/2 n2l/22 n2l/2P2(l) n2i/2P2(i) + l n2l/2 > 1 n2'/22 > 1 п2;/2Р2« > 1 п2;/2Р2(0+1 > 1 посл. вып. выход
1 2 Pi 1 2 n(1/2)Pl 2P1 n2'Pl n2Pl/2 n2Pl/22 п(1/2)Р1_1 > 2 n2Pl/2 > 1 n2Pl/22 > 1 посл. вып.
1 Pi + 1 P2(Pi) P2(Pi) + 1 n2Pl/2?2(Pl) n2Pl/2P2(Pl) + l n2Pl/2P2(Pl) > 1 n2Pl/2P2(pi)+1 > 1 n(!/2)Pl > 2 посл. вып. выход выход
Анализ количества выполнения цикла 1 такой же, как и в предыдущих примерах 1 и 2, и приводит к оценкам снизу и сверху для количества выполнения этого цикла log2 log2 п < р1 < log2 log2 п + 1, из которого следует рг = log2 log2 п.
Общее количество выполнения цикла 2 дается формулои Т2(п) = Ц^РгШ. Для его нахождения определим общии член этои суммы p2(i) как количество выполнении цикла 2 при ¿-м выполнении цикла 1. При последнем выполнении такого цикла 2 имеет место неравенство n2'/2P2(l) > 1, откуда получаем 2P2(l) < п2', что после логарифмирования дает неравенство p2(i) < 2'logzn. При выходе из такого цикла имеет место неравенство n2Pl/2P2(l)+1 < 1, откуда получаем 2P2W+i > п21,что после логарифмирования и переноса единицы дает неравенство р2(0 > 2'logzn — 1. Подставляя полученные неравенства в сумму, получим оценки снизу и сверху для общего количества выполнения цикла 2: log2 п — 1) < Х^1 p2(i) < Ц^12' log2 п.
Преобразуем сумму в верхнеи оценке: Х^12' log2 п = log2 п^1 2' = 2(2Pl — 1) log2 п = 2 (21о§2 iog2 и — 1) log2 п = 2 (log2 п — 1) log2 п < 2 log! п.
Теперь преобразуем сумму в нижнеи оценке: log2 п — 1) = Х^12' log2 n — pi =
2(log2 n — 1) log2 n — p1 = 2 log! n — log2 n — log2 log2 n > 2 log! n — log! n — n = n. Подставляя обе оценки, получим -log! n < H?1 P2 (0 < 2 log!n, откуда следует временная сложность алгоритма Т^3(п) = 0(log2n).
Заметим, что во всех примерах условия выхода из циклов задается неравенством, включающим параметр алгоритма и параметр номера последнего выполнения цикла. В общем случае условие выхода из цикла может быть сложнои булевои функциеи. Однако, любую булеву функцию можно преобразовать к дизъюнктивнои нормальнои форме (ДНФ), а затем исследовать для каждои элементарнои конъюнкции ДНФ все входящие в нее неравенства и равенства, из которых оценить снизу выражение значения номера последнего выполнения цикла, при котором все входящие в элементарную конъюнкцию условия становятся истинными. Взяв минимальную из оценок по всем элементарным конъюнкциям ДНФ, получим оценку снизу на значение номера последнего выполнения цикла. Аналогичным образом можно получить оценку сверху этого параметра из ДНФ последнего выполнения цикла. Рассмотрим пример алгоритма 4:
void f4(unsigned long n) { float x, y; x = y = n;
while (x > 1 || y > 2048) { x = x / 2; У = У - 128;
}
}
Составим таблицу символьнои прокрутки, включив в нее по одному столбцу для каждои элементарнои конъюнкции из записи условия цикла в ДНФ.
Таблица 4. Символьная прокрутка алгоритма 4
i X У Условие 1 Условие 2
п п
1 п 2 п — 128 п 2 > 1 п — 128 > 2048
2 п 2 п — 128-2 п 2^> 1 п — 128 -2 > 2048
i п 2 п — 128 • i п ^>1 2' п — 128-i> 2048
Р п 2 п — 128-р п — > 1 2Р п — 128 • р > 2048 посл. вып.
р + 1 п п — 128 • (р + 1) п > 1 п — 128 • (р + 1) > 2048 выход
2Р+1
Анализ количества выполнении цикла с условием 1 приводит к оценкам сверху и снизу
log2 п — 1 < р < log2 п, что может дать оценку 0(logn). Анализ условия 2 дает иные оценки---
128
17 < р <--16, что может дать оценку 0(п). Из этого следует, что алгоритм может иметь разные
оценки в разных диапазонах параметра п. Чтобы уточнить эти диапазоны, приравняем верхние и
нижние оценки для условии:--16 = log2n,--17 = log2n —1; Уравнения получились
128 128
эквивалентными, поэтому дальше рассматриваем только одно из них. Его корнями являются числа п1 = 3558 и п2 = 0.00001.
Если внимательно взглянуть на условие цикла, то можно заметить, что цикл не выполнится ни разу при значениях параметра от 0 до 2048 включительно, поэтому второи корень нас не интересует. При значениях параметра от 2048 до 3558 включительно оценка будет линеинои, а при значениях параметра от 3559 и выше оценка будет логарифмической Таким образом, сложность алгоритма 0(logn).
Анализ условий циклов и его упрощение в некоторых случаях
Общим для всех рассмотренных примеров условии (выполнения цикла или выхода из цикла) является отношение, которое может быть приведено к виду:
f (p, n) <знак операции отношения> <выражение, не содержащее параметры p и n>, где n - натуральный параметр алгоритма, а p - параметр номера выполнения цикла. В простых случаях функции f (p, n) сравнительно просто получить 0-нотацию роста количества выполнении цикла через рост n. Но в случае сложного вида этои функции достаточно получить скорость изменения функции f (p, n) при росте ее параметров в виде 0-нотации для более простои функции g (p, n), позволяющеи провести дальнеишии анализ отношения:
f (p, n) = 0(g (p, n) ),
означающую 3C1 > 0, C2 > 0,n0,Vp > 0,n > n0: C1 ■ g(p,n) < f(p,n) < C2 ■ g(p,n). Так, если алгоритм целочисленный (параметры принимают только целые значения за счет преобразования к целому), то анализ получаемых выражении может быть осложнен. Суммирование последовательностеи, отличающихся от арифметическои или геометрическои последовательностей также усложнит анализ. Следующие теоремы позволяют получить 0-нотацию для многократных операции целых частеи линеиных выражении от параметра п и 0-нотацию через интегралы для целочисленных сумм.
Пусть ^(а ■ п + b) = а ■ п + b линеиная форма с натуральным параметром алгоритма п и положительным а. Обозначим через ^р(а ■ п + Ь) функцию ^р(а ■ п + b) = а ■ (а ■ ... (а ■ п + Ь) + —+ b) + Ь, полученную р-кратным применением формы а через ^р([а ■ п + Ь]) = [а ■ [а ■ ... • [а ■ п + Ь] + —+ b] + Ь], где квадратные скобки означают целую часть выражения, функцию полученную р-кратным применением формы к целои части значения линеинои формы. В том случае, когда такая функция связана с количеством шагов цикла, нас интересует оценка скорости ее изменения. Однако, при а > 1 указанная функция возрастает с ростом п и нас интересует 0-нотация этого возрастания, а при а < 1 она убывает с ростом п и нас интересует 0-нотация скорости ее убывания. Следующая теорема позволяет при получении 0-нотации снять операцию взятия целои части.
Теорема 1. Пусть a, b вещественные коэффициенты линейной формы а ■п + Ъ с а>0, и натуральным п. Тогда ^р([а ■ п + b]) = в(р.р(а ■ п + Ь)) = 0(арп).
В качестве примера использования теоремы 1 приведем анализ алгоритма следующеи процедуры A:
procedure A (unsigned long N) { for (unsigned long k = N; k > 1; k = k/2);
}
Цикл будет выполняться p раз и при последнем выполнении цикла переменная k примет значение
1. Поэтому из условия • [г • • [2 • "■] = 1 получаем 1 < • N < 2, что при
логарифмировании дает оценку log2 N — 1 < р < log2 N, а, следовательно, временная сложность процедуры оценивается как 0(log2 N).
Следующая теорема 2 устанавливает оценку вычислительнои сложности конечнои суммы через 0-нотацию интеграла.
Теорема 2. Пусть для неотрицательной монотонно возрастающей функции /(х) (х > 0) рост ее значении ограничен условием /(х) < С ■ f(x — 1), где константа С > 1. Тогда справедлива следующая формула
п /и \
^ /(х) = 01 J /(х) dx I (Vrn > 0).
х=т \т-1 )
В качестве примера использования теоремы 2 приведем анализ алгоритма следующеи процедуры B:
procedure B (unsigned long n) { unsigned long m = 0;
for (unsigned long i = 1, j = 2; i < n; i++, j <<= 1)
m += i * j; while (m--);
}
Временная сложность первого цикла оценивается как 0 (n), а временную сложность второго цикла определяет суммарное время выполнения второго цикла 0(üf=1 i • 2') = 0(/^_ох • 2х dx) = 0(п2"). Поэтому временная сложность процедуры B оценивается как 0(п2").
Условие теоремы 2 является существенным, так как при его нарушении интеграл не является элементарнои функциеи. Однако и в этом случае удается получить оценку сложности суммы как 0-нотацию верхнего предела суммирования, что утверждает следующая теорема 3.
Теорема 3. Пусть для положительной монотонно возрастающей функции /(х), (х > 0),
функция д(х), определённая отношением ) = д(х), (х > 1), является монотонно возрастающей неограниченной сверху функцией. Тогда справедлива следующая формула
п
^ /(х) = 0(/(n)), (Vn>m> 0).
х=т
В качестве примера использования теоремы 3 приведем анализ алгоритма следующеи процедуры C:
procedure C (unsigned long n) { unsigned long k = 0, m = 1;
for (int i = 1; i <= n; i++) { m *= i; k += m; while (k--);
}
}
Временная сложность первого цикла оценивается как 0 (п), а временную сложность второго цикла определяет суммарное количество его выполнении k = üf=1ü. Так как g(i) = = i и g(i) >
2 при i > п0 = 2, то по теореме 3 получаем 0(üf=1i!) = 0(п!). Используя формулу Стирлинга, получаем, что временная сложность процедуры C оценивается как 0(п").
Нормальная система символьных преобразований
Приведенные теоремы позволяют ускорить анализ сложности алгоритмов определенного класса. Но, так как это возможно не во всех случаях, то для анализа приходится выполнять преобразования символьных выражении, а также равенств и неравенств с такими выражениями. Поэтому появляется проблема контроля правильности проведения преобразовании студентом. Подход с использованием сложных систем преобразования символьных выражении, например, Mathcad, является неверным, так как они не помогают научить студента выполнять эти преобразования. Воспользуемся следующим подходом: сначала выделим те части анализа, которые требуют таких преобразовании, а затем выделим некоторую ограниченную группу допустимых преобразовании, при помощи которых может быть выполнено любое преобразование, необходимое для анализа сложности алгоритма. Назовем эту группу нормальными преобразованиями. Случаями использования символьных преобразовании являются следующие:
• символьная прокрутка алгоритма с преобразованием выражении, определяющих изменение данных алгоритма на этапе анализа значения переменных в таблице;
• конструирование неравенств для параметра отдельного цикла с помощью таблицы символьнои прокрутки. Эти неравенства и определяют вычислительную сложность этого цикла;
• символьное преобразование равенств и неравенств как для переменных, так и для количества итерации циклов;
• проведение оценки итоговои сложности алгоритма по сложности отдельных циклов или по суммарным оценкам изменения параметров сложности алгоритма.
В качестве первого допустимого преобразования возьмем изменение порядка двух рядом стоящих аддитивных членов или множителеи. Все остальные допустимые преобразования не будут изменять порядок преобразуемых членов. Контроль таких преобразовании упрощается, но через них все равно можно выразить любое необходимое преобразование.
Перечислим допустимые шаги символьного преобразования формулы равенства - систему нормальных преобразовании равенств:
• перестановка членов в формуле - замена местами двух членов только в одном месте формулы, где такая перестановка допустима;
• перестановка членов формулы из однои части равенства в другую со сменои знака;
• арифметические преобразования: сокращение только одного общего множителя;
• арифметические преобразования: вынесение только одного общего множителя;
• арифметические преобразования: разложение на множители, причем факторизация происходит атомарно (выносится только один из множителеи);
• арифметические преобразования: использование основных тождеств для функции/операции (множество функции, заранее определенных в интерфеисе системы);
• символьное раскрытие скобок - только в одном месте формулы может быть раскрыта одна пара скобок;
• символьное группирование - однократное заключение в скобки некоторои части формулы (вся часть находится в одном месте формулы) с вынесением за скобки общего члена в скобках;
• символьное разложение на множители выражения, если оно может быть записано в виде произведения сомножителеи;
• символьное разложение на множители степенеи выражения, если она может быть записана в виде произведения сомножителеи;
• символьное разложение на множители произведения сумм в выражении, если оно может быть записано в виде произведения сомножителеи; порядок членов не должен изменяться
• однократное символьное перемножение степенеи выражения, которое объединяет члены, содержащие одинаковые степени общего подвыражения;
• однократное символьное перемножение произведения сумм в выражении с соблюдением порядка записи каждого из полученных слагаемых (деиствие похоже на символьное раскрытие скобок).
Аналогично строится система нормальных преобразовании для неравенств. Но при получении неравенств для преобразования к верхним и нижним оценкам сложности циклов вводится дополнительные нормальные преобразования:
• перемещение ведущего аддитивного члена (максимальная скорость роста) на первое место в однои из частеи неравенства;
• усиление оценки сверху отбрасыванием аддитивных частеи со знаком минус;
• усиление оценки снизу отбрасыванием аддитивных частеи со знаком плюс;
• оценивание в оценке сверху неведущего аддитивного члена со знаком плюс через ведущии член;
• оценивание в оценке снизу неведущего аддитивного члена со знаком минус через ведущии член.
Указанная система нормальных преобразовании требует введения дополнительных секции АОС для обучения этому материалу. Поэтому предлагается следующии порядок секции АОС:
1. Характеристики сложности алгоритма;
2. Определение временной сложности алгоритма;
3. Система нормальных преобразований равенств;
4. Таблица символьной прокрутки алгоритма;
5. Система нормальных преобразований неравенств;
6. Оценивание временной сложности алгоритма с простым циклом;
7. Оценивание временной сложности алгоритма с вложенным независимым циклом;
8. Оценивание временной сложности алгоритма с невложенными зависимыми циклами;
9. Оценивание временной сложности алгоритма с вложенными зависимыми циклами;
10. Оценивание временной сложности алгоритма с целочисленными преобразованиями выражений;
11. Оценивание временной сложности алгоритма с суммированием последовательностей количества выполнения цикла;
12. Итоговое задание.
При необходимости сложную по обучению секцию можно разбить на подсекции (например, секции с системои нормальных преобразовании).
Заключение
Описанньш подход обучения анализу сложности алгоритмов позволяет переити • к построению методического обеспечения, выделяющего для каждои секции и подсекции материал обучения и контрольные тесты, упражнения, задачи, необходимые для взаимодеиствия учащегося с материалом в процессе обучения и контроля усвоения материала;
• к построению программного обеспечения, позволяющего через интерфеис выполнять все этапы обучения.
Выразим надежду, что описанныи подход к построению автоматизированнои обучающеи системы анализу вычислительнои сложности алгоритмов будет реализован и покажет эффективность в обучении этому предмету и развитию логико-математического мышления студентов.
Литература
1. Ермилова А. В., Рублев В. С. Проблемы развития математического мышления учащихся на примере обучающей системы по курсу "Алгоритмы и анализ сложности" // Современные информационные технологии и ИТ-образование / / Сборник избранных трудов IX Международной научно-практической конференции. Под ред. проф. В.А. Сухомлина. - М.: ИНТУИТ.РУ, 2014. - С.297-304
2. Кормен Т. и др. Алгоритмы: построение и анализ. — М.: «Вильямс», 2013.
References
1. Ermilova A. V., Rublev V. S. Problemy razvitiya matematicheskogo myshleniya uchashchikhsya na primere obuchayushchey sistemy po kursu "Algoritmy i analiz slozhnosti" / / Sovremennye informatsionnye tekhnologii i IT-obrazovanie / / Sbornik izbrannykh trudov IX Mezhdunarodnoy nauchno-prakticheskoy konferentsii. Pod red. prof. V.A. Sukhomlina. - M.: INTUIT.RU, 2014. - S.297-304
2. Kormen T. i dr. Algoritmy: postroenie i analiz. — M.: «Vil'yams», 2013.
Поступила: 10.09.2016
Об авторах:
Рублев Вадим Сергеевич, профессор кафедры теоретической информатики Ярославского государственного университета им. П.Г. Демидова, профессор, кандидат физико-математических наук, roublev@mail.ru;
Юсуфов Мурад Теймурович, аспирант кафедры теоретической информатики Ярославского государственного университета им. П.Г. Демидова, flood4life@gmail.com.