오버 플로우 안전 요약


13

고정 너비 정수 (즉 , 너비 의 레지스터에 적합 ), 주어지고 그 합 도 너비 의 레지스터에 맞습니다 .nwa1,a2,ana1+a2++an=Sw

각 접두사 합계 도 너비 의 레지스터에 맞 도록 항상 숫자를 치환 할 수있는 것 같습니다 .b1,b2,bnSi=b1+b2++biw

기본적으로, 동기는 임의의 중간 단계에서 정수 오버플로에 대해 걱정할 필요없이 고정 폭 레지스터 머신 에서 합계 을 계산하는 것 입니다.S=Sn

그러한 순열을 찾는 빠른 (바람직하게는 선형 시간) 알고리즘이 있습니까 ( 가 입력 배열로 가정되는 경우)? (또는 그러한 순열이 존재하지 않는다고 말하십시오).ai


3
후속 조치 : 요약에서 오버플로 감지 — 일반적인 프로세서 기능을 고려한 더 빠른 방법이 있습니까?
Gilles 'SO- 악마 그만'

1
2의 보수 레지스터를 사용하여 합산하십시오. 중간에 오버플로가 발생하더라도 사전 조건에 따라 오버플로가 취소되고 결과가 정확합니다. : P
코드 인 카오스

@CodeInChaos : 정말 맞나요?
Aryabhata

1
나도 그렇게 생각해. 당신은 기본적으로 당신이에서 정규 표현을 선택 그룹의 모듈로 2 ^ n을에서 작업 -2^(n-1)2^(n-1)-1. 물론 2의 보완 및 잘 정의 된 오버플로 동작이 필요하지만 C #과 같은 언어에서는 작동합니다.
코드 InChaos

@CodeInChaos : 동일한 나머지 모듈로 을 제공하는 두 가지 가능성이 없습니까? 당신은 기본적으로 명령에 관계없이 그들 중 하나는 결코 일어날 수 없다고 말합니다. 아니면 뭔가 빠졌습니까? 2n
Aryabhata

답변:


10

전략
다음 선형 시간 알고리즘 은 부분 합의 부호를 기반으로 양수 또는 음수를 선택하여 약 의 호버링 전략을 채택합니다 . 숫자 목록을 전처리합니다. 그 입력의 순열 계산 즉석를 가산을 수행하는 동안.0

연산

  1. 파티션 두 목록으로, 양 원소 및 음극 원소 . 0을 필터링 할 수 있습니다.a1,,anPM
  2. 이라고합시다 .Sum=0
  3. 두 목록이 모두 비어 있지 않지만
  4.        If { ; ; }Sum>0Sum:=Sum+head(M)M:=tail(M)
  5.        else { ; ; }Sum:=Sum+head(P)P:=tail(P)
  6. 두 목록 중 하나가 비어 있으면 나머지 목록의 나머지를 추가하십시오 .S

정확성
정확성은 숫자 목록의 길이에 대한 간단한 유도 인수를 사용하여 설정할 수 있습니다.

먼저 이 모두 양수 (또는 모두 음수)이고 그 합으로 오버플로가 발생하지 않으면 접두사 합도 계산되지 않습니다. 이것은 간단합니다.a1,,an

둘째, 이 범위 내에 있음이 알고리즘 루프의 불변 임을 증명합니다 . 분명히 이것은 루프에 진입 할 때 됩니다. 이제 경우 에 경계 내에 음수 추가 하지 않는 원인 경계 밖으로 이동합니다. 마찬가지로 이 범위 내에있는 양수를 합산하면 이 범위를 벗어나지 않습니다 . 따라서 루프를 종료하면 은 범위 내에 있습니다.SumSum=0Sum>0SumSumSum0SumSum

이제 첫 번째 결과를 적용 할 수 있으며, 이러한 결과는 합이 한계를 벗어나지 않음을 증명하기에 충분합니다.


효율적인 내부 구현을 위해 a) 암시 적 피벗 퀵소트-파티셔닝 (두 포인터 변형)을 수행 한 다음 b) 요약하여 음수로 영역을 통해 포인터를 각각 이동합니다. 양수. 0
Raphael
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.