2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 сложность вычисления биномиального коэффициента
Сообщение01.06.2008, 17:45 


21/04/08
208
Дано n, k - типа integer (занимает одну ячейку памяти). Надо вычислить $n \choose k$ в двоичном виде. Какой из известных алгоритмов, использующих не более n ячеек памяти, имеет наименьшую сложность?

 Профиль  
                  
 
 
Сообщение01.06.2008, 22:37 
Модератор
Аватара пользователя


11/01/06
5711
Правильно ли я понял, что каждое целое (включая и сам биномиальный коэффициент) в вашей модели занимает лишь одну ячейку памяти, а сложность оценивается по числу арифметических операций над целыми числами? Различается ли сложность сложения и умножения?

 Профиль  
                  
 
 
Сообщение02.06.2008, 14:46 


21/04/08
208
Сам коэффициент - достаточно большой и его двоичная запись занимает (грубо) не более n бит. Ячейкой памяти будем считать 32 или 64 битное слово. Целочисленные операции: сложение, умножение, деление, остаток от деления (все как в 32 или 64 битном процессоре). Можно учитывать чтение и запись в память, и приписать операциям время в тактах, но можно не входить в такие подробности, а сказать, что вычисление требует столько-то операций, или столько-то операций сложения, столько-то умножения. Интересен также тот же самый вопрос, когда n не помещается в ячейку памяти, а занимает m бит.

 Профиль  
                  
 
 
Сообщение03.06.2008, 14:37 


21/04/08
208
Также буду признателен если кто-либо приведет ссылки на алгоритмы вычисления биномиальных коэффициентов (различные модели).

 Профиль  
                  
 
 
Сообщение05.06.2008, 18:27 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
sng1 писал(а):
Какой из известных алгоритмов, использующих не более $n$ ячеек памяти, имеет наименьшую сложность?

Вы имеете в виду линейную память? или что у Вас ровно столько памяти, сколько нужно для хранения результата?

${n \choose n/2}$ занимает примерно $n$ бит, но это $n/32$ или $n/64$ ячеек. Соответственно, мы можем хранить несколько промежуточных чисел большой точности.

 Профиль  
                  
 
 
Сообщение05.06.2008, 19:07 


21/04/08
208
До получения результата свободно n ячеек, после получения результата не менее 31/32 (или 63/64) исходной памяти свободно.

 Профиль  
                  
 
 
Сообщение06.06.2008, 05:00 
Модератор
Аватара пользователя


11/01/06
5711
Скорее всего, сравнение надо производить между следующими двумя рекуррентными формулами (или их комбинациями):

Без потери общности можно считать, что $k\leq \frac{n}{2}$, при необходимости заменяя $k$ на $n-k$.

1) Динамическое программирование - вычисление по рекуррентной формуле: $${n\choose k} = {n-1\choose k-1} + {n-1\choose k}.$$
Лобовая реализация потребует $O(nk)$ сложений $O(n)$-битных чисел с расходом памяти $O(nk).$

2) Явная формула: $${n\choose k} = \frac{n(n-1)\dots (n-k+1)}{k(k-1)\dots 1}$$ соответствующая ей рекуррентная формула $${n\choose k}=\frac{n}{k}{n-1\choose k-1}$$ с начальным условием $${n-k\choose 0}=1.$$
Лобовая реализация потребует $O(k)$ умножений и столько же делений "длинных" ($O(n)$-битных) чисел на "короткие" (одноячеечные).

Возможно, еще как-то можно использовать свертку Вандермонда:
$${n\choose k} = \sum_{j=0}^k {\lfloor n/2\rfloor\choose j} {\lceil n/2\rceil\choose k-j}$$

 Профиль  
                  
 
 
Сообщение06.06.2008, 14:15 


21/04/08
208
И все-же я думаю кто-то в мире когда-либо уже исследовал вопрос: как быстро можно вычислить биномиальный коэффициет, при заданных различных ограничениях на память. Вот только где бы про это почитать (ссылки в интернете или на литературу).

 Профиль  
                  
 
 
Сообщение06.06.2008, 18:46 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Можно начать с факториалов (google -> fast computation of factorials).

