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.
- 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). - 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). - Á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). - 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). - 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).- ¿Es posible iterar a través de todos los números reales en [a, b] en cualquier lenguaje de programación? ¿Se acerca algo?
- ¿Cuáles son tus 10 idiomas favoritos?
- ¿Qué es una variable?
- ¿Quién decidió que, en una lista de principios científicos, la numeración comienza con cero en lugar de uno?
- ¿Puedo aplicar a la escuela de posgrado para estudiar informática teórica?
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.