LINUX.ORG.RU
решено ФорумTalks

Задачка из комбинаторики.

 


1

1

Для любого n из N нужно найти кол-во возможных перестановок со знаком. Например g={1,-2} - одна из перестановок для n = 2. Всего их для n=2 восемь.

-1 -2
-1 2
1 -2
-2 -1
-2 1
2 -1
1 2
2 1

Путём долгих размышлений я пришёл к выводу, что кол-во перестановок определяется по формуле

(2^n)*n!
. Поправьте если я ошибся и если можно помогите с написанием псевдокода/кода для генерации всех расстановок. Есть ли лучший вариант, чем генерировать n! перестановок заменяя знак постепенно у чисел/групп чисел из n?

П.С. Почему тут не подходит для определения перестановок n элементов из 2n?

★★★

Последнее исправление: hope13 (всего исправлений: 2)
Ответ на: комментарий от iVS

К сожалению я определил это практически путём перебора и сначала думал что нужно делать по одной из формул (n над k). Прошу объяснить почему я неправильно думаю :) И помочь немного с кодом.

hope13 ★★★
() автор топика

Всего есть n! различных обычных перестановок и 2^n способов расставить знаки. Поскольку каждая пара из перестановки и способа-расставить-знаки дает уникальную перестановку-со-знаками, эти количества нужно перемножить. Вот и получаем (2^n)*n!

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 1)
Ответ на: комментарий от Manhunt

Спасибо, на самом деле мне это должно было быть очевидно. Осталось теперь придумать алгоритм эффективной генерации перестановок. Должно же быть что-то, чтобы избежать 2^n вызовов функции генерации перестановок.

p.s. как называется эта формула?

hope13 ★★★
() автор топика
Ответ на: комментарий от hope13

как называется эта формула?

Никак. Подобные формулы получают по мере надобности, собственных имен они недостойны.

Должно же быть что-то, чтобы избежать 2^n вызовов функции генерации перестановок.

Для каждой из n! перестановок перебираешь 2^n способов расставить знаки. В чем проблема?

Manhunt ★★★★★
()
Ответ на: комментарий от hope13

Есть алгоритм перебора всех двоичных чисел до n-го разряда за минимальное количество «изменений», возьми 0 за +, а 1 за - и получишь 2^n способов.

ErasimHolmogorin
()
Последнее исправление: ErasimHolmogorin (всего исправлений: 1)
Ответ на: комментарий от hope13

Пока не придумал как написать код для расстановки знаков 2^n способами.

Набор из n знаков можно отождествить с n-битным целым числом: если i-тый знак - «плюс», то i-тый бит равен нулю; если i-тый знак - «минус», то i-тый бит равен единице.

Так что задача сводится к тому, чтобы перечислить целые от 0 до 2^n-1.

Manhunt ★★★★★
()
Ответ на: комментарий от ErasimHolmogorin

Спасибо! Именно в этом была проблема, не догадался что так можно.

hope13 ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.