Программирование >>  Составные структуры данных 

1 ... 11 12 13 [ 14 ] 15 16 17 ... 225


РИСУНОК 2.1 ПЕРЕВОД СЕКУНД

Огромная разница между такими числами, как 10 и 10 становится более очевидной, когда мы рассмотрим их как количество секунд и переведем в привычные единицы измерения. Мы можем позволить программе выполняться 2.8 часа, но вряд ли мы сможем созерцать программу, выполнение которой займет 3.1 года. Поскольку 2° примерно равно 10, этой таблицей можно воспользоваться и для перевода степеней 2. Например, 2 секунд это примерно 124 года.

Таблица 2.1 Значения часто встречающихся функций

секунды

1.7 минуты

2.8 часа

1.1 дня

1.6 недели

3.8 месяца

3.1 года

3.1 десятилетия

10°

3.1 столетия

никогда

В этой таблице показаны относительные величины некоторых функций, которые будут часто встречаться нам при анализе алгоритмов. Очевидно, доминирующей является квадратичная функция, особенно для больших значений Л/, а значения между меньшими функциями оказываются не такими, как можно было ожидать для малых N. Например, Л/ больше, чем N\qN для огромных значений Л/, однако для небольших N наблюдается обратная ситуация. Точное время выполнения алгоритма должно включать в себя линейную комбинацию этих функций. Мы можем легко отделить быстрые алгоритмы от медленных из-за огромной разницы между, например, 1дЛ/ и N или Л/ и N, но различие между двумя быстрыми алгоритмами может потребовать тщательного изучения.

NlgN

4414

1000

10000

1000

9966

99317

31623

1000000

10000

132877

1765633

1000000

100000000

100000

1660964

27588016

31622777

10000000000

1000

1000000

19931569

397267426

1000000000

1000000000000

Таблица 2.2 Время для решения гигантских задач

Для многих приложений нашим единственным шансом решить гигантскую задачу является использование эффективного алгоритма. В этой таблице показано минимальное количество времени, необходимое для решения задач размером 1 миллион и 1 миллиард с использованием линейных, Л/ log Л/ и квадратичных алгоритмов на компьютерах с быстродействием 1 миллион, 1 миллиард и 1 триллион инструкций в секунду. Быстрый алгоритм позволяет решить задачу на медленной машине, но быстрая машина не может помочь, когда используется медленный алгоритм.

Операций в секунду

Размер задачи 1 миллион

Размер задачи 1 миллиард

yvigyv

NlgN

секунд

секунд

недель

часов

часов

никогда

мгновенно

мгновенно

часов

секунд

секунд

десятилетий

мгновенно

мгновенно

секунд

мгновенно

мгновенно

недель

Распечатано программой РтеРмШ - Купить w



При анализе алгоритмов возникает еще несколько функций. Например, алгоритм с вводами, имеющий время выполнения можно рассматривать, как N алгоритм. Кроме того, некоторые алгоритмы, разбиваемые на две подзадачи, имеют время выполнения, пропорциональное N\oN. Из табл. 2.1 очевидно, что обе эти функции ближе к N\o%N, чем 7V.

Логарифмическая функция играет специальную роль в разработке и анализе алгоритмов, поэтому ее стоит рассмотреть подробнее. Поскольку мы часто имеем дело с аналитическими результатами, в которых опущен постоянный множитель, мы используем запись log TV , опуская основание. Изменение основания логарифма меняет значение логарифма лищь на постоянный множитель, однако, в определенном контексте возникают специальные значения основания логарифма. В математике настолько важным является натуральный логарифм (основание е = 2.71828...), что распространено следующее сокращение: logW = In Ж В вычислительной технике очень важен двоичный логарифм (основание равно 2), поэтому используется сокращение log2 Ig N.

Наименьщее целое число, большее IgTV, равно количеству бит, необходимых для представления N в двоичном формате; точно так же наименьшее целое, большее logioTV, - это количество цифр, необходимое для представления Мъ десятичном формате. Оператор С++

for (IgN = 0; N > 0; lgN++, N /= 2) ;

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

for (IgN = о, t = 1; t < N; lgN++, t += t) ;

В нем утверждается, что 2 < N < 2 , когда я - это наименьшее целое, большее IgW.

Иногда мы итерируем логарифм: мы делаем это для больших чисел. Например, ig Ig 2 = Ig 256 = 8. Как иллюстрирует данный пример, обычно мы можем считать выражение log log TV константой для практических целей, поскольку оно мало даже для очень больших N.

Кроме того, часто мы сталкиваемся с некоторыми специальными функциями и математической записью из классического анализа, которые полезны для краткого описания свойств программ. В табл. 2.3 собраны наиболее используемые из этих функций; в следующих параграфах мы кратко обсудим их, а также некоторые наиболее важные свойства.

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

х] : наибольшее целое, меньшее или равное х х \: наименьщее целое, большее или равное х.

Например, LnJ и [е] оба равны 3, а rig(A+l)l - это количество бит, необходимое для двоичного представления числа TV. Другое важное применение этих функций возникает в том случае, когда необходимо поделить набор из TV объектов надвое. Этого



нельзя сделать точно, если является нечетным, поэтому для точности мы можем создать один поднабор, содержащий lN/2J объектов, а второй, - I N/2 I объектов. Если N четно, тогда размеры обоих поднаборов равны (IN/2J = [N/2 ); если же N нечетно, тогда их размер отличается на единицу (LA72J + 1 = Глу21). В С++ можно напрямую подсчитать значения этих функций при выполнении операций над целыми числами (например, если N>0, тогда N/2 равно In/2J, а N - (N/2) равно ГЛ721), а при операциях над числами с плавающей точкой можно воспользоваться функциями floor и ceil из заголовочного файла math.h.

При анализе алгоритмов часто возникает дискрети-зованная версия функции наггурального логарифма, называемая гармоническими числами. УУ-тое гармоническое число определяется выражением


I I г

РИСУНОК 2.2 ГАРМОНИЧЕСКИЕ ЧИСЛА

Гармонические числа представляют собой приближенные значения элементов площади nodi кривой 1/х. Постоянная у показывает разницу между и n

,11 1

= ! + - + - + ... +

2 Ъ N

Натуральный логарифм In Л - это значение площади под кривой между 1 и N; гармоническое число - это площадь под ступенчатой функцией, которую можно определить, вычисляя значения функции 1/х для целых чисел от 1 до N. Зависимость показана на рис. 2.2. Формула

Я; = 1пЛ + у+ 1 /(12Л)

где у = 0.57721... (эта константа называется постоянной Эйлера), дает отличное приближение для Hn- В отличие от flgA и LlgAJ, для вычисления Hfj лучше воспользоваться библиотечной функцией log, а не подсчитывать его непосредственно из определения.

Таблица 2.3 Специальные функции и поаоянные

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

Функция

Название

Типовое значение

Приближение

функция округления снизу

L3.14J =3

функция округления сверху

3.141 = 4

двоичный логарифм

Ig 1024 = 10

1.44 In

числа Фибоначчи

F,o = 55

гармонические числа

Я,о 2.9

In TV + у

факториал

10! = 3628800

(N/e)

Ig (Л!)

lg(100!) = 520

NlgN - 1.44 N

e = 2.71828.

< = (l + V5)/2 =

1.61803... Ige =

1 / In 2 = 1.44269...

Y = 0.57721.

In 2 = 0.693147...



1 ... 11 12 13 [ 14 ] 15 16 17 ... 225

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика