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

Принципы анализа алгоритмов

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

$\lfloor{x}\rfloor$: наибольшее целое, меньшее или равное x

$\lceil{x}\rceil$: наименьшее целое, большее или равное х.

Например, $\lfloor{\pi}\rfloor$и $\lceil{e}\rceil$оба равны 3, а $\lceil{x}\rceil$ - это количество битов, необходимое для двоичного представления числа N. Другое важное применение этих функций возникает в том случае, когда необходимо поделить множество N объектов пополам. Этого нельзя сделать точно, если N является нечетным, поэтому для точности мы можем создать одно подмножество, содержащее $\lfloor{N/2}\rfloor$объектов, а второе - $\lceil{N/2}\rceil$объектов. Если N четно, тогда размеры обоих поднаборов равны ( $\lfloor{N/2}\rfloor$= $\lceil{N/2}\rceil$); если же N нечетно, то их размер отличается на единицу ($\lfloor{N/2}\rfloor + 1$ = $\lceil{N/2}\rceil$). В С++ можно напрямую подсчитать значения этих функций при выполнении операций над целыми числами (например, если $N\geq0$N, тогда  N/2 равно $\lfloor{\pi}\rfloor$ а N-(N/2) равно $\lceil{x}\rceil$), а при операциях над числами с плавающей точкой можно воспользоваться функциями floor и ceil из заголовочного файла math.h.

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

$H_{N}=1+\dfrac{1}{2}+\dfrac{1}{3}+...+\dfrac{1}{N}$

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

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

Рис. 2.2. Гармонические числа

Гармонические числа представляют собой приближенные значения площади под кривой 1/х. Постоянная y учитывает разницу между H_N и $\ln{N}=\int_{1}^{N}{dx/x}$

Формула

 $H_{N}\approx \ln{N}+\gamma +1/(12N)$ где $\gamma = 0,57721... $ (эта константа называется постоянной Эйлера), дает отличное приближение для H_N. В отличие от $\lceil{lgN}\rceil$и $\lfloor{lgN}\rfloor$ для вычисления H_N лучше воспользоваться библиотечной функцией log, а не подсчитывать его непосредственно из определения.

Последовательность чисел

   0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 ... определяемая формулой $F_{N}=F_{N-1}+F_{N-2}$ где $N\geq2$ а F_0 = 0 и F_1 = 1 известна как числа Фибоначчи и имеет множество интересных свойств. Например, отношение двух последовательных чисел приближенно равно золотому сечению (golden ratio) $\phi=(1+\sqrt{5}/2 \approx 1,61803...$ Более подробный анализ показывает, что F_N равно значению выражения $\phi^{N}/\sqrt{5}$ округленному до ближайшего целого числа.

При анализе алгоритмов часто встречается также функция факториал N!. Как и экспоненциальная функция, факториал возникает при лобовом решении задач и растет слишком быстро, чтобы такие решения представляли практический интерес. Он также возникает при анализе алгоритмов, поскольку представляет собой количество способов упорядочения N объектов.

Для аппроксимации N! используется формула Стирлинга:

 ${\lg{N}!}\approx{N\lg{N}}-N\lg{e}+\lg{\sqrt{2\pi N}}$.

Например, из формулы Стирлинга следует, что количество битов в представлении числа N! примерно равно NlgN.

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

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

Упражнения

$\triangleright$ 2.5. Для каких значений N справедливо 
          10NlgN> 2N^2
        ?

$\triangleright$ 2.6. Для каких значений N выражение N^{3/2} имеет значение в пределах от 
          N(lgN)^2/2
        до 
          2N(lgN)^2
        ?

  • 2.7. Для каких значений N справедливо 
          2NH_n  -  N < N lgN + 10N
        ?
  • 2.8. Для какого наименьшего значения N справедливо 
          log_10log_10 >8
        ?
  • 2.9. Докажите, что $\lfloor{\lg{N}}\rfloor$+ 1 - это количество битов, необходимое для представления числа N в двоичной форме.
  • 2.10. Добавьте в таблица 2.2 столбцы для 
          N(lgN)^2 и N^{3/2}
        .
  • 2.11. Добавьте в таблица 2.2 строки для 10^7 и 10^8 инструкций в секунду.
  • 2.12. Напишите на С++ функцию, которая подсчитывает H^N, используя функцию log из стандартной математической библиотеки.
  • 2.13. Напишите эффективную функцию на С++, подсчитывающую $\lceil{\lg{\lg{N}}}\rceil$ Не используйте библиотечную функцию.
  • 2.14. Сколько цифр в десятичном представлении числа 1 миллион факториал?
  • 2.15. Сколько битов в двоичном представлении числа lg(N!) ?
  • 2.16. Сколько битов в двоичном представлении H^N ?
  • 2.17. Приведите простое выражение для $\lfloor{\lg{F_{N}}}\rfloor$.
  • 2.18. Приведите наименьшие значения N, для которых $\lfloor{H_{N}}\rfloor$LHNJ = i, где ${1}\leq{i}\leq{10}$
  • 2.19. Приведите наибольшее значение N, для которого можно решить задачу, требующую выполнения f(N) инструкций, на машине с быстродействием 10^9 операций в секунду для следующих функций f(N): N^{3/2}, N^{5/4}, 
          2NH^N
        , NlgNlglgN и 
          N^2lgN
        .
Никита Андриянов
Никита Андриянов
Дмитрий Уколов
Дмитрий Уколов
Елена Фомина
Елена Фомина
Россия, Москва, 45