Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение номера перестановки, задача, не знаю как назвать 
:(
    Опции темы
javas
Дата 30.5.2006, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 23.10.2003

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



Кто встречался, может знает как называется алгоритм?
Смысл такой:
Для определенного количества k находится перестановка всех чисел от 1 до k, нужно получить номер, зная строчку k (т.е. зная 1,2 возвращается 4,  1,2,3 - 7).
к может быть любым.
Вход: k, перестановка от 1 до k чисел
Выход: номер
Необходимо реализовать такую функцию.
номер/k
1    1
2    2
3    3
4    1,2
5    1,3
6    2,3
7    1,2,3
Вообщем, если кто знает как сделать please help. 
--------------------
 
PM   Вверх
nworm
Дата 30.5.2006, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: 4
Всего: 8



Число сочетаний из k элементов по n равно с(k,n)=k!/((k-n)!k!)
Пример k=3
3 перестановки из одного элемента
3 перестановки из двух элементов
1 перестановка из одного элемента

Поэтому можно так делать алгоритм:
1) просуммировать с(k,1)+c(k,2)+c(k,3)+...+c(k,<число элементов в введённой перестановке - 1>)
2) прибавить к полученной сумме номер введённой перестановки среди перестановок из <число элементов в введённой перестановке> элементов 
PM MAIL WWW   Вверх
javas
Дата 30.5.2006, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 23.10.2003

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



nworm, а номер введённой перестановки среди перестановок из <число элементов в введённой перестановке> искать как перебором лучше? 

Это сообщение отредактировал(а) javas - 31.5.2006, 00:14
--------------------
 
PM   Вверх
Aloha
Дата 31.5.2006, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
**


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

Репутация: 4
Всего: 165



javas
У меня получился такой алгоритм (сразу оговорюсь, он возвращает несколько иные результаты).
Возьмем, например, последовательность 1,2,3. Будем считать, что каждому числу в последовательности соответствует значимый бит, причем номер бита и определяется самим числом в последовательности.
Короче говоря, для последовательности 1,2,3 получим 0111 (биты нумеруем справа налево). А, например, для последовательности 2,3 получим 0110 (раз единица отсутствует в последовательности, значит первый бит = 0). Остается перейти к десятичной записи:

1       0001    1
 2      0010    2
12      0011    3
  3     0100    4
1 3     0101    5
 23     0110    6
123     0111    7
   4    1000    8
1  4    1001    9
 2 4    1010    10
12 4    1011    11
  34    1100    12
1 34    1101    13
 234    1110    14
1234    1111    15

 
PM   Вверх
javas
Дата 31.5.2006, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 23.10.2003

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



Aloha,  судя по твоему алгоритму, если на входе 
1,2 - на выходе 2^0+2^1 = 3;
1,2,3,4 ->    2^0+2^1+2^2+2^3 = 16
100,5 ->  2^99 + 2^4 =  633825300114114700748351602688 +16
По-моему, ты гений. 
--------------------
 
PM   Вверх
Akina
Дата 31.5.2006, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



осталось добавить что это производится в системе счисления с основанием k 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
javas
Дата 31.5.2006, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 23.10.2003

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



Алгоритм, предложенный Aloha ничего, но оказывается не то, куча ненужных перестановок, если мне нужно значени 100000, 10 ->сложновато, там хранятся перестановки типа 1,2,3,....99999 - этого не тот все таки порядок, nworm  правильно предложил, но как эффективно найти номер введённой перестановки среди перестановок из <число элементов в введённой перестановке>  

Это сообщение отредактировал(а) javas - 31.5.2006, 09:50
--------------------
 
PM   Вверх
javas
Дата 31.5.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 23.10.2003

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



Объясню наглядно.
Дано: числа от 1 до 100 000
нужно найти номер перестановки 2, 3000, 60000, 3 - порядок не важен, главное, чтобы это была уникальная комбинация

