tutorial traduccion machine learning curso course algorithms c# .net data-structures

c# - traduccion - ¿Por qué no hay clase Tree<T> en.NET?



machine learning tutorial (8)

¿Qué querrías de tal implementación?

¿Árbol binario? ¿Negro rojo? ¿Arbol Radix? B-tree? R-árbol? R * -tree?

Un árbol es más un patrón que una estructura de datos, y tienden a usarse donde el rendimiento importa (por lo que los detalles de la implementación también son importantes). Si el BCL incluye algún tipo de clase de árbol, solo tendrías que mover el tuyo de todos modos

La biblioteca de clases base en .NET tiene algunas estructuras de datos excelentes para colecciones (Lista, Cola, Pila, Diccionario), pero curiosamente no contiene ninguna estructura de datos para árboles binarios. Esta es una estructura terriblemente útil para ciertos algoritmos, como aquellos que aprovechan las diferentes rutas transversales. Estoy buscando una implementación libre y correctamente escrita.

¿Estoy simplemente ciego y no lo encuentro ... está enterrado en algún lugar del BCL? Si no, ¿alguien puede recomendar una biblioteca C # / .NET gratuita o de código abierto para árboles binarios? Preferiblemente uno que emplea genéricos.

EDITAR: Para aclarar lo que estoy buscando. No me interesan las colecciones ordenadas de diccionarios que usan un árbol de manera interna. En realidad, me interesa un árbol binario, uno que expone su estructura para que pueda hacer cosas como extraer subárboles o realizar un recorrido posterior a la corrección en los nodos. Idealmente, dicha clase podría extenderse para proporcionar los comportamientos de árboles especializados (es decir, rojo / negro, AVL, equilibrado, etc.).




Hay un TreeNode que puedes usar. No es genérico y está escondido en formularios de Windows y se usa con el control treeview, pero también se puede usar en otros lugares.


No, no hay ningún tipo de " Tree<T> -like" en el BCL (algo que siempre me ha intrigado) pero aquí hay un buen artículo que lo guiará a implementar el suyo en C #.

Supongo que podría argumentar que las estructuras de datos basadas en árboles se utilizan con menos frecuencia en el tipo de aplicaciones para las que se usa .NET (aplicaciones comerciales, aplicaciones de transferencia de datos, etc.). Aún así, estoy de acuerdo contigo, es extraño que el BCL no tenga implementación en absoluto.


Podrías definir el tuyo:

public class MyTree<K, V> : Dictionary<K, MyTree<K, V>> { public V Value { get; set; } }

O descuidado:

public class MyTree<V> : HashSet<MyTree<V>> { public V Value { get; set; } }


Tienes razón, no hay nada en el BCL. Sospecho que esto se debe a que la opción de usar un árbol suele ser un detalle de implementación y, por lo demás, es una forma poco convencional de acceder a los datos. Es decir, usted no dice "binary-search-for element # 37"; en cambio, dices, "consígueme el elemento n. ° 37".

¿Pero has echado un vistazo a C5 ? Es súper práctico y tienen varias implementaciones de árbol ( 1 , 2 , 3 ).