Поиск:

Ответ в темуСоздание новой темы Создание опроса
> задача на получение всевозможных наборов 
V
    Опции темы
_snikers_
  Дата 5.4.2006, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет мастера!
есть такая задачка!
дано числа p, m;
требуется сгенерировать всевозможные наборы из m+1 чисел, числа берутся из множества {0,1,2..p-1}.
Например :
p=3 -> числа следующие: {0,1,2} m=например 2
значит нужно сформировать все комбинации из трех чисел:
{0,0,0}{0,0,1}{0,0,2}{0,1,0}{0,2,0}{0,1,1}{0,1,2}{0,2,1}{0,2,2} и т.д.

Изаписать их в двумерный массив в котором ь+1 столбец
и P^m рядков

из примера:
0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
.......
2 2 1
2 2 2

Подскажите как это сделать. я не могу придумать!

и еще если можно подскажите какова сложность этого алгоритма

поиском пользовался! нашел какой-то похожий алгоритм, но разобраться даже с ним не смог
ссылка на него -> http://algolist.manual.ru/olimp/per_prb.php

спасибо. жду ответа
PM MAIL   Вверх
maxim1000
Дата 5.4.2006, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(_snikers_ @ 4.4.2006, 23:16 Найти цитируемый пост)
поиском пользовался! нашел какой-то похожий алгоритм, но разобраться даже с ним не смог
ссылка на него -> http://algolist.manual.ru/olimp/per_prb.php

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

в данном случае стоит посмотреть на это, как на запись числа в p-ичной системе счисления
например, при p=10 мы получаем задачу вывода всех m+1-значных десятичных чисел
в общем случае можно просто перебрать все числа, выбрав первое (0,0,...,0) и прибавляя к нему 1-цу по обычным правилам (с переносом на следующие разряды и все такое)
т.е получается что-то типа:
Код

bool Add1(int *array,int m,int p,int degree)
{
  ++array[degree];//увеличиваем разряд
  if(array[degree]==p)//если некуда увеличивать,
  {
    array[degree]=0;//сбрасываем в 0
    if(degree==m)//все, прошли все m+1 разряда (от 0 до m)
      return false;
    else
      return Add1(array,m,p,degree+1);//увеличиваем следующий разряд
  }
  else
    return true;
}
...
//использование:
//выводим все 10-значные числа в 5-чной системе счисления
int array[10]={0,0,0,0,0,0,0,0,0,0};
while(true)
{
  PrintArray(array);
  if(Add1(array,9,5,0))
    break;
}



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


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


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

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



Алгоритм:

Код

Цикл по i от 0 до 2^m-1
   Преобразовать i в битовое представление в строку si
   Начать очередной набор
   Цикл по j от 0 до len(si)-1
      Если j-й символ строки si = "1", включить p(j) в очередной набор.
   Конец цикла
   Закончить и вывести очередной набор
Конец цикла



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

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


Новичок



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

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



Код

Цикл по i от 0 до 2^m-1
   Преобразовать i в битовое представление в строку si
   Начать очередной набор
   Цикл по j от 0 до len(si)-1
      Если j-й символ строки si = "1", включить p(j) в очередной набор.
   Конец цикла
   Закончить и вывести очередной набор
Конец цикла


а на pascal можно как-то? я си не понимаю вааще
PM MAIL   Вверх
maxim1000
Дата 5.4.2006, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(_snikers_ @ 5.4.2006, 11:58 Найти цитируемый пост)
а на pascal можно как-то? я си не понимаю вааще

а это и не C smile
если возникли проблемы с реализацией алгоритма или переводом с языка на язык - лучше писать в форум по этому языку или в Центр помощи...


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


Новичок



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

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



Код

Преобразовать i в битовое представление в строку si


это я не очень представляю.. что это значит
PM MAIL   Вверх
Akina
Дата 6.4.2006, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



_snikers_, Это означает следующее:

Берем очередное i. Например это 11. Количество чисел у нас 6. преобразуем 11 в битовое (двоичное) представление. Получаем 1011. Т.к. чисел 6, добиваем спереди нулями, получая 001011. Т.е. в наборе номер 11 будут присутствовать только числа с порядковым номером 0, 1 и 3 (там единицы) и НЕ будут присутствовать 2, 4, 5 - ибо там нули.


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

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


