Этот комбинаторный объект не имеет конкретного имени в английской комбинаторике, в русской и французской комбинаторной терминологии он называется «аранжировки» A (n, k)
Всего существует 44 261 653 680 аранжировок A(62,6)
- таких генерация и вывод (~ 500 ГБ) занимает слишком много времени.В скомпилированных языках, таких как генерация C / C ++ / Delphi (без вывода), возможно, это займет около нескольких часов (приблизительная оценка 10 ^ 6-10 ^ 7 результатов в секунду), но этот процесс должен быть медленнее в PHP (интерпретируемый язык).
Ваш код использует алгоритм для обычных перестановок, который генерирует n!
результаты для необходимых n!/(n-k)!
соглашений.
Простой рекурсивный код Python для генерации устройств.Работает ~ 3 секунды для n = 25, k = 5.Не оптимально, проверю лучше в книге.
n = 4
k = 2
ar = [0] * k
used = set()
def genArr(idx):
for i in range(n):
if not i in used:
used.add(i)
ar[idx] = i
if idx == k - 1:
print(ar) #comment for large n
else:
genArr(idx + 1)
used.remove(i)
genArr(0)
print('OK')
[0, 1, 2]
[0, 1, 3]
[0, 2, 1]
[0, 2, 3]
......
[2, 3, 1]
[3, 0, 1]
[3, 0, 2]
[3, 1, 0]
[3, 1, 2]
[3, 2, 0]
[3, 2, 1]