Dada una matriz sin clasificar que contiene un número impar de ocurrencias para todos los números, excepto un número, ¿cómo se puede encontrar ese número?

Daré soluciones a partir de mayor complejidad a menor. Entonces, si estás buscando el mejor método. Probablemente lo encontrarás en la parte inferior.

Solo te estoy dando algoritmos. Si no puede codificar / comprender alguno de ellos, puede enviarme un mensaje directamente.

  1. Fuerza bruta: considere todos los elementos uno por uno y encuentre su frecuencia. En el momento en que encuentre un elemento con un número par de ocurrencias, habrá terminado.
    La peor complejidad del tiempo del caso: O (n2)
    Complejidad de tiempo esperada: ?? (Calcule usted mismo.: P)
    Espacio O (1).
  2. Clasificación:
    • Clasificación basada en comparación básica: simplemente ordénela por cualquier algoritmo de clasificación tradicional. Encuentre la complejidad de cada elemento simplemente comprobando elementos continuos.
      La peor complejidad del tiempo del caso: O (n ^ 2) o puede ser O (nlog n).
      Complejidad espacio-temporal. Depende del algoritmo.
    • Clasificación de cubetas: si el rango de sus claves es menor (O (n) u O (nlog n)). Puedes usar el tipo de cubo. Tomará O (n) espacio extra. Este es un algoritmo de tiempo pseudo lineal .
    • Clasificación de radix: clasifique las claves mediante clasificación de radix. En notación binaria o decimal normal.
      Le dará O (nb) complejidad de tiempo (¿Por qué?),
      Sin embargo, puede reducirlo a O (n). (¿Cómo?).
      Espacio O (1).
  3. Árbol de búsqueda binaria (o árbol AVL): puede construir un árbol de búsqueda binaria en las teclas manteniendo la frecuencia de cada tecla en el nodo. Al final, puede recorrer el árbol e imprimir la clave con frecuencia uniforme.
    Complejidad del tiempo: O esperado (n log n); Peor O (n ^ 2).
    Puede reducir la complejidad del peor momento a O (n log n) utilizando el árbol AVL.
    Complejidad espacial: O (n).
  4. Hashing: cada vez que encuentre un elemento, puede aumentar su frecuencia. Ahora recorra nuevamente la matriz e imprima el elemento con una frecuencia uniforme.
    C ++ STL utiliza un árbol negro rojo en su backend, por lo que le dará una complejidad temporal de O (n log n). Pero seguramente puede diseñar su propia tabla hash para lograr la complejidad lineal del tiempo esperado.
    La complejidad del espacio es nuevamente O (n).
  5. Suponga que su matriz tiene números de 32 bits (en la mayoría de los lenguajes de programación tiene que tener un número constante de bits).

    Haz dos juegos de brocas. Uno para aquellos cuya frecuencia es par. Otro para aquellos cuya frecuencia hasta ahora es extraña.
    Atraviesa la matriz. Cuando consigas un número. Actualice los bits que son comunes en un conjunto par y número a conjunto impar. Y que son comunes en el conjunto impar y el número par (Nota: debe trabajar en el valor anterior del conjunto. De lo contrario, obtendrá un resultado incorrecto). Al final, el decimal correspondiente al conjunto par es la respuesta.
    Complejidad de tiempo O (n)
    Complejidad espacial O (1).

    Si el rango de teclas es O (n), también hay algunos otros métodos. Lo que puede resolverlo en O (n) tiempo y O (1) espacio.

Supongo que el problema se refiere a todos los números en la matriz, en lugar de literalmente “todos los números” (aunque esta suposición se puede reemplazar con una suposición más débil, entonces todos los números representan todos los números de 32 bits, especialmente cuando se da cuenta de que 0 es par )

Si está seguro de que hay exactamente un número repetido un número impar de veces, entonces la solución de Loi Luu es más eficiente. Puedes ver esto de una de dos maneras. Si está dispuesto a tomar como un axioma que XOR mantiene las propiedades conmutativas y asociativas, entonces puede reorganizar los términos sin cambiar el valor del producto, y al menos uno de esos reordenamientos es el término extraño XOR’ed con pares de términos cero . Si no está dispuesto a asumir eso, puede seguir el valor de cada bit a través de la cadena de xors y los bits que ocurren un número impar de veces son exactamente los que están en el término impar.

