Advertisement
techno-

p3.c

Jan 15th, 2023
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.80 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <sys/time.h>
  5. #include <math.h>
  6. #include <stdbool.h>
  7.  
  8. //Samuel Varela, Javier Rapela, Javier Loureiro
  9.  
  10. double microsegundos() {
  11.     struct timeval t;
  12.     if (gettimeofday(&t, NULL) < 0 )
  13.         return 0.0;
  14.     return (t.tv_usec + t.tv_sec * 1000000.0);
  15. }
  16.  
  17. void inicializar_semilla() {
  18.     srand(time(NULL));
  19. }
  20.  
  21. struct nodo {
  22.     int elem;
  23.     int num_repeticiones;
  24.     struct nodo *izq, *der;
  25. };
  26.  
  27. typedef struct nodo *posicion;
  28. typedef struct nodo *arbol;
  29.  
  30.  
  31. static struct nodo *crearnodo(int e) { //////////////LEAK
  32.     struct nodo *p = malloc(sizeof(struct nodo));
  33.     if (p == NULL) {
  34.         printf("memoria agotada\n"); exit(EXIT_FAILURE);
  35.     }
  36.     p->elem = e;
  37.     p->num_repeticiones = 1;
  38.     p->izq = NULL;
  39.     p->der = NULL;
  40.     return p;
  41. }
  42.  
  43. arbol insertar(int e, arbol a){
  44.     if (a == NULL)
  45.         return crearnodo(e);
  46.     else if (e < a->elem)
  47.         a->izq = insertar(e, a->izq);
  48.     else if (e > a->elem)
  49.         a->der = insertar(e, a->der);
  50.     else
  51.         a->num_repeticiones++;
  52.     return a;
  53. }
  54.  
  55. arbol creararbol() { /* devuelve un arbol vacio */ //////////////LEAK
  56.     arbol e =NULL;
  57.     return e;
  58. }
  59.  
  60. int esarbolvacio(arbol e){
  61.     return (e==NULL);
  62. }
  63.  
  64. posicion buscar(int key, arbol root){
  65.  
  66.     if (root == NULL || root->elem == key)
  67.         return root;
  68.  
  69.     if (root->elem < key)
  70.         return buscar(key, root->der);
  71.  
  72.     return buscar(key,root->izq);
  73. }
  74.  
  75.  
  76.  
  77. void liberarMemoria(arbol nodo){
  78.     if (nodo != NULL) {
  79.  
  80.         liberarMemoria(nodo->izq);
  81.         liberarMemoria(nodo->der);
  82.         free(nodo);
  83.     }
  84. }
  85.  
  86. arbol eliminararbol(arbol nodo){
  87.     liberarMemoria(nodo);
  88.     nodo=NULL;
  89.     return nodo;
  90. }
  91.  
  92. posicion hijoizquierdo(arbol nodo){
  93.     return nodo->izq;
  94. }
  95.  
  96. posicion hijoderecho(arbol nodo){
  97.     return nodo->der;
  98. }
  99.  
  100. int elemento(posicion nodo){
  101.     return nodo->elem;
  102. }
  103.  
  104. int numerorepeticiones(posicion nodo){
  105.     return nodo->num_repeticiones;
  106. }
  107.  
  108. int altura(arbol node){
  109.     int altizq;
  110.     int altder;
  111.     if (node == NULL) {
  112.         return -1;
  113.     }else {
  114.  
  115.         altizq = altura(node->izq);
  116.         altder = altura(node->der);
  117.  
  118.         if (altizq > altder)
  119.             return (altizq + 1);
  120.         else
  121.             return (altder + 1);
  122.     }
  123. }
  124.  
  125. void visualizar2(arbol e){
  126.     if(esarbolvacio(e)){
  127.         return;
  128.     }
  129.     if(e->izq != NULL) {
  130.         printf("(");
  131.     }
  132.     visualizar2(e->izq);
  133.     if(e->izq != NULL) {
  134.         printf(")");
  135.     }
  136.     printf(" %d ",e->elem);
  137.     if(e->der != NULL) {
  138.         printf("(");
  139.     }
  140.     visualizar2(e->der);
  141.     if(e->der != NULL) {
  142.         printf(")");
  143.     }
  144.  
  145. }
  146.  
  147. void visualizar(arbol e){
  148.     if(esarbolvacio(e)){
  149.         printf("().");
  150.     }else {
  151.         visualizar2(e);printf(".");
  152.     }
  153. }
  154.  
  155.  
  156. void test(){
  157.     int i;
  158.     arbol e = creararbol();
  159.     printf("arbol vacio: ");
  160.     visualizar(e);
  161.     printf("\naltura del arbol: ");
  162.     printf("%d",altura(e));
  163.     e=insertar(3,e);
  164.     printf("\nInserto un 3\n");
  165.     e=insertar(1,e);
  166.     printf("Inserto un 1\n");
  167.     e=insertar(2,e);
  168.     printf("Inserto un 2\n");
  169.     e=insertar(5,e);
  170.     printf("Inserto un 5\n");
  171.     e=insertar(4,e);
  172.     printf("Inserto un 4\n");
  173.     e=insertar(5,e);
  174.     printf("Inserto un 5\n");
  175.     printf("arbol: ");
  176.     visualizar(e);
  177.     printf("\n");
  178.     printf("altura del arbol: ");
  179.     printf("%d",altura(e));
  180.     printf("\n");
  181.     for(i=1;i<=6;i++){
  182.         if(buscar(i,e)!=NULL) {
  183.             printf("Busco %d y encuentro %d repetido: %d veces\n",i,i ,buscar(i, e)->num_repeticiones);
  184.         }else{
  185.             printf("Busco %d y no encuentro nada\n",i);
  186.         }
  187.     }
  188.     printf("Borro todos los nodos liberando la memoria:\n");
  189.     e=eliminararbol(e);
  190.     printf("arbol vacio: ");
  191.     visualizar(e);
  192.     printf("\naltura del arbol: ");
  193.     printf("%d",altura(e));
  194. }
  195.  
  196. void printINS(double tiemposIns[6]){
  197.     int cont=0;
  198.     int n;
  199.     printf("\nInsercion de n elementos\n");
  200.     printf("n        t(n)        t(n)/0.7       t(n)/1.0        t(n)/1.2\n");
  201.     for(n=8000;n<=256000;n=n*2){
  202.         printf("%d    %f     %f     %f     %f\n", n, tiemposIns[cont], tiemposIns[cont]/pow(n,0.9), tiemposIns[cont]/pow(n,1.0), tiemposIns[cont]/pow(n,1.2));
  203.         cont++;
  204.     }
  205. }
  206.  
  207. void printBUS(double tiemposBus[6]){
  208.     int cont=0;
  209.     int n;
  210.     printf("\nBusqueda de n elementos\n");
  211.     printf("n        t(n)        t(n)/0.7       t(n)/1.0        t(n)/1.2\n");
  212.     for(n=8000;n<=256000;n=n*2){
  213.         printf("%d    %f     %f     %f     %f\n", n, tiemposBus[cont], tiemposBus[cont]/pow(n,0.8), tiemposBus[cont]/pow(n,1.0), tiemposBus[cont]/pow(n,1.2));
  214.         cont++;
  215.     }
  216.  
  217. }
  218.  
  219.  
  220. int main() {
  221.     int n, cont, random;
  222.     int listaIns=0;
  223.     int listaBus=0;
  224.     double t1, t2, t_ins, t_bus;
  225.     double tiemposIns[6];
  226.     double tiemposBus[6];
  227.     arbol a,e;
  228.     test();  /////////LEAK
  229.     printf("\n\nn        t_ins(n)        t_bus(n)\n");
  230.     for(n=8000;n<=256000;n=n*2){
  231.         inicializar_semilla();
  232.         a = creararbol();
  233.         e= creararbol();
  234.         t1=microsegundos();
  235.         for(cont=0;cont<n;cont++){
  236.             random=(rand() % n);
  237.             e=insertar(random,a);
  238.             liberarMemoria(e);
  239.         }
  240.         t2=microsegundos();
  241.         t_ins=t2-t1;
  242.         tiemposIns[listaIns]=t_ins;
  243.         listaIns++;
  244.         t1=microsegundos();
  245.         for(cont=0;cont<n;cont++){
  246.             random=(rand() % n);
  247.             buscar(random,a);
  248.         }
  249.         t2=microsegundos();
  250.         t_bus=t2-t1;
  251.  
  252.         tiemposBus[listaBus]=t_bus;
  253.         listaBus++;
  254.  
  255.         printf("%d    %f    %f\n", n, t_ins, t_bus);
  256.         eliminararbol(a);
  257.         free(a);
  258.     }
  259.     printINS(tiemposIns);
  260.     printBUS(tiemposBus);
  261.     return 0;
  262. }
  263.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement