Advertisement
KonaJjr

DM_DH

Dec 18th, 2024
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.73 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<time.h>
  5.  
  6. #define MAX 100000 // Broj bucket-a u hash tablici
  7. #define R 7919 // Prost broj za drugu hash funkciju
  8. #define MAX_LINE_LENGTH 100
  9. #define MAX_WORDS 10000 // Maksimalan broj riječi
  10.  
  11. char *arr[MAX];
  12. int num_elements = 0; // Ukupan broj elemenata u hash tablici
  13. int num_collisions = 0; // Broj kolizija
  14.  
  15. // Inicijalizacija hash tablice
  16. void inicijalizacija() {
  17.     for (int i = 0; i < MAX; i++) {
  18.         arr[i] = NULL;
  19.     }
  20. }
  21.  
  22. // Prva hash funkcija koristeći Division Method
  23. int hash1(char *value) {
  24.     int sum = 0;
  25.     for (int i = 0; value[i] != '\0'; i++) {
  26.         sum += value[i];
  27.     }
  28.     return sum % MAX;
  29. }
  30.  
  31. // Druga hash funkcija
  32. int hash2(char *key) {
  33.     int sum = 0;
  34.     for (int i = 0; key[i] != '\0'; i++) {
  35.         sum += key[i];
  36.     }
  37.     return (R - (sum % R));
  38. }
  39.  
  40. // Insert funkcija s Double Hashingom i brojanjem kolizija
  41. void insert(char *value) {
  42.     if ((float)num_elements / MAX > 0.75) {
  43.         printf("Hash tablica load factor premašuje 0.75. Nove riječi se ne dodaju.\n");
  44.         return;
  45.     }
  46.  
  47.     int index = hash1(value);
  48.     if (arr[index] == NULL || strcmp(arr[index], "") == 0) {
  49.         arr[index] = strdup(value);
  50.     } else {
  51.         int i = 1;
  52.         int index2 = hash2(value);
  53.         int tmpIndex;
  54.  
  55.         while (i < MAX) {
  56.             tmpIndex = (index + i * index2) % MAX;
  57.             if (arr[tmpIndex] == NULL || strcmp(arr[tmpIndex], "") == 0) {
  58.                 arr[tmpIndex] = strdup(value);
  59.                 break;
  60.             } else {
  61.                 num_collisions++; // Kolizija detektirana
  62.                 i++;
  63.             }
  64.         }
  65.  
  66.         if (i == MAX) {
  67.             printf("Nema slobodnog mjesta za '%s'!\n", value);
  68.         }
  69.     }
  70.  
  71.     num_elements++;
  72. }
  73.  
  74. // Funkcija za mjerenje vremena unosa i brojanje kolizija
  75. void measure_insertion_time(FILE *file) {
  76.     char line[MAX_LINE_LENGTH];
  77.     int word_count = 0;
  78.     clock_t start, end;
  79.     double total_time;
  80.  
  81.     start = clock();
  82.     while (fgets(line, MAX_LINE_LENGTH, file) && word_count < MAX_WORDS) {
  83.         line[strcspn(line, "\n")] = '\0'; // Ukloni novi red
  84.         insert(line);
  85.         word_count++;
  86.     }
  87.     end = clock();
  88.     total_time = ((double)(end - start)) / CLOCKS_PER_SEC;
  89.  
  90.     printf("Vrijeme unosa: %f sekundi\n", total_time);
  91.     printf("Broj riječi: %d\n", word_count);
  92.     printf("Broj kolizija: %d\n", num_collisions);
  93. }
  94.  
  95. int main() {
  96.     FILE *in_file = fopen("words.txt", "r");
  97.     if (!in_file) {
  98.         printf("Nije moguće otvoriti datoteku!\n");
  99.         exit(-1);
  100.     }
  101.  
  102.     inicijalizacija();
  103.     measure_insertion_time(in_file);
  104.  
  105.     fclose(in_file);
  106.     return 0;
  107. }
  108.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement