Advertisement
KonaJjr

DM_LP

Dec 18th, 2024
22
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.42 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 100 // Maksimalan broj riječi
  9.  
  10. char *arr[MAX];
  11. int num_elements = 0; // Ukupan broj elemenata u hash tablici
  12. int num_collisions = 0; // Broj kolizija
  13.  
  14. // Inicijalizacija hash tablice
  15. void inicijalizacija() {
  16.     for (int i = 0; i < MAX; i++) {
  17.         arr[i] = NULL;
  18.     }
  19. }
  20.  
  21. // Hash funkcija koristeći Division Method
  22. int hash(char *value) {
  23.     int sum = 0;
  24.     for (int i = 0; value[i] != '\0'; i++) {
  25.         sum += value[i];
  26.     }
  27.     return sum % MAX;
  28. }
  29.  
  30. // Insert funkcija s brojanjem kolizija i provjerom load factora
  31. void insert(char *value) {
  32.     if ((float)num_elements / MAX > 0.75) {
  33.         printf("Hash tablica load factor premašuje 0.75. Nove riječi se ne dodaju.\n");
  34.         return;
  35.     }
  36.  
  37.     int index = hash(value);
  38.     int original_index = index;
  39.     int tmp = index;
  40.  
  41.     while (arr[tmp] != NULL && arr[tmp][0] != '\0') {
  42.         if (strcmp(arr[tmp], value) == 0) {
  43.             printf("Element '%s' već postoji!\n", value);
  44.             return;
  45.         }
  46.         tmp = (tmp + 1) % MAX; // Linear probing
  47.         num_collisions++; // Povećaj broj kolizija
  48.         if (tmp == original_index) { // Tablica je puna
  49.             printf("Nema slobodnog mjesta za '%s'!\n", value);
  50.             return;
  51.         }
  52.     }
  53.  
  54.     arr[tmp] = strdup(value); // Dodaj vrijednost u tablicu
  55.     num_elements++;
  56. }
  57.  
  58. // Funkcija za mjerenje vremena unosa i brojanje kolizija
  59. void measure_insertion_time(FILE *file) {
  60.     char line[MAX_LINE_LENGTH];
  61.     int word_count = 0;
  62.     clock_t start, end;
  63.     double total_time;
  64.  
  65.     start = clock();
  66.     while (fgets(line, MAX_LINE_LENGTH, file) && word_count < MAX_WORDS) {
  67.         line[strcspn(line, "\n")] = '\0'; // Ukloni novi red
  68.         insert(line);
  69.         word_count++;
  70.     }
  71.     end = clock();
  72.     total_time = ((double)(end - start)) / CLOCKS_PER_SEC;
  73.  
  74.     printf("Vrijeme unosa: %f sekundi\n", total_time);
  75.     printf("Broj riječi: %d\n", word_count);
  76.     printf("Broj kolizija: %d\n", num_collisions);
  77. }
  78.  
  79. int main() {
  80.     FILE *in_file = fopen("words.txt", "r");
  81.     if (!in_file) {
  82.         printf("Nije moguće otvoriti datoteku!\n");
  83.         exit(-1);
  84.     }
  85.  
  86.     inicijalizacija();
  87.     measure_insertion_time(in_file);
  88.  
  89.     fclose(in_file);
  90.     return 0;
  91. }
  92.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement