// devuelve true si encuentra la clave en el arbol, false en caso contrario. bool abb_pertenece(const abb_t *arbol, const char *clave){ return abb_buscar(arbol, clave) != NULL; }
// tiempos y ocupacion deben poder aguantar la cantidad de elementos en cs. // en particular deben ser de tamaño 23 para el experimento default. static void _run_once(const char *estructura, struct cadena_struct *cs, long double *tiempos_insercion, unsigned long long *ocupacion, long double *tiempos_busqueda_normal, long double *tiempos_busqueda_cargados, long double *tiempos_eliminacion ) { struct timeval inicio; struct timeval fin; abb abb; avl avl; splaytree stree; if(strcmp(estructura, "abb") == 0) abb_new(&abb); if(strcmp(estructura, "avl") == 0) avl_new(&avl); if(strcmp(estructura, "splaytree") == 0) splaytree_new(&stree); int k; int potencia = 0; long double sumatiempo = 0.0; gettimeofday(&inicio, NULL); for (k=0; k<cs->num_elems; k++) { char *lacadena = get_cadena(cs, k); if(strcmp(estructura, "abb") == 0) abb_insertar(&abb, lacadena, lacadena, TAMANO_CADENA+1); if(strcmp(estructura, "avl") == 0) avl_insertar(&avl, lacadena, lacadena, TAMANO_CADENA+1); if(strcmp(estructura, "splaytree") == 0) splaytree_insertar(&stree, lacadena, lacadena, TAMANO_CADENA+1); if(k+1 == 1<<potencia){ // por ahora reportamos resultados en pantallax. gettimeofday(&fin, NULL); // un hack para un comportamiento molesto... el primer elemento asumimos que se inserta en tiempo 0 if(k==0) tiempos_insercion[potencia] = 0.0; else { sumatiempo += elapsed_time(&fin, &inicio); tiempos_insercion[potencia] = sumatiempo; } if(strcmp(estructura, "abb") == 0) ocupacion[potencia] = abb_espacio(&abb); if(strcmp(estructura, "avl") == 0) ocupacion[potencia] = avl_espacio(&avl); if(strcmp(estructura, "splaytree") == 0) ocupacion[potencia] = splaytree_espacio(&stree); potencia++; gettimeofday(&inicio, NULL); } } // terminamos las inserciones. Lo buscamos todo sumatiempo = 0.0; potencia = 0; gettimeofday(&inicio, NULL); for (k=0; k < cs->num_elems; k++) { char *lacadena = get_cadena(cs, k); if(strcmp(estructura, "abb") == 0) abb_buscar(&abb, lacadena); if(strcmp(estructura, "avl") == 0) avl_buscar(&avl, lacadena); if(strcmp(estructura, "splaytree") == 0) splaytree_buscar(&stree, lacadena); if(k+1 == 1<<potencia){ gettimeofday(&fin, NULL); sumatiempo += elapsed_time(&fin, &inicio); tiempos_busqueda_normal[potencia] = sumatiempo; potencia++; gettimeofday(&inicio, NULL); } } // fin búsquedas sumatiempo = 0.0; potencia = 0; gettimeofday(&inicio, NULL); for (k=0; k < BUSCAR_CADENAS_RAND; k++) { int indicerand = 0; int undecimo = (int)cs->num_elems/10; if(drand48() < 0.9) indicerand = (int)intrand(undecimo); else indicerand = undecimo + intrand(cs->num_elems - undecimo - 1); char *lacadena = get_cadena(cs, indicerand); if(strcmp(estructura, "abb") == 0) abb_buscar(&abb, lacadena); if(strcmp(estructura, "avl") == 0) avl_buscar(&avl, lacadena); if(strcmp(estructura, "splaytree") == 0) splaytree_buscar(&stree, lacadena); if(k+1 == 1<<potencia){ gettimeofday(&fin, NULL); sumatiempo += elapsed_time(&fin, &inicio); tiempos_busqueda_cargados[potencia] = sumatiempo; potencia++; gettimeofday(&inicio, NULL); } } sumatiempo = 0.0; potencia = 0; gettimeofday(&inicio, NULL); for (k=0; k < cs->num_elems; k++) { char *lacadena = get_cadena(cs, k); if(strcmp(estructura, "abb") == 0) abb_eliminar(&abb, lacadena); if(strcmp(estructura, "avl") == 0) avl_eliminar(&avl, lacadena); if(strcmp(estructura, "splaytree") == 0) splaytree_eliminar(&stree, lacadena); if (k+1 == 1<<potencia) { gettimeofday(&fin, NULL); sumatiempo += elapsed_time(&fin, &inicio); tiempos_eliminacion[potencia] = sumatiempo; potencia++; gettimeofday(&inicio, NULL); } } if(strcmp(estructura, "abb") == 0) abb_dispose(&abb); if(strcmp(estructura, "avl") == 0) avl_dispose(&avl); if(strcmp(estructura, "splaytree") == 0) splaytree_dispose(&stree); }
// Devuelve el dato del nodo que contiene la clave pasada por parametro. void* abb_obtener (const abb_t* arbol, const char* clave){ abb_nodo_t* nodo_buscado = abb_buscar(arbol, clave); if (!nodo_buscado) return NULL; return nodo_buscado->dato; }