Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
algorithms.doc
Скачиваний:
29
Добавлен:
06.12.2018
Размер:
9.73 Mб
Скачать
    1. Ошибки вычислений

Для экономии времени мы не будем давать точного определения понятий `много больше’ (>>) и `много меньше’ (<<).

Определение 1. 1 = argmin{v>0|1+v != v}

Определение 2. 2 = argmax{v>0|1+v = = v}

Легко видеть, что 1 =[(0111 1111) (1 000 0000)(0000 0000)(0000 0001)]-1=2-23 и что 2 отличается от него на очень мало.

Определение 3. Назовем абсолютной ошибкой приближения числа x0 с помощью числа x такое , что

| x - x0| <

Определение 4. Назовем относительной ошибкой приближения числа x0 с помощью числа x такое , что

| x - x0| / | x0 | <

Часто более удобно пользоваться другим определением числа :

| x - x0| / | x | <

Это связано с тем, что, как правило, нам известно лишь приближение исследуемого числа ( x ), а не оно само ( x0 ). В ситуации, когда | x - x0| << | x0 | и | x - x0| << | x | эти два Определения отличаются несущественно. Кроме данных допущений, мы также будем предполагать, что все относительные ошибки много меньше 1.

Утверждение 2. При сложении/вычитании чисел их абсолютные ошибки складываются, т.е.

| (x+y) (x0+y0) |  x+y

| (x y) (x0 y0) |  x+y

где | x x0 | < x , | y y0 | < y .

Доказательство элементарно.

Утверждение 3. При умножении/делении чисел их относительные ошибки складываются (с точностью до пренебрежимо малых членов), т.е.

| (x*y x0*y0) / (x*y)|  x+y

| (x/y x0/y0) / (x/y)|  x+y

где | x - x0| / | x | < x , | y y0 | / | y | < y .

Доказательство.

1.

Итак, рассмотрим сумму относительных ошибок:

(x - x0) / x + (y y0 ) / y = (x* y - x0* y + y* x - x* y0) / (x* y) =

= (x* y - x0* y + y* x - x* y0 - x* y + x0* y0 ) / (x* y) + ( x* y + x0* y0 ) / (x* y)

= x * y + ( x* y - x0* y0 ) / (x* y)

получаем:

|( x* y - x0* y0 ) / (x* y)|  x + y

2.

Перепишем относительную ошибку частного:

(x/y x0/y0) / (x/y) = (x* y0 x0 y) / (x*y0)

Итак, рассмотрим сумму относительных ошибок (незначительно отличающихся от основного определения):

(x - x0) / x + (y0 y ) / y0 = (x* y0 - x0* y0 + y0* x - x* y) / (x* y0) =

= (x* y0 - x0* y0 + y0* x - x* y - x* y0 + x0 y) / (x* y0) + (x* y0 x0 y) / (x*y0)

= x * y + (x* y0 x0 y) / (x*y0)

получаем:

| (x/y x0/y0) / (x/y)|  x+y

Ч.Т.Д.

  1. Лекция 2

    1. Алгоритмы. Сведение алгоритмов.

    2. Нижние и верхние оценки.

Д.Кнут. Искусство программирования для ЭВМ. тт 1-3. Москва. Мир. 1996-1998

Т.Кормен, Ч.Лейзерсон, Р.Ривест. Алгоритмы. Построение и анализ. Москва. МЦНМО. 1999.

Препарата Ф., Шеймос М. Вычислительная геометрия. Москва. Мир. 1989

Мы не будем давать строгого определения понятия алгоритма, однако основные свойства понятия алгоритма, задаваемые при его определении, мы все же опишем.

Алгоритмом m называется формально описанная процедура, имеющая некоторый набор входных данных In(m) и выходных данных Out(m). Вводится некоторый параметр, оценивающий объем входных данных N=N(In(m)). Будем называть этот параметр размером входных данных. Заметим, что, на самом деле, алгоритм решает некоторую формально поставленную задачу z, имеющую те же самые входные и выходные данные.

