Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кобинирование элементов, герерация уникальных комбинаций  
:(
    Опции темы
Ogurtsova
Дата 2.7.2009, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Дорогие дузья!

Проблема состоит в следующем:

есть несколько групп (все элементы текстовые, но это не принципиально):

свойство1, свойство2, свойство3, .. свойствоN (количество групп задается пользователем, зарание мы не знаем)

для каждой группы существует свой набор значений, тоже заранее неопределенный

свойство1 -> {A(1), A(2),..A(m1)}
cвойство2 -> {B(1), B(2),..B(m2)}
..
свойствоN -> {X(1),X(2),..X(mn)}


необходимо создать список уникальных сочетаний, причем порядок групп в отдельном взятом элементе строгий и известен

например, дано:

цвет. размер. фактура

цвет -> {красный, желтый, синий, черный}
размер -> {большой, маленький}
фактура -> {металл, пластик, дерево}


необходимо сгенерировать список:

красный. большой. металл
красный. большой. пластик
красный. большой. дерево
красный. маленький. металл
красный. маленький. пластик
красный. маленьский. дерево
желтый. большой. металл
желтый. большой. пластик

...
и т.д.

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

очень буду благодарна помощи!
PM MAIL   Вверх
nworm
Дата 2.7.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да по-разному можно.

Можно циклами for c рекурсией. (Наверное нагляднее всего.) От первой группы до последней.

Можно как при устном счёте - меняем значение в последней группе на следующее, если достигнуто последнее значение меняем предпоследнее и т.д.
PM MAIL WWW   Вверх
Ogurtsova
Дата 2.7.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(nworm @ 2.7.2009,  15:03)
Да по-разному можно.

Можно циклами for c рекурсией. (Наверное нагляднее всего.) От первой группы до последней.

Можно как при устном счёте - меняем значение в последней группе на следующее, если достигнуто последнее значение меняем предпоследнее и т.д.

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

а в данном случае я не знаю, сколько свойств будет: два или десять, и сколько в таком случае циклов for нужно или как это организовать, чтобы было не важно количество циклов.
PM MAIL   Вверх
nworm
Дата 2.7.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как-то так

Код

void donext(int T)
{
 for(i=0;i<кол-во свойств в группе номер T;i++)
  {
   меняем элемент в группе номер T;
   if (T==номер последней группы) 
    печатаем сочетание;
   else
    donext(T++); 
  }


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


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


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

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



Ну по-любому у тебя получается двумерный массив... наиболее просто сделать так: первая размерность = количеству свойств, вторая = максимальному количеству значений свойства. Где значений меньше - там соответственно Null-ы. И обрабатывай. В рекурсивную функцию передаёшь текущий вектор уже выбранных номеров записей по колонкам и номер следующей колонки. Если она последняя - организуешь вывод, если нет - рекурсивный вызов, добавляя в цикле каждую ячейку очередной колонки и увеличив на 1 номер колонки следующей.

Код

Option Explicit
Option Base 0

Private Sub Form_load()
Dim x(2, 3) As String ' последний элемент каждой строки свойств = пустая строка, терминатор
x(0, 0) = "красный"
x(0, 1) = "жёлтый"
x(1, 0) = "металл"
x(1, 1) = "дерево"
x(1, 2) = "пластик"
x(2, 0) = "большой"
x(2, 1) = "маленький"
Dim y(2) As Integer
Call rec(x(), y(), 0)
End Sub

Sub rec(prop() As String, sel() As Integer, col As Integer)
Dim i As Integer, j As Integer
i = 0
If col = UBound(prop, 1) Then
  Do While prop(col, i) <> ""
    For j = 0 To col - 1
      Debug.Print prop(j, sel(j)); ".";
    Next
    Debug.Print prop(col, i)
    i = i + 1
  Loop
Else
  Do While prop(col, i) <> ""
    sel(col) = i
    Call rec(prop(), sel(), col + 1)
    i = i + 1
  Loop
End If
End Sub


Цитата

красный.металл.большой
красный.металл.маленький
красный.дерево.большой
красный.дерево.маленький
красный.пластик.большой
красный.пластик.маленький
жёлтый.металл.большой
жёлтый.металл.маленький
жёлтый.дерево.большой
жёлтый.дерево.маленький
жёлтый.пластик.большой
жёлтый.пластик.маленький





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

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

maxim1000

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


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

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


 




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


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

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