Эксперт
****


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

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



Цитата(Akina @ 6.4.2006, 08:23 Найти цитируемый пост)
Берем очередное i. Например это 11. Количество чисел у нас 6. преобразуем 11 в битовое (двоичное) представление. Получаем 1011. Т.к. чисел 6, добиваем спереди нулями, получая 001011. Т.е. в наборе номер 11 будут присутствовать только числа с порядковым номером 0, 1 и 3 (там единицы) и НЕ будут присутствовать 2, 4, 5 - ибо там нули

стоп-стоп-стоп...
мне кажется, это не совсем то, что требовалось в задаче:
в данном случае получается выборка всевозможных подмножеств чисел от 0 до m-1
при чем тут p тогда?
ведь если i будет всегда меньше 2^m, то len(si) будет всегда меньше m
а это означает, что числа будут выбираться из промежутка 0..m-1, а не 0..p-1
кроме того количество чисел в наборе будет варьироваться от 0 до m-1, что совсем не соответствует условию задачи - количество должно быть постоянным


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


Новичок



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

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



Код

мне кажется, это не совсем то, что требовалось в задаче:


правильно

Код

а это означает, что числа будут выбираться из промежутка 0..m-1, а не 0..p-1


а вот это неправильно!
я может неправильно написал! но давайте еще раз!
р = это те цифры котрые будут во всех возможных комбинациях из m+1 ЦИФР!
например
p=3, m=4 -> отсюда нужно найти все возможные наборы из m+1(тоесть 4+1=5) цифр значение которых может быть только 0 или 1 или 2 (потому что p=3)

это будет в нашем случае такие
00000
00001
00002
00010
00011
00012
00020
.....
22222
надеюсь тепер понятно
P.S.
блин замучила эта задача
курсовая через 3 недели smile
PM MAIL   Вверх
maxim1000
Дата 6.4.2006, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(_snikers_ @ 6.4.2006, 18:54 Найти цитируемый пост)
а вот это неправильно

это относилось к алгоритму, к которому относилось сообщение, а не к условию задачи


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


Новичок



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

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



to maxim1000
извиняюсь


PM MAIL   Вверх
Akina
Дата 7.4.2006, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(maxim1000 @ 6.4.2006, 11:58 Найти цитируемый пост)
стоп-стоп-стоп...
мне кажется, это не совсем то, что требовалось в задаче:

Да... согласен, был невнимателен.

Вот рабочий, проверенный, код на VB6:

Код

' Определение переменных
Dim m As Integer
Dim p As Integer
Dim i As Integer
Dim cur As Integer
Dim ar() As Integer

' Задание начальных значений
m = 2
p = 2

' переопределение массива по начальным условиям
ReDim ar(m+1)

' Ручное составление первого набора
For i = 0 To m+1
   ar(i) = 0
Next i

' Основной цикл
Do

' Вывод очередного набора
   For i = 0 To m+1
      Debug.Print ar(i);
   Next i
   Debug.Print

' Составление следующего набора
   cur = m+1
   Do While ar(cur) = p - 1
      cur = cur - 1
' Тут - проверка на получение всех наборов
      If cur < 0 Then End
   Loop
   ar(cur) = ar(cur) + 1
   For i = cur + 1 To m+1
      ar(i) = 0
   Next i
Loop



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

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


Новичок



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

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



пасибо всем! задание решил!

Respect to maxim1000 + немного благодарности (после 100 постов :-))

если интересует как решено, пишите на мыло.

Это сообщение отредактировал(а) _snikers_ - 8.4.2006, 12:57
PM MAIL   Вверх
Заппер
Дата 8.4.2006, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

в данном случае стоит посмотреть на это, как на запись числа в p-ичной системе счисления

Согласен. Соотвественно и алгоритм следующий:
цикл от 1 до p^(m+1)
перевод счетчика в p-ичную систему счисления
добавление результата в массив
конец цикла
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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