Porównywanie dwóch produktów z list liczb całkowitych?

10

Załóżmy, że mam dwie listy liczb całkowitych dodatnich o ograniczonej męskości i biorę iloczyn wszystkich elementów każdej listy. Jaki jest najlepszy sposób ustalenia, który produkt jest większy?

Oczywiście mogę po prostu obliczyć każdy produkt, ale mam nadzieję, że istnieje bardziej wydajne podejście, ponieważ liczba cyfr w produktach wzrośnie liniowo wraz z liczbą terminów, dzięki czemu całe obliczenie będzie kwadratowe.

Gdybym dodawał zamiast zwielokrotniać, mógłbym zastosować „strategię suwaków” polegającą na stopniowym dodawaniu wpisów z pierwszej listy i odejmowaniu od drugiej, unikając potrzeby obliczania (dużych) sum ogólnych. Analogiczne techniki dla produktów polegałyby na sumowaniu logarytmów wpisów, ale problem polega obecnie na tym, że obliczanie logów wymaga użycia niedokładnej arytmetyki. Chyba że istnieje jakiś sposób, aby udowodnić, że błąd numeryczny jest nieistotny?

użytkownik168715
źródło
Jeśli znamy maksymalną liczbę całkowitą i jest ona niezależna od n (tj. Stała k), możemy utworzyć tabelę przeglądową współczynników wszystkich liczb od 1 do k. Teraz myślę, że jeśli napiszesz wszystko w bazie [iloczyn czynników], staje się ono liniowe, ponieważ możesz obliczyć produkty w czasie liniowym z tą bazą, a następnie porównać każdą cyfrę (zaczynając od cyfry najwyższego rzędu) kolejno, aż jedna z nich będzie większa od drugiej. Szczegóły są trochę trudne, ale myślę, że powinno to działać, jeśli k jest stałą.
Phylliida
0nmC(m,m)+C(m,2m)+...+C(m,(n1)m)C(x,y)xy
1
Może być jakiś sposób na rozszerzenie metody w math.stackexchange.com/a/1081989/10385
xavierm02
O(M(n))O(nlogn2O(logn))
2
Pomyślę o wymaganej dokładności logów. To może być bardziej wydajne.
Emil Jeřábek

Odpowiedzi:

6

(Rozumiem opis problemu, dlatego liczby wejściowe są ograniczone stałą, więc nie będę śledził zależności od granicy).

Problem można rozwiązać w czasie liniowym i przestrzeni logarytmicznej za pomocą sum logarytmów. Bardziej szczegółowo algorytm wygląda następująco:

  1. Korzystając z liczników binarnych, policz liczbę wystąpień każdego możliwego numeru wejściowego na obu listach.

O(n)O(logn)n

p1,,pkO(1)aaO(logn)

  1. β1,,βkO(logn)Λ:=i=1kβilogpi

  2. β1==βk=0

Λ0

|Λ|>2Clogn
CΛ
  1. i=1kβiπiπilogpim:=Clogn+k+1

M(m)mM(m)=O(mlogm2O(logm))O(m2)logpimO(M(m)logm)iβiπiO(M(m))O(M(m)logm)O(lognpoly(loglogn))

O(n)

Emil Jeřábek
źródło
Dzięki! Będę musiał omówić szczegóły później, ale wydaje się to bardzo obiecujące!
user168715