Pull to refresh

Собеседования по алгоритмам: максимальная конкатенация

Level of difficultyMedium
Reading time1 min
Views7.3K

Чему равно самое большое число, которое можно составить из следующих карточек?

Если бы числа на карточках были однозначные, то всё было бы совсем просто: мы бы просто упорядочили их по убыванию. Например, самое большое число, которое можно составить из карточек "2", "3", "9" — это 932.

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

Как это часто бывает в алгоритмах, первым делом полезно придумать наивный алгоритм. В нашем случае — это просто перебор всех перестановок. Например, для чисел "6", "61", "69" он выдаст нам ответ 69661.

from itertools import permutations

xs = ['6', '61', '69']
print(max(''.join(p) for p in permutations(xs)))

Если чисел мало, то этот код отработает быстро. Но с ростом n, количества входных чисел, этот алгоритм быстро станет непрактичным, потому что количество перестановок есть n!, а n!растёт непозволительно быстро.

Например, если перебирать перестановки со скоростью 10^9штук в секунду, то на перебор всех перестановок двадцати объектов понадобится \frac{20!}{10^9 \times 60 \times 60 \times 24 \times 365} \approx 77 лет.

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

Only registered users can participate in poll. Log in, please.
Решили
32.28% Я нашёл самое большое число, которое можно составить из '4', '42', '46', '427', '465'!51
31.65% Я придумал эффективный алгоритм, который и для ста чисел быстро ответ найдёт!50
51.9% Хочу узнать решение82
158 users voted. 33 users abstained.
Tags:
Hubs:
Total votes 14: ↑11 and ↓3+8
Comments139

Articles