Перестановки.

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Перестановки.

Сообщение Oxygen » 09.05.2004 (Вс) 9:47

Задача такая, нужна реализация алгоритма, выдающего все перестановки N строк без повторения. У меня есть алгоритм (правда без реализации), выдающий без повторения все перестановки N чисел. (реализовать его впринципе можно, но он через циклы) А вот что сделать со строками? Как вариант можно конечно присвоить каждой строке какое-нибудь сопутствующее числовое значение, далее найти все перестановки этих чисел, а потом уже соотносить числа со строками. Но может есть какой-нибудь другой способ? И если у кого-нибудь есть рекурсивная реализация алгоритма, выдающая все перескановки N чисел, киньте пожалуйста. Язык особо значения не имеет (C++, Pascal, Basic). Заранее спасибо.

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 09.05.2004 (Вс) 20:30

Через циклы и обязательно рекурсию. У меня есть такая програмка, но она работает с символами. Как вариант передавать функции строку с разделителями (на строки). Потом она получив её запускает себя на реализацию дальше. Причём туда же надо вставить проверку на идентичность строк, и если есть одинаковые строки запускать функцию дальше только один раз(для каждой комбинации). У меня сейчас нет VB и не предвидиться. Но как пример скину тот проектик. Надеюсь он поможет, хотя он и без комментариев.

---
Добавлю общий принцип проги на всякий случай.

Есть функция берущая два параметра готовую строку (строка 1) и строку с разделителями (строка 2 "исходные данные")
Она смотрит какие возможны варианты различных строк из того что во второй строке. И запускает себя столько раз сколько вариантов со всеми возможными вариантами прибавленными к первой строке и второй строкой без варианта написанного в первой.
Короче если в первой строке "111", а во второй строке "абв.где.жзи" то она запустит себя с параметрами:
1="111абв" 2= "где.жзи"
1="111где" 2= "абв.жзи"
1="111жзи" 2= "абв.где"
Если во второй строке на момент запуска функции пусто то складываем то что в первой строке в файл с результатами.
Всё. Запускаем программу с первой строкой "" и второй строкой составленной из исходных строк с разделителями.

PS Обьяснять не умею, но пытаюсь... :?
PPS А почему в трёпе?
Вложения
Perebor.rar
WinRAR 3.0
(7.47 Кб) Скачиваний: 61

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 09.05.2004 (Вс) 20:56

Спасибо за пример. Сейчас посмотрю, попробую разобраться. А в трепе, потому что к бейсику это прямого отношения не имеет, мне честно говоря все - равно на каком языке реализация, хоть на C++.
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.05.2004 (Вт) 9:26

Тут и добавить нечего.
Делал практически также, т.е. была процедура, которая делала комбинации из двух аргументов. Если аргументов больше двух - то вызывала рекурсивно сама себя. Я даже как-то табличку делал, чтобы найти общую закономерность (надеялся оптимизировать), но ничего лучше сделать не получилось.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Народный треп

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

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

    TopList