2010-08-02 33 views
7

Estoy tratando de aclarar algunas cosas con respecto a la complejidad en algunas de las operaciones de TreeSet. En el javadoc que dice:¿Complejidad computacional de las operaciones TreeSet en Java?

"Esta aplicación proporciona registro garantizado (n) Coste de tiempo para los operaciones básicas (añadir, eliminar y contiene)."

Hasta ahora todo bien. Mi pregunta es lo que sucede en addAll(), removeAll(), etc. Aquí el Javadoc para Set dice:

"Si la colección especificada es también un conjunto , la operación addAll efectivamente modifica este conjunto de manera que su el valor es la unión de los dos conjuntos ".

¿Está simplemente explicando el resultado lógico de la operación o está dando una pista sobre la complejidad? Quiero decir, si los dos conjuntos están representados por, por ejemplo, árboles rojo-negro sería mejor unirse a los árboles que "agregar" cada elemento de uno a otro.

En cualquier caso, ¿hay alguna manera de combinar dos TreeSets en uno con complejidad O (logn)?

Gracias de antemano. :-)

+0

Respondiendo a las respuestas que obtuve: No puedo entender esto. Supongamos que tiene dos SortedSets que no tienen elementos superpuestos y están representados por árboles rojo-negro. ¿Cómo es que no puedes unirte a ellos ya que la operación de "unión" en árboles rojo-negro toma el tiempo O (log (n + m))? –

Respuesta

6

Se podía imaginar lo que sería posible optimizar los casos especiales a O(log n), pero el peor de los casos tiene que ser donde m y n son el número de elementos en cada árbol.

Editar:

http://net.pku.edu.cn/~course/cs101/resource/Intro2Algorithm/book6/chap14.htm

describe un algoritmo caso especial que puede unirse a los árboles en O(log(m + n)) pero tenga en cuenta la restricción: todos los miembros de S1 debe ser inferior a todos los miembros de S2. Esto es lo que quise decir con optimizaciones especiales para casos especiales.

3

Al observar el origen de java para TreeSet, parece que si la colección pasada es un SortedSet entonces utiliza un algoritmo de tiempo O (n). De lo contrario, llama a super.addAll, que supongo que dará como resultado O (n logn).

EDITAR - supongo que leo el código demasiado rápido, TreeSet sólo puede utilizar el O (n) algoritmo de si se trata de la correlación de respaldo está vacía

0

No es posible llevar a cabo la fusión de árboles o unirse a conjuntos como en Disjoint- establecer estructuras de datos porque no se sabe si los elementos en los 2 árboles son disjuntos. Dado que las estructuras de datos tienen conocimiento sobre el contenido en otros árboles, es necesario verificar si existe un elemento en el otro árbol antes de agregarlo o, al menos, intentar agregarlo a otro árbol y abortar agregarlo si lo encuentra en la manera. Entonces, debería ser O (MlogN)

+0

No puedo entender esto. Supongamos que tiene dos SortedSets que no tienen elementos superpuestos y están representados por árboles rojo-negro. ¿Cómo es que no puedes unirte a ellos ya que la operación de "unión" en árboles rojo-negro toma el tiempo O (log (n + m))? –

+0

Dando 2 TreeSets arbitrarios, ¿cómo vas a saber si ese es el caso? – user855

+0

Bueno, de acuerdo con el programa que estoy haciendo actualmente, puedo garantizar que los dos TreeSets no tendrán ningún elemento superpuesto. Sin embargo, parece que no puedo unirme a ellos en O (log (n + m)) como se señala en el resto de las respuestas ... –

Cuestiones relacionadas