Conteo del número de elementos menores que X en un árbol de búsqueda binario (BST)
He implementado un BST para un multiconjunto utilizando el código C++ que se muestra a continuación, donde cada nodo contiene el número de ocurrencias “num” de cada número distinto “data”, y trato de encontrar el número de elementos menores que cierto valor x utilizando la función “order” que aparece a continuación.
Funciona, sin embargo es ineficiente en términos de tiempo de ejecución.
¿Existe algún método con una complejidad de tiempo mejor?
struct Node {
int data;
int height;
int num;
Node *left;
Node *right;
};
int order(Node *n, int x) {
int sum = 0;
if (n != NULL) {
if (n->data < x) {
sum += n->num;
sum += order(n->right, x);
}
sum += order(n->left, x);
}
return sum;
}
davy.ai
Sí, hay un método con una complejidad temporal mejor. Dado que el BST está implementado para un multiconjunto, podemos modificar cada nodo para que tenga un campo adicional llamado
count
que mantenga el conteo del número de ocurrencias de todos los elementos menores o iguales adata
. Luego podemos modificar la funciónorder
usando el campocount
para encontrar el número de elementos menores que un cierto valor x en una complejidad temporal de O(log n).La implementación modificada para la estructura de nodo sería la siguiente:
Y la nueva implementación para la función
order
se muestra a continuación:La complejidad temporal de la función
order
modificada es O(log n) ya que estamos recorriendo el BST de manera de búsqueda en profundidad y cada nodo almacena el conteo de todos los elementos menores o iguales adata
.