Tổng hợp an toàn tràn


13

Giả sử tôi cho cố định chiều rộng số nguyên (tức là họ phù hợp trong một thanh ghi chiều rộng w ), một 1 , một 2 , ... một n như vậy mà số tiền của họ một 1 + một 2 + + một n = S cũng phù hợp trong một thanh ghi chiều rộng w .nwa1,a2,ana1+a2++an=Sw

Dường như với tôi rằng chúng ta luôn có thể hoán vị các con số để sao cho mỗi tổng tiền tố S i = b 1 + b 2 + + b i cũng phù hợp trong một thanh ghi chiều rộng w .b1,b2,bnSi=b1+b2++biw

Về cơ bản, động lực là để tính tổng trên các máy đăng ký chiều rộng cố định mà không phải lo lắng về việc tràn số nguyên ở bất kỳ giai đoạn trung gian nào.S=Sn

Có một thuật toán nhanh (tốt nhất là thời gian tuyến tính) để tìm một hoán vị như vậy (giả sử được đưa ra như là một mảng đầu vào)? (hoặc nói nếu một hoán vị như vậy không tồn tại).ai


3
Theo dõi: Phát hiện tràn trong tổng kết - có phương pháp nào nhanh hơn có tính đến các tính năng bộ xử lý điển hình không?
Gilles 'SO- ngừng trở nên xấu xa'

1
Chỉ cần sử dụng hai thanh ghi bổ sung và tổng hợp chúng. Ngay cả khi nó tràn vào giữa, điều kiện trước của bạn đảm bảo rằng các tràn tràn sẽ hủy bỏ và kết quả sẽ chính xác. : P
CodeInChaos

@CodeInChaos: Điều đó có thực sự đúng không?
Aryabhata

1
Tôi nghĩ vậy. Về cơ bản, bạn đang làm việc trong một nhóm modulo 2 ^ n, trong đó bạn chọn biểu diễn chính tắc từ -2^(n-1)đến 2^(n-1)-1. Tất nhiên nó đòi hỏi hai hành vi tràn bổ sung và được xác định rõ, nhưng trong một ngôn ngữ như C #, nó sẽ hoạt động.
CodeInChaos

@CodeInChaos: Không có hai khả năng có cùng modulo ? Về cơ bản, bạn đang nói, bất kể thứ tự, một trong số chúng không bao giờ có thể xảy ra. Hay tôi đang thiếu một cái gì đó? 2n
Aryabhata

Câu trả lời:


10

Chiến lược
Thuật toán thời gian tuyến tính sau áp dụng chiến lược di chuyển xung quanh , bằng cách chọn số dương hoặc số âm dựa trên dấu của tổng một phần. Nó tiền xử lý danh sách các số; nó tính toán hoán vị của đầu vào khi đang di chuyển, trong khi thực hiện phép cộng.0

Thuật toán

  1. Phân vùng thành hai danh sách, các yếu tố tích cực P và các yếu tố tiêu cực M . Số không có thể được lọc ra.a1,,anPM
  2. Đặt .Sum=0
  3. Trong khi cả hai danh sách đều không trống
  4.       Nếu { S u m : = S u m + đầu ( M ) ; M : = đuôi ( M ) ; }Sum>0Sum:=Sum+head(M)M:=tail(M)
  5.       khác { ; P : = đuôi ( P ) ; }Sum:=Sum+head(P)P:=tail(P)
  6. Khi một trong hai danh sách trở nên trống rỗng, thêm phần còn lại của danh sách còn lại để .S

Tính chính xác Độ chính
xác có thể được thiết lập bằng cách sử dụng một đối số quy nạp đơn giản về độ dài của danh sách các số.

a1,,an

SumSum=0Sum>0SumSumSum0SumSum

Bây giờ, kết quả đầu tiên có thể được áp dụng, và cùng nhau những điều này là đủ để chứng minh rằng tổng không bao giờ vượt quá giới hạn.


0
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.