Russian Qt Forum
Ноябрь 22, 2024, 19:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Алгоритм генерации уникальных сочетаний C(n,k)  (Прочитано 18369 раз)
Aleksey
Гость
« : Июнь 27, 2004, 18:15 »

Господа,

Пожалуйста, помогите найти алгоритм (а лучше код) программы генерации сочетаний из n элементов по k (т.е. C(n,k)). Специфика задачи заключается в том, что среди n элементов могут быть одинаковые, а сочетания нужно получить только уникальные в смысле состава элементов (поэтому их может быть гораздо меньше, чем все C(n,k)).

К примеру, генерируя сочетания из 223 по 2, на выходе нужно получить только 22 и 23, а не 22, 23 и 23 (к чему придет общий алгоритм решения этой задачи).

Заранее благодарен.
Записан
goer
Гость
« Ответ #1 : Декабрь 31, 2006, 19:18 »

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

Собственно, реализация алгоритма генерации следующего
уникального сочетания из N чисел по K в С:

Код:


void getNext()
{
    int i = K;

    while (C[i] + K - i + 1 > N)
        --i;

    C[i]++;

    for (int j = i + 1; j <= K; ++j)
        C[j] = C[j-1] + 1;
}



Как известно, количество таких сочетаний вычисляется по формуле:
 С(N,K) = N! / (K!*(N-K)!)
Поскольку на множестве этих последовательностей определен лексикографический порядок, то для того чтобы получить все перестановки, необходимо начинать с 1, 2 ... K
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 21.