ранжирование unranking комбинаций с ограниченными дубликатами (факторический ранг) - PullRequest
0 голосов
/ 06 июня 2018

Мне нужен алгоритм, который ранжирует / отменяет комбинацию с дубликатами.Что мне нужно, так это для n чисел выбрать k чисел с количеством копий до r.

, например, для списка с n (диапазон) = 4, k (len_combination) = 3, r (max_repeats) = 2

(1, 1, 2)
(1, 1, 3)
(1, 1, 4)
(1, 2, 2)
(1, 2, 3)
(1, 2, 4)
(1, 3, 3)
(1, 3, 4)
(1, 4, 4)
(2, 2, 3)
(2, 2, 4)
(2, 3, 3)
(2, 3, 4)
(2, 4, 4)
(3, 3, 4)
(3, 4, 4)

Я бы хотел получить вывод в виде ранга комбинации с (1,1,2) ранжированием наименьшим эта ссылка предоставляет мне алгоритм перестановок с дубликатами и этимВики-страница дает мне метод для вычисления комбинаторного ранга без дубликатов, мое требование - комбинаторный ранг с ограниченным количеством дубликатов

Я знаю о itertools.product,Считать, где моя последовательность находится в полном списке, не вариант, так как я имею дело с n> 100, и мне нужна такая функция.Я ищу решение на основе комбинаторных расчетов.

def rank_seq(S,n,k,r):
    ##some kickass math calculations
return rank

print(rank_seq(2,2,4),4,3,2)) ##output 11
print(rank_seq(2,2,4),5,3,2)) ##output 16
print(rank_seq(2,2,4),6,3,2)) ##output 22

1 Ответ

0 голосов
/ 06 июня 2018

Попробуйте использовать itertools.product:

import itertools
l = itertools.product(list(range(1,4)),repeat=3)
c = 1
for i in l:
    if not len(set(i)) == 1:
        print('Rank: {} :{}'.format(c,i))
        c+=1
    else:
        pass

Вывод:

Rank: 1 :(1, 1, 2)
Rank: 2 :(1, 1, 3)
Rank: 3 :(1, 2, 1)
Rank: 4 :(1, 2, 2)
Rank: 5 :(1, 2, 3)
Rank: 6 :(1, 3, 1)
Rank: 7 :(1, 3, 2)
Rank: 8 :(1, 3, 3)
Rank: 9 :(2, 1, 1)
Rank: 10 :(2, 1, 2)
Rank: 11 :(2, 1, 3)
Rank: 12 :(2, 2, 1)
Rank: 13 :(2, 2, 3)
Rank: 14 :(2, 3, 1)
Rank: 15 :(2, 3, 2)
Rank: 16 :(2, 3, 3)
Rank: 17 :(3, 1, 1)
Rank: 18 :(3, 1, 2)
Rank: 19 :(3, 1, 3)
Rank: 20 :(3, 2, 1)
Rank: 21 :(3, 2, 2)
Rank: 22 :(3, 2, 3)
Rank: 23 :(3, 3, 1)
Rank: 24 :(3, 3, 2)
...