2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Получить все перестановки исключая "симметричные"
Сообщение02.08.2011, 14:30 


02/08/11
8
Извиняюсь за возможно ненаучную терминологию, но постараюсь объяснить свою проблему понятно.
Есть множество неповторяющихся объектов. Необходимо получить все перестановки элементов, но исключая "симметричные" (наверное они как-то правильно называются?). Т.е. 1-3-2-4 и 4-2-3-1 считаем одинаковыми. Грубо говоря это маршруты обхода, и безразлично - обходить слева направо или справа налево. Остается половина.
Алгоритмов генерации перестановок нашел достаточно (и с рекурсией, и без).
Существует ли алгоритм, позволяющий сгенерировать сразу только "несимметричные" перестановки?
Получить все, а потом отсеивать лишние - не очень интересно, т.к. конечная цель ускорение перебора.

 Профиль  
                  
 
 Re: Получить все перестановки исключая "симметричные"
Сообщение02.08.2011, 14:37 
Заслуженный участник


08/04/08
8556
Как-то неполно объяснили. Вы считаете симметричными некоторые цепочки - откуда берутся цепочки из множества объектов. Т.е. вот у Вас есть 6 объектов и Вы объединяете $1,2,3,4$ в цепочку $1-2-3-4$ и $5,6$ в цепочку $5-6$ (и считаете их симметричными). По какому принципу Вы их объединяете в цепочки?

 Профиль  
                  
 
 Re: Получить все перестановки исключая "симметричные"
Сообщение02.08.2011, 14:47 


02/08/11
8
У меня перестановка в классическом понимании. Я привел пример одной из пар для множества из 4-х объектов.
Для трех объектов "одинаковые" пары это:
123 321
132 231
213 312
Мне хочется алгоритм который бы выдавал мне не все 6 перестановок, а только три. Какая из пары попадет - не важно.

 Профиль  
                  
 
 Re: Получить все перестановки исключая "симметричные"
Сообщение02.08.2011, 14:49 
Заслуженный участник


08/04/08
8556
Ааа, понял. Щас попробую подумать :-)

 Профиль  
                  
 
 Re: Получить все перестановки исключая "симметричные"
Сообщение02.08.2011, 15:10 
Заслуженный участник


25/02/11
1786
Вроде достаточно взять первую половину перестановок, записанных в лексикографическом порядке.

 Профиль  
                  
 
 Re: Получить все перестановки исключая "симметричные"
Сообщение02.08.2011, 15:27 


14/01/11
2921
Цитата:
Вроде достаточно взять первую половину перестановок, записанных в лексикографическом порядке.

Боюсь, это не выход. Так, перестановки 1,3,4,2 и 2,4,3,1 окажутся в одной половине.

 Профиль  
                  
 
 Re: Получить все перестановки исключая "симметричные"
Сообщение02.08.2011, 15:29 


02/08/11
8
Vince Diesel в сообщении #472820 писал(а):
Вроде достаточно взять первую половину перестановок, записанных в лексикографическом порядке.

Это, к сожалению, неверно. Лексикографический порядок не подходит (проверяется опытным путем).
Наверное, в этом и будет решение - найти правильный порядок генерации. У меня что-то пока не выходит.

 Профиль  
                  
 
 Re: Получить все перестановки исключая "симметричные"
Сообщение02.08.2011, 15:54 
Заслуженный участник


25/02/11
1786
Хм, тогда рекурсивно. Сначала есть перестановка $\{1,2\}$. Теперь допустим, уже есть набор перестановок для $n$ элементов. Чтобы получить перестановки для случая $n+1$, следующий элемент вставляется на 1-е, 2-е, ... , $n+1$-е места. Если бы при таком построении на $n+1$ шаге получились бы две одинаковых перестановки, то при удалении $(n+1)$-го элемента, имелись бы одинаковые перестановки из $n$ элементов.

 Профиль  
                  
 
 Re: Получить все перестановки исключая "симметричные"
Сообщение02.08.2011, 17:27 