При создании алгоритма закрепляется некоторый конечный набор допустимых операций, в терминах которых формулируется алгоритм. От алгоритма требуется его конечность, т.е. мы говорим, что задача решается с помощью некоторого алгоритма, только если для каждого набора входных данных соответствующий набор выходных данных получается с помощью аднного алгоритма за конечное количество допустимых операций.

Для оценки времени работы алгоритма с каждой допустимой операцией ассоциируется время ее выполнения. Временем выполнения реализации алгоритма T(m) для определенных начальных данных называется сумма времен выполнения всех операций алгоритма при выполнении данной реализации.

        1. Верхней оценкой времени выполнения алгоритма m называется такая функция (N), что для любого набора входных данных In(m) размером не более N время выполнения алгоритма не будет превосходить (N). Будем говорить, что задача z имеет верхнюю оценку времени решения (N), если существует алгоритм m с верхней оценкой времени выполнения (N).

Разумно задаться вопросом: а для любого ли алгоритма существует его верхняя оценка времени работы? Элементарно привести пример, для которого верхней оценки времени работы не существует (например, можно рассмотреть задачу выписывания всех десятичных знаков обычного целого числа). Однако, если количество различных вариантов входных данных объема N алгоритма для любого N конечно, то легко показать, что верхняя оценка времени работы алгоритма существует. Нас интересуют алгоритмы, которые можно реализовать на компьютере. Но у компьютера конечное количество ячеек памяти, поэтому и количество их комбинаций конечно. В таком случае на компьютере можно задать только конечное количество вариантов входных данных для любой задачи.

Последний факт очевиден, но, все же, требует доказательства. Доказательство строится от противного: допустим, количество различных вариантов наборов значений ячеек пямяти компьютера N, а задача имеет большее количество наборов исходных данных. В таком случае найдется хотя бы два варианта исходных данных задачи, соответствующих одному и тому же набору значений ячеек памяти компьютера, что противоречит тому, что мы можем задать на компьютере все варианты исходных данных задачи.

Итак, мы получили, что для всех алгоритмов, которые можно реализовать на компьютере существует верхняя оценка времени работы. На самом деле, этот факт не стоит ничего, т.к., с одной стороны, функция (N) может очень быстро расти, а с другой, конечность количества ячеек компьютера всегда вступает в противоречие с бесконечностью мира. Например, конечность количества ячеек делает бессмысленным рассмотрение функции (N) для любого натурального N.

        1. Нижней оценкой времени выполнения алгоритма m называется такая функция (N), что для любого N найдется такой набор входных данных алгоритма размером N, что время работы данного алгоритма на указанных данных будет не меньше (N).

        2. Нижней оценкой времени решения задачи z называется такая функция (N), что для любого алгоритма, решающего данную задачу, (N) будет нижней оценкой времени работы данного алгоритма.

Будем говорить, что задача z1 сводится к задаче z2 за время g(N), если

  • входные данные задачи z1, имеющие объем N, могут быть приведены к входным данным задачи z2, при этом входные данные задачи z2 тоже имеют объем N;

  • выходные данные задачи z2 могут быть приведены к выходным данным задачи z1,

и все это за суммарное время g(N) (т.е. суммарное время выполнения алгоритмов приведения = g(N)). По аналогии, можно говорить, что алгоритм m1 сводится к алгоритму m2 за время g(N) (определение аналогично).

Теорема 1. Если задача z1 сводится к задаче z2 за время g(N) и задача z2 имеет верхнюю оценку времени решения 2(N), то задача z1 имеет верхнюю оценку времени решения 1(N) = 2(N) + g(N).

Теорема 2. Если задача z1 сводится к задаче z2 за время g(N) и задача z1 имеет нижнюю оценку времени решения 1(N), то задача z2 имеет нижнюю оценку времени решения 2(N) = 1(N) - g(N).

Доказательство теорем тривиально.

Введем обозначения.

g(n)=O(f(n)) если N0>0 и С>0, такие что n>N0 : g(n) C f(n)

g(n)=o(f(n)) если С>0 N0>0, такое что n>N0 : g(n) C f(n)

g(n)=(f(n)) если N0>0 и С1, С2>0, такие что n>N0 :

С1 f(n) g(n) С2 f(n)

g(n)=(f(n)) если N0>0 и С>0, такие что n>N0 : g(n) C f(n)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]