Advertisement
Guest User

Untitled

a guest
May 20th, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.01 KB | None | 0 0
  1. #include <string>
  2. #include <vector>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <fstream>
  6.  
  7. #define HASH_TABLE_SIZE 100
  8.  
  9.  
  10. //  Prostoe reheshirovanie
  11. int hash_function(std::string identificator) {
  12.     int h = 0;
  13.     for (int i = 0; i < identificator.size(); i++) {
  14.         h = h + 2 * (int)((char)identificator[i]) - 3;
  15.     }
  16.     return h;
  17. }
  18.  
  19.  
  20. // Yporyadochenniy spisok
  21. struct OrdList {
  22.     std::string val;
  23.     OrdList * next;
  24. };
  25.  
  26. int list_ord_add(OrdList *h, std::string i) {
  27.     OrdList *newNode = new OrdList;
  28.     newNode->val = i;
  29.     newNode->next = NULL;
  30.  
  31.     OrdList * c = h;
  32.     int cnt = 0;
  33.     while(c != NULL) {
  34.         cnt++;
  35.         if(c->next == NULL) {
  36.             c->next = newNode;
  37.             return cnt;
  38.         }
  39.         c = c->next;
  40.     }
  41. }
  42.  
  43.  
  44. int main() {
  45.    
  46.     int i = 0;
  47.     std::ifstream f("idents.txt");
  48.     std::vector<std::string> idents;
  49.     std::string l;
  50.     while (std::getline(f, l)) {
  51.         idents.push_back(l);
  52.         l.clear();
  53.     }
  54.  
  55.     //hash test
  56.     std::string hash_massiv[HASH_TABLE_SIZE];
  57.     int max_hash_op_count = 0;
  58.  
  59.     for(i = 0; i < idents.size(); i++) {
  60.         int h = hash_function(idents[i]) % idents.size();
  61.         int count = 0;
  62.         if (!hash_massiv[h].empty()) {
  63.             int idx = h;
  64.             while (!hash_massiv[idx].empty() && idx < HASH_TABLE_SIZE) {
  65.                 count += 1;
  66.                 idx += 1;
  67.             }
  68.             if (idx >= HASH_TABLE_SIZE) {
  69.                 std::cout << "Ошибка ввода в хэш массив" << std::endl;
  70.                 break;
  71.             }else {
  72.                 hash_massiv[idx] = idents[i];
  73.                 if (max_hash_op_count < count) max_hash_op_count = count;
  74.             }
  75.         } else {
  76.             hash_massiv[h] = idents[i];
  77.             if (max_hash_op_count < count) max_hash_op_count = count;
  78.         }
  79.     }
  80.  
  81.     std::cout << "Хэш таблица :" << std::endl;
  82.     std::cout << " Максимальное количество операций для вставки = " << max_hash_op_count << std::endl;
  83.  
  84.  
  85.  
  86.     //List test
  87.     OrdList * list = new OrdList();
  88.     std::vector<std::string> sidents = idents;
  89.     std::sort(sidents.begin(),sidents.end());
  90.     list->val = sidents[0];
  91.     int l_op = 0;
  92.     for(i = 1; i < sidents.size(); i++) {
  93.         int c = list_ord_add(list,sidents[i]);
  94.         if(c > l_op) l_op = c;
  95.     }
  96.    
  97.     std::cout << "Упорядоченный список :" << std::endl;
  98.     std::cout << " Максимальное количество операций для вставки = " << l_op << std::endl;
  99.  
  100.  
  101.  
  102.     // test poiska
  103.     //
  104.  
  105.     for(i = 0; i < idents.size(); i++) {
  106.         int cnt = 0;
  107.         int h = hash_function(idents[i]) % idents.size();
  108.         if (hash_massiv[h] != idents[i]) {
  109.             int idx = h;
  110.             while (hash_massiv[idx] != idents[i] && idx < HASH_TABLE_SIZE) {
  111.                 cnt += 1;
  112.                 idx += 1;
  113.             }
  114.             if (idx >= HASH_TABLE_SIZE) {
  115.                 std::cout << "Ошибка поиска в хэш массиве" << std::endl;
  116.                 break;
  117.             }else {
  118.                 if (max_hash_op_count < cnt) max_hash_op_count = cnt;
  119.             }
  120.         }
  121.     }
  122.  
  123.     std::cout << "Хэш таблица :" << std::endl;
  124.     std::cout << " Максимальное количество операций для поиска = " << max_hash_op_count << std::endl;
  125.  
  126.  
  127.     for(i = 0; i < idents.size(); i++) {
  128.         int cnt = 0;
  129.         OrdList * tmp = list;
  130.         while(tmp != NULL) {
  131.             cnt++;
  132.             if(tmp->val == idents[i]) {
  133.                 break;
  134.             }            
  135.             tmp = tmp->next;
  136.         }
  137.         if(cnt > l_op) l_op = cnt;
  138.     }
  139.    
  140.     std::cout << "Упорядоченный список :" << std::endl;
  141.     std::cout << " Максимальное количество операций для поиска = " << l_op << std::endl;
  142.  
  143.  
  144.     return 0;
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement