Я объясню, где вопрос возникает внизу, но вот выражение. Предположим, у меня есть два списка неотрицательных целых чисел, которые я напишу (A[0] ... A[n])
и (B[0] ... B[m])
. Они строго возрастают, поэтому A[i+1] > A[i]
для всех i
и аналогично для B
. Я хочу собрать все пары элементов n * m
в порядке возрастания их суммы.
Итак, например, если A = (0 1 2)
и B = (1 4)
, то я хочу завершить сбор ((0 1) (1 1) (2 1) (0 4) (1 4) (2 4))
. Если есть связь, мне все равно, какой порядок я собираю в двух элементах. Например, если A = (0 1)
и B = (0 1)
, то я не против, какие из смешанных терминов (0 1)
или (1 0)
, Я выбираю сначала.
Очевидно, я бы хотел, чтобы это было достаточно эффективно. Надеюсь, что это возможно во времени, асимптотически для m * n
. В частности, я надеюсь, что упорядоченный ввод делает эту проблему строго проще, чем эквивалентная проблема, если я ничего не знаю о входах. То, о чем я думал, когда я впервые задал вопрос, - это количество состояния, которое мы должны хранить. Я надеялся, что это возможно с постоянной суммой, но, возможно, это нереально. (То, что я пробовал, так все провалилось!)
Код действительно будет записан в Lisp, но я думаю, что оператор проблемы в значительной степени не зависит от этого. Входы, естественно, приходили бы в виде списков с одиночной привязкой, но в любом случае мне придется их перевернуть заранее, поэтому, если имеет место произвольный доступ, я могу сделать их массивами. В случае, если это уместно, я ожидаю, что это будет в основном вызвано небольшими списками, поэтому массивный постоянный член/постоянный фактор во время выполнения, вероятно, исключает решение. (Хотя я был бы увлечен услышать об идее алгоритма!)
Фон: я смотрел исходный код Maxima, системы компьютерной алгебры и, в частности, на его код для умножения двух многочленов. Полиномы представлены в "разреженном формате", поэтому x^5 + x^2 + 2
может отображаться как (5 1 2 1 0 2)
, с убывающими показателями, за которыми следуют их соответствующие коэффициенты. Чтобы эффективно вычислить продукт, я действительно хочу собрать вместе нулевые термины, термины степени 1 и т.д. Текущий код избегает решения этой проблемы, делая половинчатый удар по нему для повышения эффективности, а затем выполняя своего рода обобщенное многочленное дополнение, чтобы иметь дело с коэффициентами в том порядке, которого он не ожидает. Я чувствую, что мы сможем сделать лучше!