29/01/07
176
default city
Ну я бы предложил это делать следующим образом. Генерируем перестановки в виде дерева. Дерево, поясню на примере. Пусть ищем перестановки из чисел 1,2,3. В верхней вершине стоит 0, далее отходит 3 ребра, соединяющие с вершинами. на которых написано соответственно 1, 2, 3. От единицы отходит 2 ребра, соединяющие с вершинами, на которых написано 2 и 3. От двойки - еще одно ребро у тройке, от тройки к двойке. Ребра, соответственно направленые. Получаем дерево, глубиной 4. Всевозможные пути по ребрам - это все перестановки. Далее, из дерева выкидываем симметричные пути. Т.е. на 123, выкинем нижний лист от тройки, ведущий к единице и т.д.. По сути дела, это "умный" перебор. Вообще задачу хорошо бы конкретизировать: что именно Вы хотите от алгоритма. Эффективность по количеству действий, памяти?

 Профиль  
                  
 
 Re: Получить все перестановки исключая "симметричные"
Сообщение02.08.2011, 19:47 


02/08/11
8
Azog в сообщении #472880 писал(а):
Всевозможные пути по ребрам - это все перестановки. Далее, из дерева выкидываем симметричные пути. Т.е. на 123, выкинем нижний лист от тройки, ведущий к единице и т.д.. По сути дела, это "умный" перебор. Вообще задачу хорошо бы конкретизировать: что именно Вы хотите от алгоритма. Эффективность по количеству действий, памяти?

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

 Профиль  
                  
 
 Re: Получить все перестановки исключая "симметричные"
Сообщение02.08.2011, 20:08 
Заслуженный участник


25/02/11
1786
Кстати, конструкция в моем предыдущем посте наводит на мысль, что это в точности все перестановки, в которых 1 левее 2. Так что можно взять все перестановки из $\{2,\ldots,n\}$, а затем для каждой добавлять единицы по очереди на все места левее двойки.

 Профиль  
                  
 
 Re: Получить все перестановки исключая "симметричные"
Сообщение02.08.2011, 22:03 
Заблокирован


19/09/08

754
Проще всего, по-моему, использовать алгоритм вертикальной прогонки и затем взять половину (первую или вторую) всех перестановок.
Примеры могу привести.

 Профиль  
                  
 
 Re: Получить все перестановки исключая "симметричные"
Сообщение02.08.2011, 22:03 
Заблокирован


19/09/08

754
..

 Профиль  
                  
 
 Re: Получить все перестановки исключая "симметричные"
Сообщение03.08.2011, 08:28 


02/08/11
8
Vince Diesel в сообщении #472937 писал(а):
Кстати, конструкция в моем предыдущем посте наводит на мысль, что это в точности все перестановки, в которых 1 левее 2. Так что можно взять все перестановки из $\{2,\ldots,n\}$, а затем для каждой добавлять единицы по очереди на все места левее двойки.

1 левее 2 ключевой момент! Кажется я нужный порядок нашел! Привожу пример для 4-х элементов:
1 3 4 2
1 4 3 2
1 2 4 3
1 4 2 3
1 2 3 4
1 3 2 4

2 1 4 3
2 4 1 3
2 1 3 4
2 3 1 4

3 1 2 4
3 2 1 4
Главную роль играют первый и последний элемент в перестановке! Номер последнего должен быть больше номера первого. Поэтому с 1 перестановок больше всего, с 2 меньше, с 3 еще меньше, а с 4 нет вообще.
А между первым и последним элементом все возможные перестановки из оставшихся элементов множества. (В моем примере их по две)
Вроде так? Ошибок не видать? Теперь это запрограммировать красивенько осталось!

 Профиль  
                  
 
 Re: Получить все перестановки исключая "симметричные"
Сообщение03.08.2011, 09:35 
Заслуженный участник


25/02/11
1786
А какое по порядку величины предполагается $n$? И в чем цель, проверять маршруты или выдавать список перестановок?

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

Модераторы: Модераторы Математики, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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