Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Генерирование k-элементных подмножеств 
V
    Опции темы
Elfet
Дата 17.2.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



smile Генерирование k-элементных подмножеств. Прошу помощи! Нужен какой-нибудь алгоритм. Заранее спасибо за ответ (липский-не помог)


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


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Можно вкратце узнать, что это такое?
Просто я может знаю ответ, но называю их по другому.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Elfet
Дата 17.2.2006, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Мммм smile А другого названия и нет smile Нужно их множества размером N получитьь все возможные подмножества размера K smile


--------------------
PM MAIL WWW Skype   Вверх
maxim1000
Дата 18.2.2006, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 33
Всего: 110



сначала выбираем первый элемент (N способов)
а потом - из остальных (N-1) выбираем (K-1) подмножества и прикрепляем к ним выбранный элемент
чтобы избавиться от вариантов, которые отличаются только порядком следования, следующее множество можно выбирать только из элементов, идущих после предыдущего...


--------------------
qqq
PM WWW   Вверх
Elfet
Дата 18.2.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



maxim1000, ничего не понял smile


--------------------
PM MAIL WWW Skype   Вверх
SoWa
Дата 18.2.2006, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Я тоже, если честно.
Определение скажите!


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
maxim1000
Дата 18.2.2006, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 33
Всего: 110



A+b - множество A с добавленным элементом b
A-b - множество A без элемента b
A[n] - n-й элемент множества A
Length(A) - количество элементов A
print(A) - вывести множество

далее - схематически на языке смутно напоминающем C++:
Код

void f(set A,int k,set prefix=0)
{
  if(k==0)
    print(prefix);
  else
    for(int c=0;c<Length(A);c++)
      f(A-A[c],k-1,prefix+A[c]);
}

Добавлено @ 20:47
только этот способ будет выдавать слишком много результатов : и abc, и acb, и bac, ...
чтобы порядок не учитывался, можно сделать так:
Код

void f(set A,int k,set prefix=0,int min=0)
{
  if(k==0)
    print(prefix);
  else
    for(int c=min;c<Length(A);c++)
      f(A,k-1,prefix+A[c],c+1);
}



--------------------
qqq
PM WWW   Вверх
SoWa
Дата 18.2.2006, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Понял! Зачем надо было так сложно называть?


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Elfet
Дата 18.2.2006, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



А это через рекурсию smile А я тут узнал, что это алгоритм через цыклы можно и нада smile Взял книжечку "Комбинаторика для программиста" Липского, нашёл нужный алгоритм(даже два): в первом явный ляп,а второй ну очень запутан smile


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


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Да сам напиши! Все проще некуда!


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
maxim1000
Дата 18.2.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 33
Всего: 110



Цитата(SoWa @ 18.2.2006, 20:12 Найти цитируемый пост)
Понял! Зачем надо было так сложно называть?

иногда на меня находит какое-то "сложновысказывание"
смотрю, что написал, вижу, что непонятно, пытаюсь пояснить, получается еще запутаннее smile


--------------------
qqq
PM WWW   Вверх
Elfet
Дата 18.2.2006, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



не получаеться smile


--------------------
PM MAIL WWW Skype   Вверх
maxim1000
Дата 19.2.2006, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 33
Всего: 110



Цитата(Elfet @ 18.2.2006, 21:51 Найти цитируемый пост)
не получаеться

что именно?


--------------------
qqq
PM WWW   Вверх
esperant0
Дата 19.2.2006, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



1)Cгенирирую случайную выборку к элементов из n.

2)повтори первый этап 10nlog n раз


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
maxim1000
Дата 19.2.2006, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 33
Всего: 110



Цитата(esperant0 @ 19.2.2006, 00:02 Найти цитируемый пост)
10nlog n

а, если не секрет, откуда это значение?

P.S.
насколько я понял, всех выборок не получится
(хотя бы потому, что с некоторой вероятностью все сгенерированне выборки будут одинаковыми)
впрочем, формально это и не требовалось...
Добавлено @ 01:12
а, кстати, вот еще один способ - без рекурсии:
генерируем первую выборку - просто первые K элементов множества
а потом "инкрементируем" ее:
(пусть само множество - числа от 1 до N, в другом случае можно сопоставить элементам их номера)
берем последний элемент и увеличиваем его на 1
если увеличивать некуда - увеличиваем предыдущий на 1, а этот ставим сразу после него
с предыдущим - то же самое, т.е. если его некуда увеличивать увеличиваем предыдущий
и т.д., пока не получим выборку из последних K элементов...
Добавлено @ 01:20
приблизительно
Код

void PrintSet(int *set,int length);//распечатывает набор чисел
bool IncrementSet(int *set,int K,int N)
{
  if(set[0]==N-K)
    return false;
  //считаем, сколько элементов уже достигли максимума
  int c=0;
  while(set[K-c-1]==N-c-1)
    ++c;
  ++set[K-c-1];
  while(c>0)
  {
    set[K-c]=set[K-c-1]+1;
    ++c;
  }
  return true;
}
void PrintAllSubSets(int K,int N)
{
  int *subset=new int[K];
  for(int c=0;c<K;++c)
    subset[c]=c;
  while(true)
  {
    PrintSet(subset,K);
    if(!IncrementSet(subset,K,N))
      break;
  }
}



--------------------
qqq
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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