У меня есть куча наборов, скажем, S1, S2, S3, ... В каждом наборе есть разные элементы. Скажем, S1 = {A, B, C}, S2 = {X, Y}, S3 = {P, Q, R, T}
Существует комбинация этих множеств K = {S1, S2, S3}. Например, экземпляром этой комбинации будет {A, X, P}. Очевидно, что возможно 3 x 2 x 4 = 24 комбинации. Что мне нужно, так это «ранг» конкретной комбинации, рассчитанный с помощью простого упорядоченного перечисления слева направо и наоборот.
Очевидно, я могу легко вычислить это, просто перечислив все комбинации и сравнив их с запрошенной комбинацией, сохраняя при этом счетчик, но мне нужен эффективный алгоритм, так как мои наборы могут содержать до 20000 элементов каждый и количество объединенных наборов для некоторых случаев > 10.
Кстати, я знаю о потоке Вычислить ранг комбинации? здесь, в переполнении стека . Но, к сожалению, здесь это неприменимо, так как мои комбинации состоят из наборов разного размера для разных позиций.
Я был бы признателен за реализацию на C #, но другие языки или псевдокод также были бы очень полезны.
Любые предложения, пожалуйста
кемаль
ОБНОВЛЕНИЕ: @spinning_plane и @aasmund. Спасибо за ответы. Они оба предоставляют мне одну и ту же формулу для расчета ранга.
Но мне нужно и наоборот. то есть получить комбинацию для данного ранга (с нуля). Например, при ранге 0 результатом будет {A,X,P}, для 3 {A, X, R} и т. д. У кого-нибудь есть алгоритм, пожалуйста?