Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перестановки 
:(
    Опции темы
Sheff
Дата 7.11.2002, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: нет
Всего: 3



Люди добрые, нужно вывести юзеру все варианты перестановок элементов массива. Например если массив такой:
0,1,2
Прога выводит:
0,1,2
0,2,1
1,0,2
1,2,0
2,1,0
2,0,1
Таких выводов будет (к-во эл. в массиве)!(факториал)
Знаю, чайнический вопрос, но что-то не выходит ничего.
У кого какие идеи, мне кажется тут рекурсией надо работать, но вот как ...


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
neutrino
Дата 7.11.2002, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Тема обсуждалась: http://www.forum.vingrad.ru/cgi-bin....3;t=709

П.С. Если у тебя будет массив н-ой длины. Его надо взять в порядке убывания. Потом воспользоваться "пузырьковой" сортировкой (в порядке возрaстания) и на каждом шагу сортировки распечатывать массив.




--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Sheff
Дата 13.11.2002, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: нет
Всего: 3



Цитата(neutrino @ 07.11.2002, 10:25)
Тема обсуждалась: http://www.forum.vingrad.ru/cgi-bin....3;t=709

П.С. Если у тебя будет массив н-ой длины. Его надо взять в порядке убывания. Потом воспользоваться "пузырьковой" сортировкой (в порядке возрaстания) и на каждом шагу сортировки распечатывать массив.

Хм, попробовал, от не выдаёт всё перестановки, тока часть :(


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
neutrino
Дата 14.11.2002, 03:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Да, и правда не выходит. Я ошибался. Можно воспользоваться таким алгоритмом:
Я думаю ты знаешь что такое ротация. Но, конечно если ее реализовать такую, какая она есть для массива, это будет не очень эффективно. Так создай в памяти два одинаковых массива, чтобы они физически были расположены один за другим (12341234). Если ты будешь давать адрес на m больший чем адрес начала (первого элемента) массива, и будешь читать то же количество элементов, то получишь ротацию на m элементов. Далее ты делаешь ротацию n-1 (n-длина массива) раз всего массива, и на каждой ротации вызываешь рекурсивно еще раз эту же процедуру ротации, только со второго (третьего, четвертого и т.д. в следуюших шагах рекурсии) элемента и на один элемент меньше чем на предыдушем шаге рекурсии. Это должно работать. По крайней мере я проверил для массива из 3-х и 4-х элементов (на бумаге). Дома попробую написать прогу (буду писать на С, если хочешь на паскале, то дай знать на мыло, а лучше кинь SMS:+97255426544).
P.F. Это можно и итеративно сделать.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Sheff
Дата 14.11.2002, 04:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: нет
Всего: 3



К сожалению я не знаю, что такое ротация, но я вот знаю, что перестановки можно реализовать рекурсией, но вот как именно ?


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
neutrino
Дата 14.11.2002, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Ротация это вот что:
А={1,2,3,4}
ротация на 2 элемента влево:
А={3,4,1,2}
(Аналог в АСМ работает с битами в числе ROR и ROL)
Я предлагаю вместо того, чтобы переприсваивать элементы, сделать ротацию так:
ты используешь на n-1 больше элементов и строишь неполную копию массива идущую сразу после массива. Короче говоря:
А={1,2,3,4,1,2,3} //len(A)=n+n-1
Если тебе надо сделать ротацию на м элементов, ты читаешь н элементов с указателя (А+m):
m=2;
А+=m;
А[0]=3;
А[1]=4;
А[2]=1;
А[3]=2;
Вот тебе и ротация!!!


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
neutrino
Дата 14.11.2002, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Мой метод решения основывается на вышепредложенном алгоритме реализации ротации. Он не претендует на звание самого эффективного по временной сложности и количеству необходимой памяти алгоритма. Наверняка можно придумать что-нибудь побыстрее/меньше. Вооbще задачу надо представить как дерево:


        |А[1]=2|А[2]=3
|А[0]=1|А[1]=3|А[2]=2
|
|         |А[1]=2|А[2]=3
|А[0]=2|А[1]=3|А[2]=1
|
|         |А[1]=1|А[2]=2
|А[0]=3|А[1]=2|А[2]=1

Поэтому, как раз, и 3! вариантов (если ты перемножешь 3*2*1 - количество веток).


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
neutrino
Дата 14.11.2002, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Это описание работы моего алгоритма (на примере массива {1,2,3,4}):
 на смом верхнем шаге рекурсии имеем: 1,2,3,4
 "копируем" n-1 элементов: 1,2,3,4,1,2,3
 пишем первый символ (1)
 передаем массив 2,3,4 на уровень ниже
   на втором уровне рекурсии имеем: 2,3,4
   "копируем" элементы: 2,3,4,2,3
   выводим первый символ (2)
   передаем массив 3,4 на уровень ниже
     на третьем уровне рекурсии имеем: 3,4
     "копируем": 3,4,3
     выводим первый символ (3)
     передаем массив 4 на уровень ниже
       на четвертом уровне имеем: 4
       выводим (4) и #13, #10
       переходим на уровень выше, т.к. цифр нет
     на третьем уровне делаем ротацию: 4,3
     выводим первый символ (4) (вот тут надо выводить еще все цифры до этого, их надо запомнить в массив)
     передаем массив 3 на уровень ниже
       на четвертом уровне имеем: 3
       выводим (3) и #13, #10
       переходим на уровень выше, т.к. цифр нет
     на третьем уровне можно было сделать только одну ротацию, переходим на уровень выше
   на втором уровне делаем ротацию: 3,4,2
   выводим первый элемент (3)
   передаем массив 3,4,2 на уровень ниже
............
............
............
и т.д.
Думаю алгоритм понятен.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
podval
Дата 14.11.2002, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 18
Всего: 62



Хватит мучиться!
http://algolist.manual.ru/maths/combinat/permutations.php
Больше добавить нечего.
PM WWW ICQ   Вверх
neutrino
Дата 15.11.2002, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



2Podval: Во-первых, почему мучиться? Ведь если не решать самому такие задачи, ни к чему не придешь. Во-вторых:
Цитата

Мы должны найти наибольшее i, при котором это так, т.е. такое i, что X[i]<X[i+1]>...>X[N] (если такого i нет, то перестановка последняя). После этого X[i] нужно увеличить минимально возможным способом, т.е. найти среди X[i+1],...,X[N] наименьшее число, большее его. Поменяв X[i] с ним, остается расположить числа с номерами i+1,...,N так, чтобы перестановка была наименьшей, то есть в возрастающем порядке. Это облегчается тем, что они уже расположены в убывающем порядке:

Надо было развивать идею об упорядочивании, все таки... Хотя и мои алгоритм работает. И еще можно составить дерево. Только, по-моему сложновастенько получится. ;)


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.