avl_node *avl_insert_recursive(avl_node *r, void *key, avl_ft *ft){ if(!r){ return avl_new(key, NULL, NULL, NULL, 0, ft); } int ord = ft->cmp(r->data, key); if(ord < 0){ if(r->right){ return avl_insert_recursive(r->right, key, ft); }//otherwise insert on the right side r->right = avl_new(key, NULL, NULL, r, 0, ft); if(!r->right){//allocation failed return NULL; } return avl_insert_retrace(r->right);//rebalance }else if(ord > 0){ if(r->left){ return avl_insert_recursive(r->left, key, ft); }//otherwise insert on the left side r->left = avl_new(key, NULL, NULL, r, 0, ft); if(!r->left){//allocation failed return NULL; } return avl_insert_retrace(r->left);//rebalance } return NULL; }
END_TEST START_TEST(test_tree) { avl_tree_t *tree = avl_new(); avl_insert(tree, (void*)1, (void*)1234); avl_insert(tree, (void*)2, (void*)12345); avl_insert(tree, (void*)3, (void*)123456); avl_insert(tree, (void*)4, (void*)1234567); avl_insert(tree, (void*)5, (void*)12345678); fail_unless(avl_find(tree, (void*)1) == (void*)1234, "could not find obj 1"); fail_unless(avl_find(tree, (void*)2) == (void*)12345, "could not find obj 2"); fail_unless(avl_find(tree, (void*)3) == (void*)123456, "could not find obj 3"); fail_unless(avl_find(tree, (void*)4) == (void*)1234567, "could not find obj 4"); fail_unless(avl_find(tree, (void*)5) == (void*)12345678, "could not find obj 5"); avl_delete(tree); }
// 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); }