¿Cómo podemos dividir un conjunto dado de números (posiblemente negativos) en dos partes que tienen el mismo promedio?

El problema es NP-completo.

Como referencia, a continuación llamaré a este problema el mismo problema de división promedio (SAS).

Khalil Sawant tiene la observación correcta sobre los promedios, pero luego comete el error común de hacer la reducción en la dirección incorrecta. Para demostrar que un nuevo problema es difícil, necesitamos reducir un problema viejo, ya conocido por ser difícil, al nuevo, no al revés. (Puedo reducir el viaje de NYC a LA a viajar a la luna y viceversa, pero la existencia de esta reducción no significa que viajar de NYC a LA sea difícil).

Nuestro problema está obviamente en NP. Para mostrar que es NP-hard, podemos reducir el problema de la suma de subconjuntos a nuestro problema de la siguiente manera:

Considere cualquier instancia del problema de suma de subconjuntos. Es decir, tenemos algunos valores [math] a_1, \ dots, a_n [/ math] y queremos decidir si algún subconjunto no vacío de [math] a_i [/ ​​math] s se suma a cero.

Deje [math] s = \ sum a_i [/ ​​math]. (Es decir, [math] s [/ math] es la suma actual de todos los elementos).

Si [math] s [/ math] es 0, simplemente tenemos que resolver el problema de SAS para esta instancia en particular.

De lo contrario, considere la siguiente instancia: [math] (a_1, \ dots, a_n, -s) [/ math]. Afirmamos que SAS tiene una solución para esta nueva instancia si y solo si Subset Sum tenía una solución para la instancia original.

¿Porqué es eso? Nuestra nueva instancia de SAS tiene suma cero, por lo tanto, estamos buscando dos partes no vacías que tengan suma cero. El elemento [math] -s [/ math] debe terminar en una de las dos partes. Y como [math] s \ not = 0 [/ math], esta parte debe contener al menos otro número. Por lo tanto, cada solución a SAS para la nueva instancia nos da una solución de Subset Sum para la instancia original. La dirección opuesta se puede verificar de manera similar.

Por lo tanto, resolver SAS es al menos tan difícil como resolver Subset Sum.

(Agradecimientos a Robert Johnson por simplificar mi reducción original).

[código]
input = [1, 7, 15, 29, 11, 9]

N = len (entrada)

para n en rango (1, 2 ** N – 1):
m = n
izquierda = []
derecha = []
para i en rango (N):
si m & 1:
Derecha . agregar (entrada [i])
más:
izquierda . agregar (entrada [i])
m = m >> 1
si 1. * sum (izquierda) / len (izquierda) == 1. * sum (derecha) / len (derecha):
imprimir a la izquierda
imprimir a la derecha
descanso
[/código]

Algunas personas inteligentes y conocedoras le han dicho que este problema es insoluble. Sin embargo, pensé que te gustaría ver un algoritmo realmente primitivo. Funciona contando del 1 al 2 ** N-1, que ofrece todas las formas de asignar los elementos a dos conjuntos. Cuando encuentra la primera forma que cumple con la condición deseada, se detiene. Utiliza la representación de dígitos binarios de los números.

Si group1_average == group2_average, entonces
group1_average == group2_average == full_array_average

En su caso, el promedio de la matriz completa también es 12
lo que significa que tan pronto como tengamos la matriz, sabremos el promedio objetivo a alcanzar.

Podemos representar los elementos de la matriz como diferencia en relación con el promedio para lograr
Entonces, su matriz se convierte en [-11 -5 3 17 -1 -3], en la que desea encontrar el subconjunto adecuado cuya suma es cero (La suma de toda la matriz también es cero)

Este problema ahora se ha reducido al problema de suma de subconjuntos
Desafortunadamente no es tiempo polinómico

More Interesting

¿Qué algoritmos son buenos candidatos para el reconocimiento de sonido? Estoy principalmente interesado en reconocer sonidos en un entorno doméstico, por ejemplo, un temporizador de microondas que suena, un teléfono que suena, un timbre, etc.

En los lenguajes de programación donde una matriz crece dinámicamente en tamaño, ¿no es una preocupación porque es O (n) complejidad de tiempo?

¿Qué proyectos de aprendizaje automático se ven bien en un currículum?

¿Cuál es la diferencia entre una matriz y una variable?

Entrevista Street puzzle: ¿Pregunta de hormigas en la sección de matemáticas?

Si digo los números del 1 al 100 en un orden aleatorio y omito un número, ¿cómo determinaría el número que falta solo en su cabeza?

En los términos más simples, ¿qué es un algoritmo? ¿Cual es su propósito?

¿Cuáles son los algoritmos comunes que uno debe conocer?

¿Qué tiene más sentido estudiar como programador después de aprender algoritmos básicos?

¿Aproximadamente cuánto más rápido es el GCD binario que el algoritmo euclidiano para la aritmética de precisión fija en las computadoras actuales?

¿Cuáles son los algoritmos criptográficos básicos que un programador debe saber?

¿Cuál es el beneficio de sobrecargar una función recursiva?

Cómo escribir un orden de fusión en SQL sin formato

¿Cuál es la mejor manera de extrapolar una señal dispersa que proviene de un filtro de Kalman?

Cómo encontrar el factorial de un número grande, como 100, en C