2009-11-05 2 views
14

Martin Fowler has a Money class 돈 할당 루틴이 있습니다. 이 루틴은 반올림을 통해 값을 잃지 않고 주어진 비율 목록에 따라 돈을 할당합니다. 결과에 대한 나머지 값을 분산시킵니다.Fowler의 돈 할당 알고리즘이 정확하다는 증거

예를 들어, "ratios"(1, 1, 1)로 할당 된 $ 100은 ($ 34, $ 33, $ 33)이됩니다.

public long[] allocate(long amount, long[] ratios) { 
    long total = 0; 
    for (int i = 0; i < ratios.length; i++) total += ratios[i]; 

    long remainder = amount; 
    long[] results = new long[ratios.length]; 
    for (int i = 0; i < results.length; i++) { 
     results[i] = amount * ratios[i]/total; 
     remainder -= results[i]; 
    } 

    for (int i = 0; i < remainder; i++) { 
     results[i]++; 
    } 

    return results; 
} 

. (이 질문을 위해, 내가 갈망으로 돈 유형을 대체하는 자유를 촬영했습니다 그것은 간단하게하기)

: 여기

allocate 기능입니다 질문은, 그것이 옳은지 어떻게 알 수 있습니까? 최종 for-loop를 제외하고는 모두 자명 한 것처럼 보입니다. 나는 다음과 같은 관계에 사실이라고, 그것을 증명하기에 충분하다고 함수가 정확한지 증명하는 생각에 대한 루프 최종 :

remainder < results.length 

사람이 증명할 수 있습니까?

+1

X 번호를 Y 부분으로 나누고 싶다고합시다. 알림은 X % Y입니다. 항상

답변

21

키 통찰력은 각 result[i]을 계산할 때 총 나머지가 개별 나머지의 합계와 같습니다.

각 나머지는 반올림 한 결과이므로 1 이하 여야합니다. 나머지는 results.length이므로 총 잔량은 많아야 results.length입니다.

편집 : 분명히 그렇게 여기에 일부입니다, 꽤 문자가없는 증거가 아니다 ... 간단한
alt text

+0

예, 제가 놓친 부분이었습니다. 고마워. –

+0

+1. 마지막 \은'\ sum_ {i = 1}^k 1 = k'이므로'='이어야한다. – Stephan202

+0

그렇게해야합니다 - 그게 내가 더 적은 수의 줄로 접어 넣었을 때 얻은 것입니다. 그것은 원래'<'를 쓸 때'나머지 stevemegson

0

나는 호기심의 비율이 결과의 수보다 더 큰 원인이 될 수 있기 때문에 정확하지 않다고 말하고 싶습니다. 그러므로 results[i % results.length].amount++;을 제안합니다.

편집 : 답변을 철회합니다. longs와 호기심 비율이없고 부동 소수점 모듈로 도움이되지 않습니다

+0

동의하지 않으면 안됩니다. 이 호기심 많은 배급은 수학적으로 불가능합니다. –

+0

정수의 집합에 대해 "호기심"비율이 없습니다. –

+0

예, 롱 용은 없습니다. 그러나 OP는이 예제에서 간결함을 위해서만 long이 사용되었다고 말했습니다. 그리고 우리 모두는 오류 비율없이 두 값을 비교해서는 안된다는 것을 압니다.따라서 컴퓨터 프로그램에서이 오류 비율로 인해 호기심 비율이 발생할 수 있습니다. – DaClown

1

증거가 필요하지 않습니다.

기본 금액은 간단한 나누기로 반올림하여 할당됩니다. 그래서 할당 된 금액은 항상 합계보다 작거나 같습니다.

나머지는 할당되지 않은 금액을 포함합니다. 항상 'i'보다 작은 정수가 될 것입니다. 그래서 그는 돈이 없어 질 때까지 각 수신자에게 간단하게 1을줍니다.

+1

할당 된 금액이 <= 합계가 명확하지만 왜 비율보다 작음을 보장합니까? –

+0

그것의 <=, 그것의 단지 <('less'). 할당 된 금액이 같으면 할당이 결과를 완벽하게 분할합니다. 그렇지 않습니까? 4 % 2는 알림 2와 함께 1이 아니며 절대로 존재하지 않습니다. –

+1

비율 (1,1,1)로 $ 99를 할당하면 알고리즘의 첫 번째 단계에서 99를 할당하므로 첫 번째 단계에서 할당 한 단계가 실제로 총 금액과 같을 수 있습니다. 하지만 그건 내 질문이 아니야. 내가 이해할 수없는 것은 할당되지 않은 금액 (첫 번째 단계에서)이 #ratios보다 적은 이유입니다. –

0

바로 사용 사실이

A = 바닥 (A/b) * b + (a % b)

관련 문제