11.07.2015 Views

Выпуск 1 - Российский государственный профессионально ...

Выпуск 1 - Российский государственный профессионально ...

Выпуск 1 - Российский государственный профессионально ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

4. Что означают записи O(1), O(n), O(n 2 ) и O(2 n )?5. В каких случаях алгоритм, имеющий асимптотическуюсложность O(n 2 ), может работать быстрее,чем алгоритм с асимптотической сложностьюO(n)?Задачи1. Оцените количество операций для алгоритмов:а) поиска всех делителей числа;б) нахождения минимального и максимальногоэлементов массива;в) определения количества положительных элементовмассива;г) проверки числа на простоту.В каждом случае опишите набор используемыхэлементарных операций. Определите асимптотическуюсложность этих алгоритмов.2. *Предложите алгоритм, позволяющий найти ивывести на экран те символы, которые встречаютсяв строке более одного раза. Оцените его асимптотическуюсложность.3. *Алфавит языка племени “тумба-юмба” содержитk символов. Предложите алгоритм построениявсех возможных слов этого языка длиной n символови оцените его асимптотическую сложность.Доказательство правильностипрограммКак доказать правильность программы?Как правило, программист разрабатывает программуна заказ, и от него требуется не только написатькод, но и убедиться, что он работает правильно,то есть в соответствии с требованиями заказчика.Очевидно, что если программа выдает неверныйрезультат хотя бы для одного варианта входныхданных, можно сразу сказать, что она некорректна,то есть содержит ошибки.Сложнее доказать правильность программы— убедиться, что она выдает верные результатыпри любых допустимых входных данных.Программисты-практики для решенияэтой задачи используют тестирование:проверяют работу программы с помощьюнабора тестовых данных, для которыхизвестен правильный результат.Если полученный результат не совпадаетс заданным, выполняется отладкапрограммы, то есть поиск и исправлениеошибок.Однако, как писал замечательныйнидерландский ученый, один из создателейсовременного программированияЭ.Дейкстра, “отладка может показатьлишь наличие ошибок и никогда их отсутствие”.В результате можно гарантироватьверную работу программы только приЭ.В. Дейкстра(р. 1930) (http://bwnw.cwi-incubator.nl)Рис. 17тех данных, которые использовались в контрольныхтестах. Кроме того, неясно, как определить, что всеошибки выявлены и нужно завершить отладку.Пример 1. Рассмотрим следующую программудля выбора максимального из трех значений, записанныхв переменных a, b и c:если a > b то M:= a иначе M:= b всеесли b > c то M:= b иначе M:= c всеПроверяя ее на тестах(a,b,c) = (1,2,3), (1,3,2), (2,1,3) и(2,3,1)мы во всех этих случаях получаем в переменной Mверный ответ 3. Однако это не означает, что программаправильная, так как существует контрпример(3,2,1): для этого набора входных данных впеременной M в результате оказывается число 2.Чтобы быть уверенным в том, что программа работаетправильно при любых допустимых исходныхданных, применяют методы доказательного программирования:для каждого блока программысоставляются требования к входным и выходнымданным, и строго доказывают, что программа всегдаработает верно.К сожалению, доказывать правильность программне так просто, и в таких доказательствахтоже возможны ошибки. Однако при этом автордолжен глубоко разобраться в алгоритме и его “подводныхкамнях”, и часто при этом обнаруживаютсяошибки, которые могли бы проявиться уже послевыпуска программы в свет.На практике редко доказывают правильностьвсей программы в целом. В то же время очень полезнодоказывать правильность отдельных блоков(циклов, процедур и функций) для уменьшенияколичества “необъяснимых” ошибок и сокращениявремени отладки.Покажем метод доказательства правильностипрограммы на простом примере.Пример 2. Доказать, что после выполнения следующейпрограммы значения переменных a и b меняютсяместами:b:= a + b | 1a:= b – a | 2b:= b – a | 3Предполагается, что сумма исход ныхчисел не приводит к переполнению разряднойсетки. Для удобства операторыпрограммы пронумерованы.Обозначим начальные значения переменныхa и b через a 0и b 0. После выполненияоператора 1 в переменной bбудет записано значение a 0+ b 0. Оператор2 записывает в переменную a значениеb – a = a 0+ b 0– a 0= b 0. В результатевыполнения оператора 3 получаемновое значение переменной b, равноеb – a = a 0+ b 0– b 0= a 0. Таким образом,в результате выполнения программыпеременные a и b будут равны b 0и a 0со-17январь 2012 / ИНФорматика

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!