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 .
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 .
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.
¿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).
algorithms
arrays
integers
numerical-analysis
Aryabhata
fuente
fuente
-2^(n-1)
a2^(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.Respuestas:
Estrategia0 , 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.
El siguiente algoritmo de tiempo lineal adopta la estrategia de moverse alrededor de
Algoritmo
Corrección La
corrección se puede establecer utilizando un argumento inductivo directo sobre la longitud de la lista de números.
Ahora, se puede aplicar el primer resultado, y juntos son suficientes para demostrar que la suma nunca sale de los límites.
fuente