Порівнюючи два добутки списків цілих чисел?


10

Припустимо, у мене є два списки натуральних чисел обмеженої величини, і я беру добуток усіх елементів кожного списку. Який найкращий спосіб визначити, який продукт більший?

Звичайно, я можу просто обчислити кожен продукт, але сподіваюся, що існує більш ефективний підхід, оскільки кількість цифр у продуктах лінійно збільшуватиметься з кількістю термінів, так що все обчислення буде квадратичним.

Якби я додавав замість множення, я міг би використовувати "стратегію блискавки", щоб поступово додавати записи з першого списку і віднімати з другого, обходячи необхідність обчислення (великих) загальних сум. Аналогічними методами для продуктів було б підсумовувати логарифми записів, але проблема тепер полягає в тому, що для обчислення журналів потрібне використання неточної арифметики. Якщо тільки є якийсь спосіб довести числову помилку не має значення?


Якщо ми знаємо максимальне ціле значення і воно не залежить від n (тобто константа k), тоді ми можемо скласти таблицю пошуку факторів усіх чисел від 1 до k. Тепер я думаю, якщо ви записуєте все в базу [добуток факторів], воно стає лінійним, оскільки ви можете обчислити продукти в лінійний час з цією базою, а потім по черзі порівнювати кожну цифру (починаючи з цифри найвищого порядку), поки одна не більша за іншу. Деталі там трохи хитрі, але я думаю, що це має спрацювати, якщо k є постійною.
Філліда

Я скоріше скажу, що аналогічна техніка для виробів полягає в тому, щоб зберегти раціональне число, рівне першим елементам першого списку, поділеним на перші елементи другого (плюс обробка с). Але це не дуже корисно, тому що якщо вся кількість є одночасною, вона обчислить обидва продукти. | Також я не впевнений, що алгоритм наївності є квадратичним. Обчисливши добуток з n цілих чисел розміром m, може зайняти до C ( m , m ) + C ( m , 2 m ) + . . . + C ( m , ( n)0нм де C ( x , y ) - вартість множення x -бітових цілих чисел на y -бітних цілих чисел. Якщо ви не вважаєте, що продукти також відповідають форматуC(m,m)+C(m,2m)+...+C(m,(n1)m)C(x,y)хy
xavierm02

1
Можливо, є якийсь спосіб поширити метод у math.stackexchange.com/a/1081989/10385
xavierm02

Вдосконалення щодо наївного підходу: підраховуйте кількість випадків кожного фактора (за лінійним часом) та обчислюйте лише продукт у кінці, використовуючи ефективний алгоритм живлення. Це працює в часі , що є O ( nO(M(n)) використовуючи поточний асимптотично найшвидший метод. O(nlogn2O(logn))
Еміль Єржабек

2
Я подумаю про необхідну точність для журналів. Насправді це може бути ефективніше.
Еміль Єржабек

Відповіді:


6

(Я розумію опис проблеми, щоб вхідні числа були обмежені постійною, тому я не буду відстежувати залежність від пов'язаної.)

Завдання вирішується в лінійному часі та логарифмічному просторі з використанням сум логарифмів. Більш детально алгоритм полягає в наступному:

  1. Використовуючи двійкові лічильники, підрахуйте кількість подій кожного можливого вхідного числа в обох списках.

Для цього потрібен час , і лічильники використовують простір O ( log n ) , оскільки кожен лічильник обмежений значенням n .O(n)O(logn)n

Нехай - прайми нижче межі O ( 1 ) . Розподіляючи кожен лічильник для числа a на прості множники a (з відповідною кратністю) і віднімаючи відліки для одного списку з іншого списку, ми отримуємо наступне за часом O ( log n ) :p1,,pkO(1)aaO(logn)

  1. Обчисліть цілі числа з бітами O ( log n ) таким чином, що задача еквівалентна визначенню знаку Λ : = k i = 1 β i log p i .β1,,βkO(logn)Λ:=i=1kβilogpi

  2. Якщо , дайте відповідь, що продукти рівні.β1==βk=0

В іншому випадку . За теоремою Бейкера ми можемо знизити межу | Λ | > 2 - З увійти п для деякої постійної C . Таким чином, наступне правильно обчислює знак Λ :Λ0

|Λ|>2-Сжурналн
СΛ
  1. Виведіть знак , де π i - наближення log p i до m : = C log n + k + 1 біт точності.i=1кβiπiπiжурналpiм: =Сжурналн+к+1

М(м)мМ(м)=О(мжурналм2О(журналм))О(м2)журналpiмО(М(м)журналм)iβiπiО(М(м))О(М(м)журналм)О(журналнpолу(журналжурналн))

О(н)


Дякую! Пізніше мені доведеться опрацювати деталі, але це здається дуже перспективним!
користувач168715
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.