Implementación de árbol B - he de hacer que la clase Nodo una clase miembro estático o no?

StackOverflow https://stackoverflow.com/questions/3503922

  •  29-09-2019
  •  | 
  •  

Pregunta

Necesito implementar un árbol B de la Universidad:

Tengo una clase de "exterior" B-Árbol con atributos root y _degree. La clase para representar los nodos se implementa como una clase estática miembro:

public class BTree<E> {
    private Node<E> root;
    // the minimal degree
    private int degree;

    public BTree(int degree) {
        if (degree < 2) {
            throw new IllegalArgumentException();
        }

        this.degree = degree;
    }

    // other stuff

    private static class Node<T> {
        T[] elements       = (T[])new Object[degree * 2 - 1];
        Node<T>[] children = (Node<T>[])new Object[degree * 2];
        int size           = 0;
    }
}

Así pues, ahora mi problema es:. Como he implementado la clase de nodo como una clase miembro estático, no puedo acceder al atributo de grado de la clase externa

Ahora tengo que opciones:

  1. Hacer la clase Node una clase interna (clase de miembro no estática) o
  2. Crea un constructor de la clase de nodo y pasar el grado en que cada vez que necesito para construir un nodo.

¿Cuál sería la mejor opción? Por lo que es una clase interna que significaría los nodos sería todos tienen una referencia a la Btree (clase externa), pero lo que es una clase de miembro estático significaría que tendría que pasar el grado en cada vez.

¿Fue útil?

Solución

Lo mantendría estática y pasar de grado. De esta manera se asegura que Node no puede conocer ningún detalle acerca de BTree.

Otros consejos

Si fuera yo, tendría el público de clase Node para que pudiera volver a utilizarlo en otras estructuras de datos que contienen, pero eso es sólo conmigo. En ese caso, tendría que pasar el grado a través del constructor, y eso está bien conmigo también. No me gusta la idea de las clases internas manipulación de los miembros de las clases que encierran. Siento que hace que las clases demasiado estrechamente ligados entre sí. Sé que a veces es apropiado, pero evito cuando puedo y esto parece un caso fácilmente evitable.

Hay argumentos para que sea estático, ya que desacopla las clases.

Sin embargo, creo que un BTree.Node es un nodo de un BTree particular. No tiene sentido ir y crear un grupo de nodos (con grados al azar). No se puede tener un nodo, pero ningún árbol. Por lo tanto, digo no estático.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top