2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Алгоритм генерации множеств с повторениями
Сообщение01.04.2010, 16:52 


11/03/10
8
Добрый день.
Скажите, пожалуйста, где можно посмотреть/прочитать про такой алгоритм?
Читал Липского "Комбинаторика для программистов", нашел только перестановки в наборе и генерацию бинарного множества с повторениями.
Не понимаю, как последний "рецепт" адаптировать под свою задачу. К сожалению, у меня очень слабый математический бэкграунд.

Есть набор элементов: 1,2,3. Надо сгенерировать все возможные последовательности длиной 4, используя заданный набор эл-тов.
1111
1211
1121
1112
2111
2211
...
3333

Кстати, а возможно ли такие последовательности генерировать в несколько потоков?
По идее, можно.

Где смотреть, куда копать? Есть ли книжка, где рассматриваются подобные задачи? Липский для меня пока что неподъемен, слишком сложно и слишком мало знаю, комбинаторики в универе вообще не было.


Спасибо!

 Профиль  
                  
 
 Re: Алгоритм генерации множеств с повторениями
Сообщение01.04.2010, 17:05 
Модератор
Аватара пользователя


11/01/06
5660
serega в сообщении #305309 писал(а):
Где смотреть, куда копать? Есть ли книжка, где рассматриваются подобные задачи?

А. Шень. Программирование: теоремы и задачи. 2-е изд., М.: МЦНМО, 2004, 296 с.
ftp://ftp.mccme.ru/users/shen/progbook2/progbookpdf.zip

 Профиль  
                  
 
 Re: Алгоритм генерации множеств с повторениями
Сообщение01.04.2010, 17:59 


11/03/10
8
Мне такая книга две недели назад с Амазона приехала, правда, на английском языке.
Открываю русский вариант и ощущаю дежавю. Я только первую главу успел прочитать.
Спасибо.

 Профиль  
                  
 
 Re: Алгоритм генерации множеств с повторениями
Сообщение02.04.2010, 00:37 
Заслуженный участник


26/07/09
1559
Алматы
2serega
Цитата:
Есть набор элементов: 1,2,3. Надо сгенерировать все возможные последовательности длиной 4, используя заданный набор эл-тов.


Можно обойтись и без знания комбинаторики. Достаточно заметить, что искомые последовательности суть числа над данным алфавитом (в вашем примере над "цифрами" 1, 2, 3).

То есть, имея некоторую последовательность-"число" можно сгенерировать следующую за ней просто прибавив единицу к исходной. Понятно, что прибавление единицы необходимо производить именно в вашем алфавите, а не в десятичных цифрах. Для этого годится обычное сложение в столбик из начальной школы. Другими словами, прибавляем единицу к самому младшему разряду, если произошло переполение, то производим перенос в следующий по старшенству разряд, etc. В качестве начальной последовательности необходимо взять последовательность нужной длины из самой маленькой цифры вашего алфавита (1111), и, затем, прибавлять в цикле к ней единицу пока не получите переполнение в самом старшем разряде.

Можно понимать этот алгоритм и так. Если обозначить ваш алфавит как $\Sigma$, то искомые последовательности фиксированной длины $n$ будут, по-сути, просто элементами декартовой степени $\Sigma^n$. И, как вы понимаете, при маленьком статически заданном $n$ можно даже просто обойтись набором вложенных циклов, e.g.:
Используется синтаксис C
    for(i=1; i<=3; i++)
        for(j=1; j<=3; j++)
            ...
                printf("%d%d...", i, j, ...);
 


N.B., "цифрами" могут быть любые различимые объекты.

Цитата:
Кстати, а возможно ли такие последовательности генерировать в несколько потоков?

Да.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

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



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

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


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

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