Tengo un conjunto de números y quiero calcular el subconjunto máximo de modo que la suma de cualquiera de sus dos elementos no sea divisible por un entero . Traté de resolver este problema, pero encontré la solución cuadrática, que no es una respuesta eficiente.
, dónde es el número de elementos y se da constante ¿Hay una solución mejor que la cuadrática?
algorithms
efficiency
manduinca
fuente
fuente
Respuestas:
De hecho, hay un algoritmo de tiempo lineal para esto. Solo necesita usar algunos conceptos básicos de teoría de números. Dados dos númerosnorte1 y norte2 , su suma es divisible a K , solo si la suma de su resto es divisible a K . En otras palabras,
El segundo concepto que debe tener en cuenta es que, la suma de dos númerosr1≠r2 es K , solo si uno de ellos es estrictamente más pequeño que K/ 2 y el otro no es menos que K/2 . En otras palabras,
El tercer concepto que debe tener en cuenta es que, si la suma de dos númerosr1≠r2 es K , ambos se desvían de ⌈K/2⌉−1 por cierto k≤⌈K/2⌉ es decir,
Entonces, para todosk en el tercer concepto, necesitas poner r1 o r2 en el conjunto de soluciones, pero no en ambos. Se le permite poner uno de los números que son divisibles porK y si K es par, solo puede agregar un número cuyo resto es K/2 .
Por lo tanto, aquí está el algoritmo.
Dado un conjuntoN={n1,n2,⋯,nN} , busquemos el conjunto de soluciones S,
El algoritmo es bastante largo, pero la idea es muy simple.
fuente
Considere un conjunto S de tamaño n que contiene todos los números naturales distintos. Tenemos que formar el subconjunto máximo a partir de este conjunto. Usamos una propiedad de módulo básico y le agregamos algunas deducciones para resolver el problema. Espero que sea útil para todos ustedes.
Para dos números naturales N1 y N2: (N1 + N2) mod (K) = (R1 + R2) mod (K) donde R1 = N1modK y R2 = N2% K. 1. Si nosotros (N1 + N2) modK = 0 significa (R1 + R2)% K = 0. 2. Eso significa que R1 + R2 debe ser igual a K, 2K, 3K .... 3. Pero R1 se encuentra entre 0 y K-1 y R2 también, lo que significa que su suma no puede exceder K-1 + K-1 = 2 (K-1). 4. De 2 y 3 podemos concluir que R1 + R2 debe ser igual a K. 5. Además, si R1 + R2 = K eso significa que ambos deben ser iguales a K / 2 (solo posible si K es par) o uno de ellos debe ser menor que el piso [K / 2] y uno mayor que el mismo. 6. Suponga que R1 = T y R2 = KT, si tomamos cualquier número N1 de S cuyo resto es R1 y cualquier número N2 de S cuyo resto es R2, entonces su suma será divisible por K. Por lo tanto, el subconjunto de la Solución puede tener esos números con el resto R1 o aquellos con el resto R2 pero no ambos.
Ahora supongamos que construimos una matriz R de tamaño K con índice de 0 a K-1. El elemento en cada índice denota el número de números en el conjunto S con resto (en la división con K) igual al número de índice. No podemos tener más de 2 números con su resto 0 ya que su suma sería divisible por K, por lo tanto, debemos inicializar nuestro contador con min (R [0], 1). Para T = 1 a T
El código para el mismo algoritmo en C ++ es el que se muestra a continuación:
fuente
Intenté traducir al código C #, el primero en contar solo el tamaño de la matriz de subconjuntos y otro que incluye todo el subconjunto (hash).
Contar:
Con subconjunto:
fuente