Advertisement
KonaJjr

DM_SC

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