Любителям алгоритмов: как построить конструктивную биекцию между натуральными числами и наборами по k чисел из n?

Имеются числа от 0 до n-1. Нужно пронумеровать все уникальные (с точностью до перестановки) наборы из них по k чиселб k<n. И получить с временной сложностью О(1) набор по номеру. Память тоже O(1).

Пример: n=6, k=4, наборов С(n,k)

0 -> 0123

1 -> 0124

2 -> 0125

3 -> 0134

3 -> 0135

4 -> 0145

5 -> 0234

6 -> 0235

7 -> 0245

8 -> 0345

9 -> 1234

10 -> 1235

11 -> 1245

12 -> 1345

13 -> 2345
  • Вопрос задан
  • 3125 просмотров
Пригласить эксперта
Ответы на вопрос 6
btd
@btd
Мне кажется будет достаточно прибавлять 1 с использованием сложения по модулю n.
Ответ написан
Комментировать
asm0dey
@asm0dey
А в чем проблема создать свою имплементацию Map, у которой будет перепреоделен метод add(): число как строку, ее как charArray, дальше отсортировать и добавить.
Ответ написан
qrazydraqon
@qrazydraqon
Сдаётся мне, получить O(1) не получится ни по n, ни по k. Потому что уже для получения первой цифры по номеру надо уметь определять, в каком из интервалов вида (f(n,k,x),g(n,k,x)] лежит этот номер, где f(n,k,x) = C(n-x-1,k-1), g(n,k,x) = f(n,k,x)+C(n-x-2,k-1). Быстро не вычислить.
Ответ написан
@MikhailEdoshin
Есть готовые способы нумерации сочетаний, кстати. Множество сочетаний рекурсивно разбивается на части, мощность которых известна, номер формируется тоже рекурсивно. Подробно объяснить не могу, сам не понимаю :) Смотрю в Дискретный анализ Романовского, с. 50.
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
Это делается динамическим программированием за сложность O(nk) по процессору и памяти.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы