Un árbol AVL con valores repetidos y doble comparación

0

Pregunta

Necesito crear una estructura de datos (utilizando principalmente los árboles AVL) de objetos con dos valores: nivel (no es el único) y la identificación (es único).

Necesito apoyo a la búsqueda por id, impresión por pedido de los niveles, así como la combinación de dos de estos árboles y mantener estas funcionalidades con el nuevo árbol.

Ya tengo varias soluciones en mente, pero te quería preguntar acerca de uno en concreto:

Va a trabajar para implementar esta estructura con un singular árbol AVL en el que dos nodos son los primeros en comparación de acuerdo a su nivel y, a continuación, sus documentos de identidad? Sobre todo me la lucha para darse cuenta de cómo la fusión de dos de estos árboles podrían trabajo, especialmente en el caso de que tenemos Un árbol donde todos los objetos son de nivel x y el árbol B, donde todos los objetos son de nivel y.

EDIT: También para la búsqueda de identificación además de que habrá un árbol sólo ordenados por id.

Podría este método de trabajo?

algorithm avl-tree data-structures
2021-11-23 19:10:15
1

Mejor respuesta

2

singular árbol AVL en el que dos nodos son los primeros en comparación de acuerdo a su nivel y, a continuación, sus documentos de identidad?

Por desgracia, no. Si usted hace eso, usted no será capaz de buscar de forma eficiente un nodo por su id-usted tendrá que mirar a través de todas las posibles "niveles", que no especificó así que supongo que puede ser ilimitado.

Creo que es posible que desee insertar cada uno de los nodos en dos árboles AVL en su lugar. Un árbol AVL orden de los nodos por nivel, el otro por su id. Todas las consultas, inserciones, deleciones y se funde se puede hacer en cada árbol por separado.

En otras palabras, usted debería crear dos índices sobre sus datos.

En el código:

struct Node {
    int id;
    int level;

    // by id
    int id_bf;
    Node *id_left, *id_right;

    // by level
    int level_bf;
    Node *level_left, *level_right;
};

EDIT: También para la búsqueda de identificación además de que habrá un árbol sólo ordenados por id.

A continuación, usted esencialmente describir la misma cosa como mí. Sin embargo, el árbol que está ordenada por el compuesto (level, id) la clave es un desperdicio; todo lo que usted necesita es un árbol ordenados por (level) y un árbol ordenados por (id) (escalares de las teclas). No hay necesidad, entre las operaciones que se ofrecen, para ordenar por (level, id) y (id).

2021-11-23 19:29:44

Gracias por la respuesta, lamentablemente se me olvidó mencionar que además tendrán un árbol ordenados por id para esta funcionalidad. Pensé que la solución sólo me he estado preguntando acerca de esta solución particular a un compañero de clase me dijo que yo creo que no va a funcionar a causa de la fusión,
user3917631

@user3917631: un árbol ordenados por (nivel, id) también está ordenada por (nivel). Por lo tanto, si usted tiene un árbol ordenados por (id) además de estos, usted será capaz de realizar las operaciones de manera eficiente como he descrito. Es un poco inútil ordenar por (nivel, id) si todo lo que usted necesita es (nivel).
Yakov Galka

Yo sé, yo sólo estoy pidiendo que fuera de interés, puede funcionar? Es posible tener dos árboles ordenados por (nivel, id) ambos números enteros y la combinación de ellos en O(n) (n número de nodos).
user3917631

@user3917631: sí es posible, y no es diferente de la fusión de dos árboles ordenados por otra cosa. Árboles de búsqueda binaria está basado en la comparación, por lo que no 'cuidado' lo que se está utilizando para su clave tan larga como es un conjunto totalmente ordenado. Una tupla de enteros es un conjunto. Artículo de la Wikipedia en árboles AVL se describe cómo hacer eficiente de mezcla; allí se llama a un sindicato. Sin embargo, es posible que desee almacenar nodo de altura en lugar de un factor de equilibrio para hacer eso.
Yakov Galka

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................