Нам известы комбинации для чисел от 1 до 3 - это радует.

С(100 000, 1) + С(100 000,2) + С(100 000,3) = 100 000 + (10^5)!/2!/(10^5-2)! +(10^5)!/3!/(10^5-3)!
Все остальные комбинации для 4 нужно искать, причем порядок неважен, главное, чтобы было понятно, что все комбинации переберутся. 
--------------------
 
PM   Вверх
Akina
Дата 31.5.2006, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



javas, я же тебе сказал что именно надо учитывать для получения ПРАВИЛЬНОГО номера. 
 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
javas
Дата 31.5.2006, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 23.10.2003

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



Akina, Объясни наглядо, я не понял. 
--------------------
 
PM   Вверх
Aloha
Дата 31.5.2006, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
**


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

Репутация: 4
Всего: 165



javas
Алгоритм, о котором идет речь, должен удовлетворять как минимум одному условию. А именно, соответствие между перестановкой и ее номером должно быть взаимнооднозначным. В противном случае теряется всякий смысл такого алгоритма. Еще неплохо было бы иметь возможность обратного преобразования для данного алгоритма. Число перестановок из k элементов (по рассматриваемой схеме) равно (2^k) - 1. Например, для чисел 1,2,3,4 число перестановок равно 15, а для чисел от 1 до 100 000 их будет (2^100 000) - 1.  И мне кажется, от этого никуда не деться (в противном случае соответствие уже не будет взаимнооднозначным). Может добавите какие-нибудь дополнительные подробности к задаче. Вдруг это поможет размышлениям.
 
PM   Вверх
nostromo
Дата 31.5.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Прошу прощения, не понял, что здесь называют перестановками.
Как понимать "перестановка 1,3 среди k элементов"?
Обычно, под перестановками понимают упорядоченные последовательности из _всех_ элементов множества, поэтому их k! (факториал). Я знаю два способа записи перестановок, но ни один из них не соответствует, тому, что здесь вижу. 
PM MAIL   Вверх
javas
Дата 31.5.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 23.10.2003

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



Канечно нужна взаимооднозначность, в твоем алгоритме она есть, но суть алгоритма в том, что количество комбинаций k(1,3,8,5) = 4 намного меньше N (числа 1,2,3.....10000) = 10 000. Т.е., k имет определенную разумную грань, не нужно перебирать весь объем множества.
Например k = 1..5 вообщем небольшое количество, т.е. будет перебираться количество чисел от 1 числа до 5 чисел. 
для чисел 1,2,3,4б5.
1
2
3
4
5
12
13
14
15
...
123
{над комбинациеей перебора либо как у тебя нужно подумать, главное, чтобы не было повторов}
124
125
...
Т.е. одназначность нужна, хотя бы для малых k, чтобы номер был не безбашенным.

Добавлено @ 11:19 
nostromo,  называй как хочешь, пусть будут комбинации без повторов.

Добавлено @ 11:32 
Aloha, зная комбинацию, нужно получить номер, но зная номер нет необходимости получать комбинацию.
1    1
2    2
3    3
4    1,2
5    1,3
6    2,3
7    1,2,3

зная 1,2 -> N=4, но не нужно, зная N=4 получить 1,2 
--------------------
 
PM   Вверх
nostromo
Дата 31.5.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Цитата

nostromo,  называй как хочешь, пусть будут комбинации без повторов.


А, это упорядоченные подмножества, или "размещения".
Тогда Akina ошибся, и их не 2^k (число всех подмножеств), а гораздо меньше (кажется, красивой замкнутой формулы нет). 
PM MAIL   Вверх
nworm
Дата 31.5.2006, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: 4
Всего: 8



Я немного ошибся
с(k,n)=k!/((k-n)!n!).
А по задаче вопрос:
"перестановки" 123 и 321 различаются?
Может ли быть так, что какая-то "перестановка" пропускается? 
PM MAIL WWW   Вверх
Akina
Дата 31.5.2006, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
javas
Дата 31.5.2006, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 23.10.2003

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



