У кого-нибудь есть пермутатор?...

A
На сайте с 17.04.2003
Offline
2
3022

Ни у кого случайно не завалялся кусок кода, на любом языке, воплощающий алгоритм пермутации? Для тех, кто не в курсе, что такое пермутатор, объясняю: есть ключевой набор слов для поисковика. необходимо сделать список всех вариаций(пермутаций) слов. Например, есть ключевое словосочетание: Слава КПСС Ура. Список пермутаций(размер: 3!) будет выглядеть так:

Слава КПСС Ура

Слава Ура КПСС

Ура Слава КПСС

Ура КПСС Слава

КПСС Слава Ура

КПСС Ура Слава

Когда ключевое словосочетание нуждающееся в пермутации одно, то можно сделать и ручками, но когда таких две сотни, то нужна программа.

Если ни у кого нет проги, может алгоритм кто подскажет?

dimok
На сайте с 08.11.2002
Offline
291
#1

если словосочетания небольшие (3-5 слов), то можно в лоб: вложенные циклы. число комбинаций - факториал числа слов.

если больше, то уже сложнее. для N слов придется поднапрячься, чтобы написать.

CLICKBAZA: есть траф - будут и деньги (https://clickbaza.com/)
T
На сайте с 15.04.2003
Offline
36
#2

Алгоритм очень известен и описывается во многих книгах по програмированию

Он положен скажем в основу решения задачи комивояжеров

Названия бывают разные

Кажется здесь четкой терминологии не выработано

Я слышал название Бэктрекинг.

Но были еще какие то.

9
На сайте с 11.07.2003
Offline
15
#3

Если тебе нужно получить не все возможные, а лишь некоторые, но быстро, то алгоритм таков:

1. разбиваем словосочетание на отдельные слова, помещая каждое слово в массив.

2. ротируем массив (сдвигаем циклически все его элементы влево и право, т.е. элемент 0 в элемент 1, элемент 1 в 2 .... элемент END в елемент 0).

3. Выбираем слова из массива и формируем словосочетание.

Достоинства:

Работает быстро.

Реализуется просто.

Дальнейшее ускорение работы:

Ротация не элементов массива, а указателей на элементы.

[Удален]
#4

если слов немного (N<10) и машинного времени не жаль (а чего его жалеть:)), то представь начальное словосочетание наименьшим числом в N-ичной системе, у которого все цифры различны (0 1 ... N-1), и, добавляя по единичке вплоть до (N-1 N-2... 0) включительно, отбрасывай те числа, где не все цифры различны

А если машинного времени жаль, но не жаль дискового пространства (а чего его жалеть :)) и N невелико, можно только один раз составить и запомнить список всех перестановок по каждому реально необходимому N, а в дальнейшем перебирать слова уже согласно этому списку

AA
На сайте с 16.04.2001
Offline
70
#5
Как писал ast
если слов немного (N<10) и машинного времени не жаль

Надо определить в постановке задачи, для каких N ее надо решать.

Допустимый диапазон не слишком велик.

Для N<10 действительно годится предложенный алгоритм (потери в числе операций по сравнению с рекурсивным алгоритмом ~e^N раз согласно формуле Стирлинга). Для N в интервале 10-16 использовать надо рекурсию.

Правда, решение в ту или другую сторону на границе N=9-11 зависит от эффективности реализации алгоритмов.

Для N>16, боюсь, уже никакой алгоритм не поможет. Число операций в случае, скажем, N=20 >10^18, что, конечно, выше возможностей не слишком большого кластера из обычных компьютеров.

С уважением, Антонов Александр.
T
На сайте с 15.04.2003
Offline
36
#6

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий