Resumen de desbordamiento seguro

13

Supongamos que se me dan enteros de ancho fijo (es decir, caben en un registro de ancho w ), a 1 , a 2 , ... a n de modo que su suma a 1 + a 2 + + a n = S también cabe en un registro de ancho .nwa1,a2,ana1+a2++an=Sw

Me parece que siempre se puede permutar los números para tal que cada suma prefijo S i = b 1 + b 2 + + b i también encaja en un registro de la anchura w .b1,b2,bnSi=b1+b2++biw

Básicamente, la motivación es calcular la suma en máquinas de registro de ancho fijo sin tener que preocuparse por desbordamientos de enteros en ninguna etapa intermedia.S=Sn

¿Existe un algoritmo rápido (preferiblemente de tiempo lineal) para encontrar una permutación de este tipo (suponiendo que se proporcione como una matriz de entrada)? (o decir si tal permutación no existe).ai

Aryabhata
fuente
3
Seguimiento: detección de desbordamiento en suma : ¿existe un método más rápido que tenga en cuenta las características típicas del procesador?
Gilles 'SO- deja de ser malvado'
1
Solo use los registros de complemento a dos y suméelos. Incluso si se desborda en el medio, su condición previa garantiza que los desbordamientos se cancelarán y el resultado será correcto. : P
CodesInChaos
@CodeInChaos: ¿Es eso realmente cierto?
Aryabhata
1
Creo que sí. Básicamente estás trabajando en un módulo de grupo 2 ^ n, donde eliges la representación canónica de-2^(n-1) a 2^(n-1)-1. Por supuesto, requiere un complemento a dos y un comportamiento de desbordamiento bien definido, pero en un lenguaje como C # debería funcionar.
CodesInChaos
@CodeInChaos: ¿No hay dos posibilidades que den el mismo módulo restante ? Básicamente estás diciendo, independientemente del orden, uno de ellos nunca puede suceder. ¿O me estoy perdiendo algo? 2n
Aryabhata

Respuestas:

10

Estrategia
El siguiente algoritmo de tiempo lineal adopta la estrategia de moverse alrededor de 0 , eligiendo números positivos o negativos basados ​​en el signo de la suma parcial. Preprocesa la lista de números; calcula la permutación de la entrada sobre la marcha , mientras realiza la suma.

Algoritmo

  1. Partición en dos listas, los elementos positivos P y los elementos negativosa1,,anP . Los ceros se pueden filtrar.M
  2. Sea .Sum=0
  3. Si bien ambas listas no están vacías
  4.       Si { S u m : = S u m + cabeza ( M ) ; M : = cola ( M ) ; }Sum>0Sum:=Sum+head(M)M:=tail(M)
  5.       Sum:=Sum+head(P)P:=tail(P) ; }
  6. S .

Corrección La
corrección se puede establecer utilizando un argumento inductivo directo sobre la longitud de la lista de números.

a1,,an son todos positivos (o todos negativos), y su suma no causa desbordamiento, tampoco lo hacen las sumas de prefijos. Esto es sencillo.

SumSum=0Sum>0SumSumSum0SumSum Está dentro de los límites.

Ahora, se puede aplicar el primer resultado, y juntos son suficientes para demostrar que la suma nunca sale de los límites.

Dave Clarke
fuente
0