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

§ 20. Наивная арифметика: умножение

139

временной битовой сложности при использовании двух параметров размера входа a, b. Итак:

При использовании самих положительных целых a,b в качестве параметров размера входа сложность наивного умножения a на b по числу битовых операций допускает оценку O(logalogb).

Выше наивное умножение (умножение «столбиком») понималось так, что если какая-то цифра числа b равна нулю, то, несмотря на это, построение соответствующих ni и si требует не менее mг би­товых операций. При таком взгляде сложность будет величиной 6(loga log b). Но можно считать, что в рассматриваемом случае бито­вые затраты на получение si не зависят от a и ограничены констан­той. Тогда оценка n(logalogb) места не имеет: если a = 2k\b = 2k, где kг,k2—положительные целые, то битовые затраты будут ограни­чены линейной функцией от kъ k2.

Пример 20.1. Покажем, что битовая временная сложность алго­ритма вычисления n\ с помощью пошаговых наивных умножений

2-3, (2-3)-4, ..., (2-3...(n-1))-n

при использовании n в качестве размера входа допускает верхнюю оценку O((n logn)2). В силу предложения 20.1 и неравенства (20.2) рассматриваемая сложность не превосходит cf{n), где c — некоторая положительная константа, а значение f(n) равно

log2 2 log2 3 + log2(2 3) log2 4 + ... + log2(2 3... (n - 1)) log2 n.

Имеем

f(n) s= log2(2 3... (n - l))(log2 2 + log2 3 + ... + log2 n) s= log2(n!).

Одним из следствий формулы Стирлинга является оценка log2(n!) = = O(n log n), откуда log2(n!) = O((n log n)2), иf(n) = O((n log n)2).

Пример 20.2. Мы упоминали о том, что для алгоритма, входом которого является несколько целых чисел, можно в некоторых случа­ях определять размер входа как суммарную битовую длину всех этих чисел. Предположим, что имеется несколько целых чисел aг, a2, •••, an, каждое из которых ^ 2, и с помощью пошаговых наивных умножений

aгa2, {aгa2)a^ ..., {aгa2...an-г)an (20.3)

вычисляется произведение A = aгa2...an. Пусть суммарная битовая длина чисел равна M, и число M рассматривается как размер вхо­да алгоритма (20.3). Покажем, что тогда битовая сложность этого

140

Глава 5. Битовая сложность

алгоритма допускает верхнюю оценку O{M2), — примечательно, что число n, т. е. общее количество сомножителей, в этой оценке не по­является.

В силу предложения 20.1 и неравенства (20.2) битовые затраты на вычисление aъa2, ■■■an не превосходит cF{aг,a2, ...,an), где c—неко­торая положительная константа, а значение F{aг, a2,..., an) равно

log2 aг log2 a2 + log2(aia2) log2 a3 + ... + log2(a1a2...an_1) log2 an

(использовано предположение, что aъa2,..., an ^ 2). Мы легко полу­чаем

F(aъ a2,...,an) s= log2(a1...an_1)aog2 a2 + ... + log2 an)

и

F{aъ a2,..., an) s= (log2 aг + log2 a2 + ... + log2 an)2.

Последнее неравенство позволяет перейти к рассмотрению M в ка­честве размера входа, так как, очевидно,

F(a1,a2,...,an)^(riog2(a1 + l)l + riog2(a2 + l)l+...+ riog2(an + l)l)2 =M 2 ,

что дает нам требуемое.

Доказанное утверждение справедливо и в том случае, когда сре­ди aг,a2, ...,an имеются единицы, если считать, что умножение на 1 требует одной битовой операции. Если среди aъa2,...,an имеются k единиц, то из M ^ k следует (M - k)2 + k s= M2.

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