Example #1
0
File: avl.c Project: hacatu/Praser2
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;
}
Example #2
0
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);
}