Sin embargo, si no confía tanto en sus usuarios *, puede resolver el problema en el espacio O (N), como señala Ilia. De hecho, me gustan más estas soluciones desde una perspectiva práctica, aunque son menos inteligentes.

La versión simple de esto supone que sus números son pequeños en comparación con el tamaño de su memoria y de un tamaño comparable o menor a su lista. Simplemente cree una matriz que abarque desde el número más pequeño posible hasta el más grande inicializado a cero. Para cada número (N) en la lista, cambie el enésimo bit en la matriz entre 0 y 1. Si los números no están acotados, esto se convierte en la solución de Ilia. Señalaré que O (N) aquí se refiere al tamaño de la tabla o de la tabla hash, no al tamaño de la lista, que se permite que sea mucho mayor siempre y cuando solo almacenemos la paridad.

Una solución [matemática] \ Theta (N) [/ matemática], que también requiere espacio [matemática] \ Theta (N) [/ matemática]:
Escanee la matriz y realice un seguimiento de la paridad (no del recuento real, ya que solo nos importa si es par o impar) del recuento de cada número. Use un diccionario para las actualizaciones de paridad O (1) amortizadas.

El algoritmo se da a continuación:

Dado un conjunto no ordenado A,
Deje D ser un diccionario vacío

# Rellenar un diccionario
#esto sucede N veces para una matriz de N elementos.
Para cada número n en A:
si n no es una clave en D:
D [n] = falso
#esto lleva tiempo amortizado [math] O (1) [/ math] para una tabla hash
más:
D [n] = no D [n]
# [matemáticas] O (1) [/ matemáticas]

# Ahora el diccionario contiene la paridad de conteos de todos los n en A.
# La asignación de teclas a “verdadero” se produce un número par de veces.
# Escanee por la primera aparición de un “verdadero” y devuelva esa clave.
Para cada n en A:
si D [n] es verdadero:
volver n

# El enunciado del problema garantiza que un número ocurra un número par de veces, por lo que esta línea no se puede alcanzar
afirmar inalcanzable

actualización: esta respuesta es para el problema cuando todos los números tienen un número par de ocurrencias excepto uno.
Una solución simple es así:

x = a [0]
para i = 1 a n-1:
x = x XOR a [i]

El valor de x es el número que desea encontrar. Este algoritmo no puede decirle qué posición en la matriz que contiene x.
Explicación: Es muy simple, tenemos la regla [math] \ oplus [/ math] (XOR):
[matemáticas] i \ oplus j = 0 [/ matemáticas] iff [matemáticas] i == j [/ matemáticas] y [matemáticas] i \ oplus j = 1 [/ matemáticas] de lo contrario. Entonces, [math] \ oplus [/ math] de todos los números de valores no individuales nos da 0, y tenemos [math] 0 \ oplus x = x \ forall x [/ math]

More Interesting

Cómo beneficiarse legal y significativamente de un algoritmo eficiente o (n ^ 5) para SAT sin romper ningún cifrado o compartir el algoritmo

¿De qué manera es mejor transferir valores variables en JavaScript?

Cómo representar más de la cantidad predeterminada de dígitos en números como (1/7) en Python

¿Cuál es el significado y el beneficio de las variables compartidas en Theano?

¿Con qué tipo de matemáticas debería estar familiarizado un estudiante de CS?

¿Cuáles son las mejores maneras de mejorar la habilidad de programación a través de las matemáticas?

¿Dónde se usan los números primos? ¿Por qué nos enseñan a escribir un programa para encontrar números primos?

Dado un conjunto de n rectángulos alineados en el eje en el plano, ¿qué tan grande es el subconjunto más grande de estos rectángulos que contienen un punto común en O (n ^ 3) y luego en el orden O (nlogn)?

¿Cuáles son los departamentos de investigación más sólidos para la teoría de la computabilidad (recursividad) en el mundo en este momento?

Si un ciclo se ejecuta infinitas veces, ¿por qué recibimos un error de tiempo de ejecución en lugar de un error de límite de tiempo excedido? Además, ¿cuál es el valor de infinito para los compiladores en línea?

¿Entender conceptos difíciles en matemáticas ayuda a tu habilidad de programación?

¿Es la matemática pura esencial para la informática teórica?

¿Cuántos dígitos de precisión pueden medir los experimentos físicos (PI)?

¿Cómo se usa el teorema de Bayes en robótica?

¿Cuál es su problema (s) abierto (s) favorito (s) en Machine Learning desde la perspectiva teórica de un científico de la computación?