Advertisement
techno-

p3 con nuevos tiempos

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