Забавно, но заявленная Вами память слегка превышает $n \log_2 n$. Так что, по сути, Вас устраивают алгорифмы такой сложности по памяти.

 Профиль  
                  
 
 
Сообщение07.06.2008, 13:36 


21/04/08
208
Все равно не понял, известен ли хоть один алгоритм вычисления биномиального коэффициента, про который бы было сказано, что он быстрый (по некоторому критерию, например по числу сложений, или умножений в ЦПУ) и использующий память (в битах) не более $n \lceil \log_2(n+1) \rceil$ ?

 Профиль  
                  
 
 
Сообщение20.06.2008, 21:28 


21/04/08
208
maxal писал(а):
2) Явная формула: $${n\choose k} = \frac{n(n-1)\dots (n-k+1)}{k(k-1)\dots 1}$$ соответствующая ей рекурентная формула $${n\choose k}=\frac{n}{k}{n-1\choose k-1}$$ с начальным условием $${n-k\choose 0}=1.$$
Лобовая реализация потребует $O(k)$ умножений и столько же делений "длинных" ($O(n)$-битных) чисел на "короткие" (одноячеечные).


Краем уха слышал, что можно умножать длинные числа за O(n). Если это так и если делить можно за O(n), тогда сложность O($n^2$). А сколько надо памяти?

 Профиль  
                  
 
 
Сообщение20.06.2008, 21:46 
Модератор
Аватара пользователя


11/01/06
5711
Ну да, умножать длинные $n$-битные числа на короткие числа можно за $O(n)$, и делить за такое же время. Расход памяти здесь будет $O(n)$ - на каждом шаге нужно лишь помнить предыдущий вычисленные результат.

 Профиль  
                  
 
 
Сообщение23.06.2008, 11:50 


21/04/08
208
Правильно ли я понимаю, что для модели когда n не влезает в ячейку памяти - оценка сложности та же, а память $O(n \log n)$?

 Профиль  
                  
 
 Re:
Сообщение26.02.2010, 16:27 
Заморожен
Аватара пользователя


18/12/07
8774
Новосибирск
maxal в сообщении #124810 писал(а):
Динамическое программирование - вычисление по рекуррентной формуле: $${n\choose k} = {n-1\choose k-1} + {n-1\choose k}.$$
Лобовая реализация потребует $O(nk)$ сложений $O(n)$-битных чисел с расходом памяти $O(nk).$

По моему, здесь расход памяти $O(n)$, а не $O(nk)$. Ведь в треугольнике Паскаля для вычисления $(i+1)$-ой строки достаточно знать лишь $i$-ую строку, остальные можно забыть.

-- Пт фев 26, 2010 19:29:50 --

Или $O(n^2)$? Надо помнить, в худщем случае $2n$ штук $O(n)$-битных чисел.

-- Пт фев 26, 2010 19:33:49 --

Так, $O(nk)$ ведь "меньше", чем $O(n^2)$ (точнее, одного порядка). Откуда оценка $O(nk)$, что-то я запутался совсем? :oops:

 Профиль  
                  
 
 Re: сложность вычисления биномиального коэффициента
Сообщение26.02.2010, 17:12 
Модератор
Аватара пользователя


11/01/06
5711
maxal в сообщении #292625 писал(а):
По моему, здесь расход памяти $O(n)$, а не $O(nk)$. Ведь в треугольнике Паскаля для вычисления $(i+1)$-ой строки достаточно знать лишь $i$-ую строку, остальные можно забыть.

-- Пт фев 26, 2010 19:29:50 --

Или $O(n^2)$? Надо помнить, в худщем случае $2n$ штук $O(n)$-битных чисел.

-- Пт фев 26, 2010 19:33:49 --

Так, $O(nk)$ ведь "меньше", чем $O(n^2)$ (точнее, одного порядка). Откуда оценка $O(nk)$, что-то я запутался совсем? :oops:

Надо помнить лишь $k+1$ штук $O(n)$-битных чисел (нижний индекс меняется от 0 до $k$, большие нам не нужны). Вот и получается $O(nk)$ памяти.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: mihaild


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group