2011-12-27 21 views
15

Solo por curiosidad, recientemente tuve que usar un árbol para uno de mis programas, tuve que construir un árbol binario, pero ¿por qué la API Collections no tiene un valor predeterminado? implementación de árbol (o incluso un árbol binario)?Por qué Java Collections API no tiene implementación de árbol

Creo que debería haber alguna razón importante por la que decidieron no incluirlo en la API de colecciones.

+0

yup, de hecho interesante – Eugene

+4

TreeSet y TreeMap son dos colecciones respaldadas por un árbol binario. –

+0

No hablo solo del árbol binario, ¿por qué no tenemos una implementación de árbol generalizada, una interfaz de árbol? –

Respuesta

0

java.util.TreeMap es una implementación de Red and Black Tree.

+0

Sé que TreeMap existe, pero es una forma más específica de una estructura de datos de árbol, ¿por qué no tenemos una información más general? implementación de árbol, como tenemos para Lista y Conjunto. ¿Por qué los creadores de colecciones API decidieron no dar una forma generalizada de un árbol? ¿Puede ser que hayan dado un árbol de inteface y sus implementaciones como BinaryTree, AVLTree, RedBlackTree? –

+0

Estoy de acuerdo con la respuesta de Artem Zh. Tree es solo una forma específica de estructura de datos para contener una "colección" de entidades. – Scorpion

10

En mi humilde opinión, Tree no es un tipo de colección, es solo un tipo de implementación. Quiero decir que hay colecciones abstractas como Set (conjunto de entradas no ordenadas), List (conjunto ordenado de entradas), Map (dos conjuntos de entradas con relaciones entre ellas), y hay sus implementaciones: array, list (por ejemplo, ArrayList y LinkedList)), HashSet etc., todos ellos tienen sus propias ventajas y desventajas. Por lo tanto, Tree es solo una de las implementaciones (para listas, por ejemplo) que puede darle una búsqueda (más o menos) más rápida que la matriz, pero no tiene acceso por índice.

BTW, existe TreeMap ("implementación de NavigableMap basada en un árbol rojo-negro") y TreeSet ("una implementación NavigableSet basada en un TreeMap.") En Java.

+0

Esto. Las colecciones no están definidas por sus estructuras de datos, sino por sus promesas sobre el rendimiento con respecto a la inserción, eliminación y búsqueda. Se supone que los detalles de la implementación son irrelevantes, usted elige el contenedor según cuáles sean sus requisitos de uso. Por ejemplo, si necesita un contenedor donde los elementos siempre están ordenados y la búsqueda debe ser O (log n), entonces necesita un conjunto u ordenado. No debería importar cómo la implementación cumpla con las garantías de desempeño. –

+1

No estoy de acuerdo. Las colecciones están definidas por sus contratos. 'Los conjuntos no garantizan el orden (y por lo tanto no tienen acceso indexado), pero no garantizan duplicados. 'Lista de orden de garantía, pero permite duplicados. 'Map's incluye relaciones entre los elementos. El hecho de que pueda usar Árboles para implementar algunos (¿todos?) De estos es irrelevante. Podría, por ejemplo, usar una 'Lista' para implementar un' Conjunto' (por ejemplo 'LinkedHashSet'). También hay más de una forma de implementar un árbol. – Tonio

15

Creo que debería haber alguna razón importante por la que decidieron no incluirlo en la API de colecciones.

creo que la razón es que nadie ha llegado con una buena API para los árboles que sea de uso general

  • suficiente para cubrir una amplia gama de casos de uso, y
  • útil lo suficiente como para compensar los gastos generales de rendimiento de ser general.

(¿Y dónde deja? Árbol? Árbol binario? N-aria árbol? DAG? Gráfico?)

Vale la pena señalar que ni Apache Commons Las colecciones o Google Colecciones (también conocido como guayaba) tienen una árbol API. Sin embargo, existe un problema de Guava activo sobre este tema - http://code.google.com/p/guava-libraries/issues/detail?id=174 - por lo que claramente al menos algunas personas están de acuerdo con su punto de vista.

ACTUALIZACIÓN

partir de la versión 15.0, guayaba tienen ahora un respaldo árbol en la forma de las clases TreeTraverser y BinaryTreeTraverser. Pero esto puede no ser lo que esperas. En verdad, estas clases en realidad no implementan la estructura de datos de árbol. En cambio, debe hacer esto en un parámetro de tipo genérico. Además de eso, las clases Traverser incluso evitan hacer suposiciones sobre las API del tipo de nodo. Lo hacen por ser clases abstractas, y requieren que el subtipo concreto del trasversor implemente las operaciones que interrogan al árbol; p.ej. para obtener los hijos de un nodo.


Fwiw, TreeMap y TreeSet no son "API de árboles". Son implementaciones basadas en árbol de las API Map y Set. El tree-ness está totalmente oculto por las API públicas, lo que hace que estas dos clases sean completamente inadecuadas para su uso como árboles de uso general.

Cuestiones relacionadas