Проблема:
Учитывая число n, существует ли эффективный алгоритм для получения списка 2-комбинаций из набора {1... n}, отсортированного по значению произведения комбинации?
Мне нужно это, чтобы определить наибольшее произведение двух * -дицевых чисел, удовлетворяющих определенному условию. Если список несортирован, я должен сначала определить все комбинации, которые удовлетворяют условию, а затем перебрать их, чтобы найти комбинацию с самым большим продуктом, что неэффективно.
В качестве примера, учитывая n = 3, возможны следующие комбинации:
Combination: Product:
3, 3 9
3, 2 6
3, 1 3
2, 2 4
2, 1 2
1, 1 1
Отсортировано по значению продукта в порядке убывания:
Combination: Product:
3, 3 9
2, 3 6
2, 2 4
1, 3 3
1, 2 2
1, 1 1
Дополнительный фон:
Я только что решил вопрос Эйлера Эйлера об обнаружении самого большого палиндромного числа, которое является произведением двух трехзначных чисел. Мой подход состоял в том, чтобы итератировать вниз от 999 (наибольшее 3-значное число) с двумя факторами и найти произведение каждой комбинации, дополнительно проверяя, было ли число палиндромным:
def maxpal():
for i in reversed(range(100,1000)):
# Since we only want unique combinations, we only
# need to iterate up to i
for j in reversed(range(100,i)):
if str(i*j) == str(i*j)[::-1]:
yield i*j
print max(maxpal())
Обратите внимание, что первый список в примере выполняет итерацию по коэффициентам точно в том же порядке, что и этот код. Мое первоначальное предположение заключалось в том, что, поскольку я повторял вниз, первый палиндром, который я нашел, был бы самым большим. Это явно не так, поскольку j
выполняет итерацию до 100, прежде чем i
будет уменьшаться.
Я ищу способ итерации таким образом, чтобы полученные значения были в порядке убывания, так как это позволяет мне получить ответ, просто используя next(maxpal)
один раз, что намного эффективнее.
EDIT:
В интересах того, чтобы не дисквалифицировать хороший ответ на языке, который не является Python, я в порядке с попыткой на любом языке, пока вы объясняете это, чтобы я (или кто-либо еще) мог его в достаточной мере понять.