Tengo un problema de algoritmo que encontré en el trabajo pero no he podido encontrar una solución satisfactoria para. Busqué este foro y lo más cercano que he llegado al mismo problema es How to find a duplicate element in an array of shuffled consecutive integers?.Dada una lista desordenada de enteros, devuelva un valor no presente en la lista
Tengo una lista de N elementos de enteros que pueden contener los elementos 1-M (M> N), además, la lista no está ordenada. Quiero una función que tomará esta lista como entrada y devolverá un valor en el rango 1-M que no está presente en la lista. La lista no contiene duplicados. Tenía la esperanza de una solución de O (n), con a cabo utilizando espacio actualización adicional: función no se puede cambiar la lista original L
por ejemplo N = 5 M = 10 la lista (L): 1, 2, 4, 8, 3 entonces f (L) = 5 para ser honesta no me importa si devuelve un elemento distinto de 5, con tal de que cumpla los contraints anteriormente
La única solución que he encontrado hasta el momento está usando una matriz adicional de M elementos. Recorre la lista de entrada y establece los elementos de matriz correspondientes en 1 si está presente en la lista. Luego, vuelva a iterar sobre esta lista y regrese el índice del primer elemento con el valor 0. Como puede ver, esto usa un espacio o (M) adicional y tiene una complejidad 2 * o (N). Cualquier ayuda sería apreciada.
Gracias por la ayuda de todos. La comunidad de desbordamiento de pila es definitivamente muy útil. Para dar a cada uno un poco más de contexto del problema que estoy tratando de resolver. Tengo un conjunto de tokens M que doy a algunos clientes (uno por cliente). Cuando un cliente termina con la ficha, vuelve a mi pila. Como puede ver, el orden original que le doy al cliente es un token ordenado.
de modo M = 3 Tokens
cliente1: 1 < 2,3>
client2: 2 < 3>
retorno cliente1: 1 < 1,3>
cliente 3: 3 < 1>
Ahora la cuestión está dando client4 token de 1. En esta etapa podría dar cliente 4 token 2 y ordenar la lista. No estoy seguro si eso ayudaría. En cualquier caso, si se me ocurre una buena solución limpia, me aseguraré de publicarlo
Me acabo de dar cuenta de que podría haber confundido a todos. No tengo la lista de tokens gratis cuando me llaman. Podría mantener estáticamente una lista así, pero preferiría no
Puede mejorarlo construyendo un conjunto de hash de tamaño 'N' de todos los elementos [en lugar de construir una matriz de tamaño' M'], y luego iterando en [1, ...] hasta el tamaño del conjunto aumenta [en realidad agrega un elemento al conjunto]. Lo convertirá en 'O (N)' espacio + tiempo, que es mejor que tu solución inicial de una matriz de tamaño 'M' - aunque aún no' O (1) 'espacio – amit
Una forma más sencilla de hacerlo O (N) el espacio sería solo hacer un seguimiento de cuál de los primeros N elementos contiene la lista. Se garantiza que terminará con un espacio en blanco en los primeros N valores en M, o una lista de números completa desde 1-N (en cuyo caso su respuesta es N + 1). – VeeArr
Creo que se puede encontrar una buena respuesta a esta pregunta en http://www.cs.bell-labs.com/cm/cs/pearls/ (los primeros capítulos lo más probable). Si pienso en el mañana, trataré de encontrarlo. http://stackoverflow.com/questions/1642474/find-a-missing-32bit-integer-among-a-unsorted-array-containing-at-most-4-billion – Josay