Pruebe un escaneo de pasos múltiples si tiene una limitación de espacio estricta.
Digamos que la entrada tiene n elementos y solo puede mantener m elementos en la memoria. Si utiliza un enfoque de tablas hash, en el peor de los casos necesita manejar n/2 números únicos, por lo que quiere m> n/2. En caso de que no tenga esa gran m, puede dividir n elementos en k = (max (input) - min (input))/(2m) grupos, y seguir escaneando los n elementos de entrada k veces (en el peor estuche):
1ª ejecución: solo hash-get/put/mark/elementos con valor < min (entrada) + m * 2; porque en el rango (mín. (entrada), mín. (entrada) + m * 2) hay como máximo m elementos únicos y usted puede manejar eso. Si tiene suerte, ya encontrará la única, de lo contrario, continúe.
segunda carrera: sólo operan en elementos con valor en el rango de (min (de entrada) + m * 2, min (de entrada) + m * 4), y así sucesivamente, etc.
De esta manera, que pongan en peligro la complejidad del tiempo a un O (kn), pero se obtiene una complejidad espacial con destino de O (m)
Las tablas hash no ocupan realmente tanto espacio: 'O (n)'. Si la matriz es tan grande que debes hacerlo en el lugar, entonces probablemente quieras hacerlo con una ordenación externa. – bdares
La complejidad de espacio de un hash es como máximo 'O (n)' (puede haber una 'C> x', para algunas' x' pequeñas, dependiendo de la implementación, sin embargo). Me gusta el "primer acercamiento de tipo". –
Sí, pero merge-sort (inplace) tiene complejidad de espacio cero. – Thilo