Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как перебрать все комбинации элементов? 
:(
    Опции темы
D@mon
Дата 2.4.2005, 12:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Есть N элементов, N - заранее не известно, нужно перебрать элементы след. образом:
по одному, по два и т.д.
Алгоритм д.б. простой, но что никак не сообразить smile
  Вверх
MBo
Дата 2.4.2005, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всех таких комбинаций, как легко увидеть - 2^N - в наборе элемент либо есть, либо его нет, так что можно просто сделать цикл от 0 (или от 1, если пустой набор не нужен) до 2^N-1.
Единичный бит на k-ом месте в счетчике цикла означает присутствие элемента.
Требование к порядку - сначала по одному, потом по два - маленько усложняет логику, но не настолько, чтобы не догадаться. Возможны как рекурсивные решения (проще, но при больших числах не очень эффективно), так и нерекурсивные.
PM MAIL   Вверх
D@mon
Дата 3.4.2005, 11:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











спасибо
  Вверх
yaja
Дата 4.4.2005, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Была у меня такая задачка на одной из контрольных. Написал рекурсией, но легко переделать и без её использования smile
По научному задача состоит в том, что нужно перебрать в лексеграфическом порядке все подмножества данного множества из n элементов(у меня в проге считается, что все элементы-натуральные числа в диапозоне 1..n)
Код

#include <stdio.h>

int n; // количество элементов
bool* s; // типа говорит, участвует i-ый елемент в данном подмножестве или нет

void step(int k = -1) {
// выводим очередное подмножество
  for (int i = 0; i < n; i++) {
    if (s[i]) printf("%i", i + 1);
  }
// каждое подмножество на одной строке ))
  if (k != -1)
    printf("\n");
// генерируем следущеее подмножество
  for (i = k + 1; i < n; i++) {
    s[i] = true;
    step(i);
    s[i] = false;
  }
}

int main() {

  freopen("subset.in", "r", stdin);
  freopen("subset.out", "w", stdout);
  scanf("%i", &n);
  s = new bool[n];

// выводим пустое подмножество(если не надо удали)
  printf("\n");

  int l = -1;
  step();

  delete[] s;
  fclose(stdin);
  fclose(stdout);
  return 0;
}


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

Это сообщение отредактировал(а) yaja - 10.4.2005, 11:10
PM MAIL   Вверх
Kolia
Дата 16.5.2005, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 132
Регистрация: 11.7.2003
Где: Вильнюс

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



А комп не загнется все варианты перебирать? Возьми строку из 20 элементов. Количество вариантов - 20! (факториал). Число далеко не маленькое.
--------------------
Риспект
PM MAIL ICQ Skype GTalk MSN   Вверх
yaja
Дата 17.5.2005, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
Возьми строку из 20 элементов

Если верить словам моего препода по физике, то для вычисления каких-то величин из квантовой механики необходимо перебрать все перестановки для нескольких тысяч элементов...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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