nworm, 123 и 321 и 132 и 123... это одно и тоже, для них всех должен быть один номер N.
Akina, если все это называется размещением, то напиши пожалуйста. smile    

Это сообщение отредактировал(а) javas - 31.5.2006, 15:46
--------------------
 
PM   Вверх
Akina
Дата 31.5.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(javas @  31.5.2006,  16:44 Найти цитируемый пост)
123 и 321 и 132 и 123... это одно и тоже, для них всех должен быть один номер N.

А это вообще сочетания, а не размещения. 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
nworm
Дата 31.5.2006, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: 4
Всего: 8



Хорошо, а второй вопрос:
Может ли быть так, что какая-то "перестановка" пропускается?  

 
PM MAIL WWW   Вверх
javas
Дата 31.5.2006, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 23.10.2003

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



нет любая перестановка должна быть, хотя бы для определенного количества k = 1..5. 
--------------------
 
PM   Вверх
nworm
Дата 31.5.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: 4
Всего: 8



Цитата

нет любая перестановка должна быть, хотя бы для определенного количества k = 1..5.  

То есть может быть
"перестановка"=12345 k=53
и одноверменно
"перестановка"=12345 k=55?
Если так, то задача недостаточно формализована или я ещё её не понял (хорошо тогда ещё какие-то пояснения улышать).
 
PM MAIL WWW   Вверх
javas
Дата 1.6.2006, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 23.10.2003

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



nworm, нет не может быть для 1,2,3,4,5 разные k. 
Для всех k  1,2,3,4,5 - 1,3,2,4,5 и т.д. k =35 (к примеру).
Т.е. поясню
1    2    3    4    k
*                1
    *            2
        *        3
            *    4
*    *            5
*        *        6
*            *    7
    *    *        8
    *        *    9
        *    *    10
*    *    *        11
    *    *    *    12
*    *        *    13
*        *    *    14
Какая бы ни была перестановка для k=5 ({1,2},{2,1}), k=5;
Если для 2-х чисел я могу придумать какой-нибудь горе алгоритм, то для 3-х и далее никак в голову ничего не приходит. smile 


  

Это сообщение отредактировал(а) javas - 1.6.2006, 00:25

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  vin.gif 2,13 Kb
--------------------
 
PM   Вверх
nworm
Дата 1.6.2006, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: 4
Всего: 8



Чего-то я нашёл, но надо протестировать на своих значениях.
http://forum.cgm.ru/tree?th=1011&mid=6...ev=&reveal=
Сам я это всё не проверял. 
PM MAIL WWW   Вверх
Кнером
Дата 2.6.2006, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


тОрмоз
**


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

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



Цитата(javas @  31.5.2006,  10:25 Найти цитируемый пост)
Нам известы комбинации для чисел от 1 до 3 - это радует.

javas, я могу предложить придуманный мною алгоритм перестановки 4х символов.  smile 
К сожалению, исходник на СИ не сохранился. Но зато на бумажке остался алгоритм.  smile 
Если к моему алгоритму применить рекурсию, то можно осуществлять перестановки > 4х символов.

Я поставил себе цель придумать алгоритм перестановки 4х символов.
С помощью которого можно было бы переставлять в дальнейшем любое количество символов.
Так же чтобы не было повторящихся комбинайций.

Для 2х и 3х символов не составило особого труда придумать алгоритм.
Но к сожалению, они все не подходили для перестановки > 3х символов.

Поломав голову ~2 недели, мне все таки удалось придумать свой алгоритм перестановки 4х символов.
Потом в интернете я нашел несколько алгоритмов. Что подтверждает мою любимую фразу:
"Что есть как минимум 2 способа решения проблемы/задачи или выхода из ситуации..."

В дальнейшем я хотел с помощью рекурсии расширить кругозор своего алгоритма.
Чтобы можно было осуществлять перестановки > 4х символов. С рекурсиями пока не дружу.  smile 

