Sospecho que hay una manera si puede guardar localizando el otro extremo de un rango de valores repetidos más rápido que iterando a través de esa sublista¿Es posible eliminar duplicados de una lista ordenada en menos de O (n) tiempo?
Respuesta
En general, no. Imagine una lista de N duplicados. Tendría que hacer eliminaciones de N-1, por lo tanto, O (N).
Si especifica una estructura de datos particular con mejor que O (1) eliminación de elementos, entonces podría haber un mejor camino para ciertos tipos de entradas.
Incluso si puede eliminar eficientemente un rango de elementos en O (1), y tarda O (1) tiempo en encontrar un duplicado - imagine una lista donde hay N/2 pares de duplicados. Aún tendrá que hacer N/2 búsquedas y eliminar N/2 rangos, ambos de los cuales son O (N).
(también hay un poco de ambigüedad como el título de la pregunta es 'eliminar duplicados', pero el cuerpo es específico para la eliminación de un rango)
Si la lista resultante de su especie tiene la siguiente representación - Cada nodo tiene un valor, y un recuento de ocurrencia para eso, luego eliminar las duplicaciones para un valor establecerá trivialmente el recuento a 1 para ese nodo. (A skip list probablemente tenga características similares, asumiendo un ambiente decente recogido de basura donde no hay costo para reclamar memoria), entonces eso sería O (1) para una duplicación. Si necesita eliminar todos los duplicados de la lista, todavía sería O (N).
Imagine una lista de N duplicados. Tendría que hacer remociones N-1, por lo tanto O (N) - No, si conoce el principio y el final del rango de duplicados, entonces solo tiene una eliminación. –
@Jakub, el resto podría cortarse en O (1). Liberarlo correctamente dará O (n). – ruslik
@ruslik: defina correctamente. Una simple comprobación de la igualdad del primer y último elemento es una correcta en mi humilde opinión. –
Yo iría por un enfoque 'binario de búsqueda' para encontrar extremos de los rangos:
Supongamos que tenemos una lista ordenada de n elementos.
- Comparar 1-st y n-ésimo elemento - si es igual a toda la lista es un duplicado.
- Seleccionar un elemento intermedio (n/2)
- Ejecutar la búsqueda de forma recursiva para dos sub-listas.
¿Estás hablando de una lista vinculada o una matriz ordenada? –
¿Cómo no van a hacer O (N) operaciones si la lista es N/2 lotes de duplicados? –
@Blagovest a una matriz una sola eliminación es O (n) .. – ruslik
En general no existe, porque siempre puede construir un caso en el que tiene O (n) (una lista sin duplicados). Sin embargo, si comienza a hacer suposiciones sobre los datos (por ejemplo, que hay como mucho log n elementos distintos), puede obtener algo mejor (aunque no estoy seguro en este caso particular).
Esto, por supuesto, supone que tiene alguna forma de hacer "eliminaciones masivas" eficientes, lo que significa que puede eliminar cualquier rango de elementos iguales en O (1), independientemente de su tamaño.
No puedo estar
como para la comparación de todos los elementos con el otro que tenemos que hacer n * (n-1) = n2-n comparaciones ... `
- 1. eliminar duplicados de una lista (en vim)
- 2. ¿Es posible calcular la mediana de una lista de números mejor que O (n log n)?
- 3. Eliminar objetos duplicados en una lista (C#)
- 4. ¿Podemos calcular esto en menos de O (n * n) ... (nlogn o n)
- 5. Una matriz de longitud N puede contener valores 1,2,3 ... N^2. ¿Es posible ordenar el tiempo O (n)?
- 6. Obtenga sumas ordenadas de una lista ordenada
- 7. Cómo eliminar los no duplicados de una lista en C#
- 8. Encontrar duplicados en una secuencia no ordenada de manera eficiente
- 9. ¿Es posible encontrar dos números cuya diferencia es mínima en O (n) Tiempo de
- 10. Buscar existencia de número en una lista ordenada en tiempo constante? (Pregunta de la entrevista)
- 11. En tiempo menos que lineal, busque el duplicado en una matriz ordenada
- 12. ¿Buscar en una lista ordenada?
- 13. ¿Cómo eliminar duplicados de una lista en Clojure?
- 14. Cómo eliminar duplicados de una lista en C#
- 15. eliminar duplicados de una lista <int>
- 16. Eliminar duplicados de la lista usando Guava
- 17. cómo eliminar cadenas vacías de la lista, luego eliminar valores duplicados de una lista
- 18. ¿Es posible crear una lista ordenada de varios niveles en HTML?
- 19. Eliminar duplicados de una tabla
- 20. Eliminar duplicados de la matriz en tiempo lineal y sin matrices adicionales
- 21. Lista ordenada, recursiva, ordenada, legible, de los archivos más grandes
- 22. Creación de una lista ordenada al azar de una lista ordenada
- 23. C# Lista eliminar del final, realmente O (n)?
- 24. Consultar una lista para solo duplicados
- 25. eliminando duplicados de una lista C#
- 26. Eliminar duplicados de una tabla grande
- 27. ¿Cómo aleatorizar una lista ordenada?
- 28. Scala: Eliminar duplicados en la lista de objetos
- 29. Vistas de CouchDB: eliminar duplicados * y * ordenar por tiempo
- 30. eliminar duplicados en una consulta de Django
¿Qué quiere decir con "la lista "¿?" En una lista enlazada, el cruce es inevitablemente O (N). Si solo quiere decir "alguna estructura de datos lineal", puede usar una búsqueda binaria en una estructura de datos que admita un recorrido binario o aleatorio (por ejemplo, un árbol o una matriz). –
si el algoritmo de clasificación tiene complejidad de tiempo O (nlogn) y puede eliminar los duplicados en O (1) tiempo, la complejidad general seguirá siendo O (nlogn). –
Para aclarar quiero decir una estructura de datos lineal que admite acceso aleatorio, pero no un árbol. Vamos a llamarlo una matriz. –