So sánh hai sản phẩm của danh sách số nguyên?


10

Giả sử tôi có hai danh sách các số nguyên dương của biên độ giới hạn và tôi lấy sản phẩm của tất cả các yếu tố của mỗi danh sách. Cách tốt nhất để xác định sản phẩm nào lớn hơn?

Tất nhiên tôi chỉ đơn giản là có thể tính toán từng sản phẩm, nhưng tôi hy vọng có một cách tiếp cận hiệu quả hơn, vì số chữ số trong các sản phẩm sẽ tăng tuyến tính với số lượng thuật ngữ, do đó toàn bộ tính toán là bậc hai.

Nếu tôi đã thêm thay vì nhân, tôi có thể sử dụng "chiến lược khóa kéo" tăng dần các mục từ danh sách đầu tiên và trừ đi thứ hai, tránh sự cần thiết phải tính tổng (lớn). Các kỹ thuật tương tự cho các sản phẩm sẽ là tổng hợp logarit của các mục, nhưng vấn đề bây giờ là tính toán các bản ghi yêu cầu sử dụng số học không chính xác. Trừ khi có một số cách để chứng minh lỗi số là không liên quan?


Nếu chúng ta biết giá trị nguyên tối đa và độc lập với n (nghĩa là hằng số k) thì chúng ta có thể tạo bảng tra cứu các yếu tố của tất cả các số từ 1 đến k. Bây giờ tôi nghĩ rằng nếu bạn viết mọi thứ trong cơ sở [sản phẩm của các yếu tố] thì nó trở thành tuyến tính vì bạn có thể tính toán các sản phẩm theo thời gian tuyến tính với cơ sở đó sau đó so sánh từng chữ số (bắt đầu bằng chữ số cao nhất) lần lượt cho đến khi một chữ số lớn hơn chữ số kia. Các chi tiết có một chút khó khăn nhưng tôi nghĩ rằng nên làm việc nếu k là một hằng số.
Phylliida

Tôi muốn nói rằng kỹ thuật tương tự cho các sản phẩm là giữ một số hữu tỷ bằng với các phần tử đầu tiên của danh sách đầu tiên chia cho các phần tử đầu tiên của phần thứ hai (cộng với xử lý s). Nhưng điều đó không thực sự hữu ích vì nếu tất cả số đều là nguyên tố, nó sẽ tính toán cả hai sản phẩm. | Ngoài ra tôi không chắc chắn rằng thuật toán ngây thơ là bậc hai. Tính toán một sản phẩm của số nguyên kích thước có thể mất đến nơi là chi phí nhân số nguyên bit với số nguyên bit. Trừ khi bạn cho rằng các sản phẩm cũng phù hợp với định dạngn m C ( m , m ) + C ( m , 2 m ) + . . . + C ( m , ( n - 1 ) m ) C ( x , y ) x y0nmC(m,m)+C(m,2m)+...+C(m,(n-1)m)C(x,y)xy
xavierm02

1
Có thể có một số cách để mở rộng phương thức trong math.stackexchange.com/a/1081989/10385
xavierm02

Một cải tiến về cách tiếp cận ngây thơ: đếm số lần xuất hiện của từng yếu tố (theo thời gian tuyến tính) và chỉ tính toán sản phẩm ở cuối, sử dụng thuật toán cấp nguồn hiệu quả. Điều này hoạt động trong thời gian , đó là bằng phương pháp nhanh nhất không có triệu chứng hiện tại. O ( nÔi(M(n))Ôi(nđăng nhậpn2Ôi(đăng nhập*n))
Emil Jeřábek

2
Tôi sẽ suy nghĩ về độ chính xác cần thiết cho log. Nó thực sự có thể hiệu quả hơn.
Emil Jeřábek

Câu trả lời:


6

(Tôi hiểu mô tả của vấn đề để các số đầu vào được giới hạn bởi một hằng số, vì vậy tôi sẽ không theo dõi sự phụ thuộc vào ràng buộc.)

Vấn đề có thể giải quyết được trong thời gian tuyến tính và không gian logarit bằng cách sử dụng tổng số logarit. Chi tiết hơn, thuật toán như sau:

  1. Sử dụng bộ đếm nhị phân, đếm số lần xuất hiện của từng số đầu vào có thể có trong cả hai danh sách.

Điều này làm mất thời gian và các bộ đếm sử dụng không gian , vì mỗi bộ đếm được giới hạn bởi về giá trị.O ( log n ) nÔi(n)Ôi(đăng nhậpn)n

Đặt là các số nguyên tố bên dưới giới hạn . Bằng cách phân phối mỗi bộ đếm cho một số cho các thừa số nguyên tố của (với bội số thích hợp) và trừ các số đếm cho một danh sách từ danh sách khác, chúng tôi có được thời gian sau : O ( 1 ) a a O ( log n )p1,Giáo dục,pkÔi(1)mộtmộtÔi(đăng nhậpn)

  1. Tính các số nguyên với các sao cho vấn đề tương đương với việc xác định dấu của . O ( log n ) Λ : = Σ k i = 1 β i log p iβ1,Giáo dục,βkÔi(đăng nhậpn)Λ: =ΣTôi= =1kβTôiđăng nhậppTôi

  2. Nếu , hãy trả lời rằng các sản phẩm bằng nhau.β1= == =βk= =0

Nếu không . Theo định lý của Baker , chúng ta có thể hạ thấp giới hạn cho một hằng số nhất định . Do đó, phần sau đây sẽ tính toán chính xác dấu hiệu của :| Λ | > 2 - C log n C ΛΛ0

|Λ|>2-Cđăng nhậpn
CΛ
  1. Xuất ra dấu của , trong đó là một xấp xỉ của với bit chính xác.π i log p i m : = C log n + k + 1ΣTôi= =1kβTôiπTôiπTôiđăng nhậppTôim: =Cđăng nhậpn+k+1

Gọi là chi phí nhân của hai số nguyên -bit. Giới hạn tốt nhất hiện tại là , nhưng ở đây nó sẽ không tạo ra nhiều khác biệt ngay cả khi chúng ta sử dụng tầm thường thuật toán nhân. Chúng ta có thể tính toán với bit chính xác theo thời gian bằng cách sử dụng phép lặp AGM (xem ví dụ ở đây ), sau đó đánh giá mất thời gian . Nhìn chung, bước 4 mất thời gian .m M ( m ) = O ( mM(m)mM(m)= =Ôi(mđăng nhậpm2Ôi(đăng nhập*m))Ôi(m2)đăng nhậppTôimÔi(M(m)đăng nhậpm)ΣTôiβTôiπTôiÔi(M(m))Ôi(M(m)đăng nhậpm)Ôi(đăng nhậpnpotôiy(đăng nhậpđăng nhậpn))

Do đó, thời gian chạy của thuật toán bị chi phối bởi của bước đầu tiên.Ôi(n)


Cảm ơn! Tôi sẽ phải làm việc thông qua các chi tiết sau, nhưng điều này có vẻ rất hứa hẹn!
dùng168715
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.