Была мысль перестановки > 4х символов с определенным количеством соимволов в одной комбинации.
Ранний пример, есть 4 символа. И нужно произвести перебор так, чтобы в одной комбинации было 4 символа. Что я уже собственно и зделал.
А теперь, есть 7 символов, но нужно чтобы в одной комбинации было 4 символа.
Данную мысль пока не реализовываю. Потому-что нужно разобраться с рекурсией.

Без рекурсий будет просто не реально. Потому-что очень большая вложенность циклов.  smile 
А так же количество символов в комбинации будет фиксировано.

Таким образом я хочу чтобы можно было задавать любое число как в количестве символов, так и
в количестве символов в одной комбинации.

Моим алгоритмом можно осуществлять перестановку больше 2х символов. Проверял для 3,4 и 5.
Дальше как-то лениво было. Хотелось по быстрее разобраться с рекурсией  smile 

Цитата(Aloha @  31.5.2006,  11:01 Найти цитируемый пост)
Число перестановок из k элементов (по рассматриваемой схеме) равно (2^k) - 1. Например, для чисел 1,2,3,4 число перестановок равно 15, а для чисел от 1 до 100 000 их будет (2^100 000) - 1.

Aloha, а я когда решал свою задачу, думал, что число перестановок равно n! (факториал)
Следовательно, 4!=1*2*3*4=24 комбинациям. Я в ручную перебрал все комбинации для 4х символов.
И как не странно их оказалось 24  smile 

Цитата(Akina @  31.5.2006,  17:42 Найти цитируемый пост)
А это вообще сочетания, а не размещения. 

javas, вы мой друг как-то странно скачите от одной задачи к другой. С начала сообщается,
что нужен алгоритм перестановки всех возможных комбинаций, а потом вдруг нужен алгоритм
всех возможных сочитаний.

Поясню.
1) Перестановки. Есть 1,2,3. Может быть 123, 321, 213 и так далее.
Комбинации могут быть состоящии только из 3х цифр.
2) Сочитания. Есть 1,2,3. Может быть 1, 3, 31, 12, 23 и т.д.
Комбинации начинаются с одной цифры и т.д.

Я придумал алгоритм для перестановки всех возможных комбинаций. Не важно цифра или буква. 

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  alg.gif 4,35 Kb
PM MAIL WWW ICQ   Вверх
Aloha
Дата 2.6.2006, 03:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
**


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

Репутация: 4
Всего: 165



Кнером
В исходном топике javas использовал термин перестановка, хотя по смыслу поста речь шла о сочетаниях (ну использовал и использовал, смысл задачи от этого не изменился).
Число сочетаний из k элементов по N равно с(k,N)=N!/((N-k)!k!) (на это указал nworm). Далее, если у нас есть последовательность из N уникальных элементов, то по условию задачи мы должны перебрать все сочетания из 1 элемента, 2 элементов и т.д. (такие пары, как, например {a,b} и {b,a} считаются неразличимыми, собственно, поэтому речь и идет о сочетаниях, а не о перестановках).
Общее число сочетаний, очевидно равно:
M = с(1,N) + с(2,N) + ... + с(N,N)
С другой стороны известно, что
с(0,N) + с(1,N) + ... + с(N,N) = 2^N
а так как с(0,N) = 1, то
M = 2^N - 1.
Цитата(Кнером @ 2.6.2006,  02:51)
Я в ручную перебрал все комбинации для 4х символов. И как не странно их оказалось 24

Это конечно здорово, но, по-видимому, вы различали комбинации типа 321 и 123. А нужно ли это было делать или нет – конечное слово за javas. Ведь он "заказчик".   

Это сообщение отредактировал(а) Aloha - 2.6.2006, 03:54
PM   Вверх
javas
Дата 2.6.2006, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 23.10.2003

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



nworm,  все отлично, спасибо. 
--------------------
 
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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