Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.86 KB | None | 0 0
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #include <sys/time.h>
  6. #include <math.h>
  7. #define LONGITUD_CLAVE 30
  8. #define LONGITUD_SINONIMOS 300
  9. #define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
  10.  
  11. // ---------------------------------------------------------------------
  12. // *********************************************************************
  13. // ---------------------------------------------------------------------
  14.  
  15.     typedef struct {
  16.         char clave [LONGITUD_CLAVE];
  17.         char sinonimos [LONGITUD_SINONIMOS];
  18.     } item;
  19.  
  20.     typedef struct entrada_ {
  21.         int ocupada;
  22.         char clave [LONGITUD_CLAVE];
  23.         char sinonimos [LONGITUD_SINONIMOS];
  24.     } entrada;
  25.  
  26.     typedef int colisiones;
  27.    
  28.     typedef int pos;
  29.  
  30. // ---------------------------------------------------------------------
  31. // *********************************************************************
  32. // ---------------------------------------------------------------------
  33.  
  34.     typedef entrada *tabla_cerrada;
  35.         tabla_cerrada d;
  36.    
  37. // ---------------------------------------------------------------------
  38. // *********************************************************************
  39. // ---------------------------------------------------------------------
  40.  
  41.     double microsegundos() {
  42.         /* obtiene la hora del sistema en microsegundos */
  43.         struct timeval t;
  44.        
  45.         if (gettimeofday(&t, NULL) < 0 )
  46.             return 0.0;
  47.         return (t.tv_usec + t.tv_sec * 1000000.0);
  48.     }
  49.  
  50.  
  51. // ---------------------------------------------------------------------
  52. // *********************************************************************
  53. // ---------------------------------------------------------------------
  54.  
  55.     void mostrarTiemposCotas(double time, int n, int flag) {
  56.         double cotasub, cotaaxus, cotasobre;
  57.        
  58.         cotasub= time / pow(n, 0.8);
  59.         cotaaxus= time / n;
  60.         cotasobre= time / pow(n, 1.2);
  61.         if (flag==0) {
  62.             printf("%13d%17f%13f%13f%13f\n", n, time, cotasub, cotaaxus,
  63.                cotasobre);
  64.         } else {
  65.             printf("%3s%10d%17f%13f%13f%13f\n","(*)", n, time, cotasub, cotaaxus,
  66.                cotasobre);
  67.         }
  68.     }
  69.  
  70. // ---------------------------------------------------------------------
  71. // *********************************************************************
  72. // ---------------------------------------------------------------------
  73.  
  74.     int dispersionA(char *clave, int tamTabla) {
  75.         int i, valor = clave[0], n = strlen(clave);
  76.        
  77.        
  78.         for (i = 1; i < n; i++)
  79.             valor += clave[i];
  80.         return valor % tamTabla;
  81.     }
  82.  
  83. // ---------------------------------------------------------------------
  84. // *********************************************************************
  85. // ---------------------------------------------------------------------
  86.  
  87.     int dispersionB(char *clave, int tamTabla) {
  88.         int i, n = MIN(8, strlen(clave));
  89.         unsigned int valor = clave[0];
  90.        
  91.        
  92.         for (i = 1; i < n; i++)
  93.             valor = (valor<<5) + clave[i]; /* el desplazamiento de 5 bits equivale a */
  94.         return valor % tamTabla;        /* multipicar por 32 */
  95.     }
  96.  
  97.  
  98. // ---------------------------------------------------------------------
  99. // *********************************************************************
  100. // ---------------------------------------------------------------------
  101.    
  102.     void inicializar_cerrada(tabla_cerrada *diccionario, int TAM){
  103.    
  104.    
  105.         for(int i = 0; i<TAM; i++){
  106.             (*diccionario)[i].ocupada=0;
  107.         }
  108.     }
  109.  
  110. // ---------------------------------------------------------------------
  111. // *********************************************************************
  112. // ---------------------------------------------------------------------
  113.  
  114.     int resolucionLineal(int pos_inicial, int num_intento){
  115.         return num_intento;
  116.     }
  117.  
  118. // ---------------------------------------------------------------------
  119. // *********************************************************************
  120. // ---------------------------------------------------------------------
  121.  
  122.     int resolucionCuadratica(int pos_inicial, int num_intento){
  123.         return (num_intento )*(num_intento );
  124.     }
  125.  
  126. // ---------------------------------------------------------------------
  127. // *********************************************************************
  128. // ---------------------------------------------------------------------
  129.                              
  130.     pos buscar_cerrada(char *clave, tabla_cerrada diccionario, int TAM,
  131.         int (*dispersion)(char *, int),
  132.         int (*resolucion_colisiones)(int pos_inicial,
  133.         int num_intento)){
  134.         int i=0;
  135.         int x = (*dispersion)(clave, TAM);
  136.  
  137.        
  138.         pos PosActual = x;
  139.         while ( (diccionario[PosActual].ocupada != 0) &&
  140.                 (strcmp(diccionario[PosActual].clave,clave) != 0) ){
  141.             i++;
  142.             PosActual = (x + (*resolucion_colisiones) (x,i))%TAM;
  143.         }
  144.         return PosActual;
  145.     }
  146.  
  147. // ---------------------------------------------------------------------
  148. // *********************************************************************
  149. // ---------------------------------------------------------------------
  150.  
  151.     colisiones insertar_cerrada(char *clave, char *sinonimos,
  152.                              tabla_cerrada *diccionario, int TAM,
  153.                              int (*dispersion)(char *, int),
  154.                              int (*resolucion_colisiones)(int pos_inicial,
  155.                              int num_intento)) {
  156.                                  
  157.         int i = 0;                              
  158.         pos Posicion = buscar_cerrada(clave, *diccionario, TAM,
  159.                               dispersion, resolucion_colisiones);
  160.        
  161.                              
  162.         if ((*diccionario)[Posicion].ocupada    != 1){
  163.             strcpy((*diccionario)[Posicion].clave, clave);
  164.             strcpy((*diccionario)[Posicion].sinonimos, sinonimos);
  165.                     (*diccionario)[Posicion].ocupada = 1;
  166.         }        
  167.         return i;
  168.     }
  169.  
  170. // ---------------------------------------------------------------------
  171. // *********************************************************************
  172. // ---------------------------------------------------------------------
  173.  
  174.     int ndispersion(char *clave, int tamTabla) {
  175.        
  176.        
  177.         if (strcmp(clave, "ANA")==0) return 7;
  178.         if (strcmp(clave, "JOSE")==0) return 7;
  179.         if (strcmp(clave, "OLGA")==0) return 7;
  180.         return 6;
  181.     }
  182.  
  183. // ---------------------------------------------------------------------
  184. // *********************************************************************
  185. // ---------------------------------------------------------------------
  186.  
  187.     void mostrar_cerrada(tabla_cerrada diccionario, int TAM) {
  188.         for (int i = 0; i < TAM; i++) {        
  189.             printf(" %d%s%s%s\n",i,"- (",(diccionario[i].clave),")\n");
  190.         }
  191.         printf(")\n");
  192.     }
  193.  
  194. // ---------------------------------------------------------------------
  195. // *********************************************************************
  196. // ---------------------------------------------------------------------
  197.  
  198.      void resultadoBusqueda(tabla_cerrada diccionario, char* nombre, int TAM,
  199.                             int (*dispersion)(char *, int),
  200.                             int (*resolucion_colisiones)(int pos_inicial,
  201.                             int num_intento)) {
  202.         pos p;
  203.         p = buscar_cerrada(nombre, diccionario, TAM, dispersion, resolucion_colisiones);
  204.         if (strcmp(diccionario[p].clave, nombre)==0) {
  205.             printf("%s%s%s%s\n", "Al buscar: ", nombre, ", encuentro: ",nombre);
  206.         } else {
  207.             printf("%s%s\n", "No encuentro: ",nombre);
  208.         }  
  209.     }
  210.    
  211.  
  212. // ---------------------------------------------------------------------
  213. // *********************************************************************
  214. // ---------------------------------------------------------------------
  215.  
  216.     void test(int (*resolucion_colisiones)(int pos_inicial,
  217.                             int num_intento)) {
  218.         tabla_cerrada d = malloc(11 * sizeof(entrada));
  219.         int TAM = 11;
  220.  
  221.  
  222.         inicializar_cerrada(&d, 11);
  223.         insertar_cerrada("ANA", "Vacio", &d, TAM, ndispersion, resolucion_colisiones );
  224.         insertar_cerrada("LUIS", "Vacio", &d, TAM, ndispersion, resolucion_colisiones);
  225.         insertar_cerrada("JOSE", "Vacio", &d, TAM, ndispersion,  resolucion_colisiones);
  226.         insertar_cerrada("OLGA", "Vacio", &d, TAM, ndispersion,  resolucion_colisiones);
  227.         insertar_cerrada("ROSA", "Vacio", &d, TAM, ndispersion,  resolucion_colisiones);
  228.         insertar_cerrada("IVAN", "Vacio", &d, TAM, ndispersion,  resolucion_colisiones);
  229.         mostrar_cerrada(d,TAM);
  230.         resultadoBusqueda(d, "ANA", 11, ndispersion, resolucion_colisiones);
  231.         resultadoBusqueda(d, "LUIS", 11, ndispersion, resolucion_colisiones);
  232.         resultadoBusqueda(d, "JOSE", 11, ndispersion, resolucion_colisiones);
  233.         resultadoBusqueda(d, "OLGA", 11, ndispersion, resolucion_colisiones);
  234.         resultadoBusqueda(d, "ROSA", 11, ndispersion, resolucion_colisiones);
  235.         resultadoBusqueda(d, "IVAN", 11, ndispersion, resolucion_colisiones);  
  236.         resultadoBusqueda(d, "CARLOS", 11, ndispersion, resolucion_colisiones);
  237.         printf("\n");  
  238.         free(d);
  239.  
  240.     }
  241.  
  242. // ---------------------------------------------------------------------
  243. // *********************************************************************
  244. // ---------------------------------------------------------------------
  245.  
  246.     colisiones insertarDatos(item datos[], tabla_cerrada *d, int TamTabla, int TamDatos,
  247.                             int (*dispersion)(char *, int),
  248.                             int (*resolucion_colisiones)(int pos_inicial,
  249.                             int num_intento)){
  250.         int i = 0;
  251.         colisiones cont = 0;
  252.        
  253.        
  254.         for(i=0; i<TamDatos; i++){
  255.             cont += insertar_cerrada(datos[i].clave,datos[i].sinonimos, d, TamTabla,
  256.                                      dispersion, resolucion_colisiones);
  257.    
  258.         }  
  259.         return cont;
  260.     }
  261.  
  262. // ---------------------------------------------------------------------
  263. // *********************************************************************
  264. // ---------------------------------------------------------------------
  265.  
  266.     int leer_sinonimos(item datos[]) {
  267.         char c;
  268.         int i, j;
  269.         FILE *archivo;
  270.        
  271.        
  272.         if ((archivo = fopen("sinonimos.txt", "r")) == NULL) {
  273.             printf("Error al abrir ’sinonimos.txt’\n");
  274.             return(EXIT_FAILURE);
  275.         }
  276.         for (i = 0; fscanf(archivo, "%s", datos[i].clave) != EOF; i++) {
  277.             if ((c = fgetc(archivo)) != '\t') {
  278.                 printf("Error al leer el tabulador\n");
  279.                 return(EXIT_FAILURE);
  280.             }
  281.             for (j = 0; (c = fgetc(archivo)) != '\n'; j++) {
  282.                 if (j < LONGITUD_SINONIMOS - 1)
  283.                     datos[i].sinonimos[j] = c;
  284.             }
  285.             datos[i].sinonimos[MIN(j, LONGITUD_SINONIMOS -1)] = '\0';
  286.         }
  287.         if (fclose(archivo) != 0) {
  288.             printf("Error al cerrar el fichero\n");
  289.         return(EXIT_FAILURE);
  290.         }
  291.         return(i);
  292.     }
  293.  
  294.    
  295. // ---------------------------------------------------------------------
  296. // *********************************************************************
  297. // ---------------------------------------------------------------------
  298.  
  299.    
  300.     double comprobacionTiempoAnomalo (int n, char * orden, int (*resolucion_colisiones)
  301.                                       (int pos_inicial,
  302.                                       int num_intento),
  303.                                       int (*dispersion)(char *, int)) {
  304.         int cont = 0;
  305.         double atime, btime;
  306.         double time;
  307.         int TamTabla = 38197;
  308.         tabla_cerrada d;
  309.         int TamDatos = 19062;
  310.         item datos[TamDatos];
  311.        
  312.  
  313.         d = malloc (TamTabla * sizeof(entrada));
  314.         atime = microsegundos();
  315.         while (cont <= 10000) {
  316.             leer_sinonimos(datos);
  317.             insertarDatos(datos, &d, TamTabla, TamDatos, dispersion, resolucion_colisiones);
  318.             for (int i = 0; i < n; i++)
  319.                 resultadoBusqueda(d, d[i].clave, TamTabla,dispersion, resolucion_colisiones);
  320.             cont++;
  321.         }
  322.         btime = microsegundos();
  323.         time = btime - atime;
  324.        
  325.         cont = 0;
  326.         atime = microsegundos();
  327.         while (cont <= 10000) {
  328.             leer_sinonimos(datos);
  329.             insertarDatos(datos, &d, TamTabla, TamDatos, dispersion, resolucion_colisiones);
  330.             cont++;
  331.         }
  332.         btime = microsegundos();
  333.         time = time - (btime - atime);
  334.         time = time / cont;
  335.        
  336.         return time;
  337.     }
  338.    
  339. // ---------------------------------------------------------------------
  340. // *********************************************************************
  341. // ---------------------------------------------------------------------
  342.  
  343.     int main(){
  344.         int TamTabla = 38197;
  345.         tabla_cerrada d= malloc (TamTabla * sizeof(entrada));
  346.         int TamDatos = 19062;
  347.         item datos[TamDatos];
  348.        
  349.        
  350.         printf("Leidos correctamente %i sinonimos\n",leer_sinonimos(datos));
  351.         insertarDatos(datos, &d, TamTabla, TamDatos, dispersionA, resolucionLineal);
  352.         mostrar_cerrada(d, 1000);
  353.         resultadoBusqueda(d, "zuzo", TamTabla,dispersionA, resolucionLineal);
  354.  
  355.         /*
  356.         printf("***TABLA CERRADA LINEAL\n");
  357.         test(resolucionLineal);
  358.         printf("***TABLA CERRADA CUADRATICA\n");
  359.         test(resolucionCuadratica);
  360.         */
  361.         return 0;
  362.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement