selebry

9.2

May 4th, 2022 (edited)
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.45 KB | None | 0 0
  1. // SiAOD 9.1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3.  
  4. #include <iostream>
  5. #include <vector>
  6. #include <string>
  7. #include <fstream>
  8. #include <cstdlib>
  9. #include <ctime>
  10. #include <cmath>
  11. #include <chrono>
  12. #include <numeric>
  13. #include <windows.h>
  14. #include <algorithm>
  15. #define UI unsigned int
  16. #define byte unsigned char
  17. using namespace std;
  18. //Задание 1. Разработать программу поиска записи по ключу в таблице записей с применение двух алгоритмов линейного поиска
  19. //1.    Таблица содержит записи, структура которых определена вариантом.Ключи уникальны в пределах таблицы.
  20. //2.    Разработать функцию линейного поиска(метод грубой силы).
  21. //3.    Разработать функцию поиска с барьером.
  22. //4.    Провести практическую оценку времени выполнения алгоритмов на таблицах объемом 100, 1000, 10 000 записей.
  23. //5.    Составить таблицу с указанием : времени выполнения алгоритма, его фактическую и теоретическую вычислительную сложность.
  24. //6.    Сделать выводы об эффективности алгоритмов.
  25. //Регистрация земельного участка в СНТ: кадастровый номер – семизначное число, адрес СНТ
  26. //Horticultural non-profit partnerships - Садоводческие некоммерческие товарищества (СНТ)
  27. class Stopwatch {
  28.     chrono::steady_clock::time_point point;
  29.     chrono::nanoseconds dim;
  30. public:
  31.     void start_countdown() {
  32.         point = chrono::steady_clock::now();
  33.     }
  34.     double get_milliseconds() {
  35.         dim = chrono::duration_cast<chrono::nanoseconds>(chrono::steady_clock::now() - point);
  36.         return (double)dim.count() / 1'000'000;
  37.     }
  38. };
  39. string utf8_to_cp1251(const char* str) {
  40.     std::string res;
  41.     WCHAR* ures = NULL;
  42.     char* cres = NULL;
  43.     int result_u = MultiByteToWideChar(CP_UTF8, 0, str, -1, 0, 0);
  44.     if (result_u != 0)
  45.     {
  46.         ures = new WCHAR[result_u];
  47.         if (MultiByteToWideChar(CP_UTF8, 0, str, -1, ures, result_u))
  48.         {
  49.             int result_c = WideCharToMultiByte(1251, 0, ures, -1, 0, 0, 0, 0);
  50.             if (result_c != 0)
  51.             {
  52.                 cres = new char[result_c];
  53.                 if (WideCharToMultiByte(1251, 0, ures, -1, cres, result_c, 0, 0))
  54.                 {
  55.                     res = cres;
  56.                 }
  57.             }
  58.         }
  59.     }
  60.  
  61.     delete[] ures;
  62.     delete[] cres;
  63.  
  64.     return res;
  65. }
  66.  
  67. class TableWith2H {
  68.     struct HNPrecord {
  69.         UI cadastral_number;
  70.         string adress;
  71.     };
  72.     vector<HNPrecord> storage;
  73.     vector<HNPrecord>::iterator it;
  74.     vector<string> rand_adresses;
  75.     vector<bool> erastophen_res;
  76.     UI prime;
  77.  //   size_t curr_size;
  78.     size_t inline _1hash(UI value) {
  79.         return value % storage.size();
  80.     }
  81.     size_t inline _2hash(UI value) {
  82.         return prime - (value % prime);
  83.     }
  84. public:
  85.     TableWith2H() {
  86.         fill_adresses();
  87.     }
  88.     TableWith2H(size_t size) {
  89.         fill_adresses();
  90.         storage.resize(size);
  91.         find_prime();
  92.     }
  93.     TableWith2H(UI cadastral_number, string adress) {
  94.         storage.push_back(convert_2_HNPrecord(cadastral_number, adress));
  95.         fill_adresses();
  96.     }
  97.     void fill_adresses() {
  98.         fstream f("SNT.txt", ios::in);
  99.         string t;
  100.         while (getline(f, t)) {
  101.             rand_adresses.push_back(utf8_to_cp1251(t.c_str()));
  102.         }
  103.         f.close();
  104.     }
  105.     vector<bool> fill_erastrophen(int n) {
  106.         vector<bool> prime(n + 1, true);
  107.         prime[0] = prime[1] = false;
  108.         for (int i = 2; i * i <= n; ++i)  
  109.             if (prime[i])
  110.                 for (int j = i * i; j <= n; j += i)
  111.                     prime[j] = false;
  112.         return prime;
  113.     }
  114.     UI find_prime() {
  115.         if (erastophen_res.empty()) erastophen_res = fill_erastrophen(1'000'000);
  116.         for (int i = storage.size() - 1; i >= 2; i--)
  117.             if (erastophen_res[i]) { prime = i; return i; }
  118.         return 0;
  119.     }
  120.     void keyboard_init(size_t size) {
  121.         storage.clear();
  122.         //        curr_size = 0;
  123.         storage.resize(size, convert_2_HNPrecord(1, ""));
  124.         find_prime();
  125.         for (int i = 0; i < storage.size(); i++) {
  126.             UI key;
  127.             string t_s;
  128.             cout << "Введите кадастровый номер: ";
  129.             cin >> key;
  130.             cout << "Введите адрес: ";
  131.             cin.ignore();
  132.             getline(cin, t_s);
  133.             insert(key,t_s);
  134.         }
  135.     }
  136.     void insert(UI cadastral_number, string adress) {
  137.         HNPrecord h = convert_2_HNPrecord(cadastral_number, adress);
  138.         if (h.cadastral_number == 0 || h.cadastral_number == 1) {
  139.             cerr << "0 и 1 не подходят под описание ключа и являются удаленными либо подготовленными к инициализации элементами\n";
  140.             return;
  141.         }
  142.         else if (!get(cadastral_number).empty()) {
  143.             cerr << ("Такой ключ уже есть в таблице\n");
  144.             return;
  145.         }
  146.         int index = _1hash(h.cadastral_number);
  147.         while (storage[index].cadastral_number != 1) {
  148.             if (storage[index].cadastral_number==0)
  149.                 break;                                  
  150.             index = (index + _2hash(h.cadastral_number)) % storage.size();
  151.         }
  152.         storage[index] = h;
  153.         //curr_size++;
  154.     }
  155.     string get(UI key) {
  156.         int index = _1hash(key);
  157.         if (storage[index].cadastral_number == key)          
  158.                 return storage[index].adress;
  159.         index = (index + _2hash(key)) % storage.size();
  160.         if (storage[index].cadastral_number == key)          
  161.                 return storage[index].adress;
  162.         return string();
  163.     }
  164.     /*bool inline isFull() {
  165.         return (curr_size == storage.size());
  166.     }*/
  167.     void rand_init(size_t size) {
  168.         storage.clear();
  169. //        curr_size = 0;
  170.         storage.resize(size,convert_2_HNPrecord(1,""));
  171.         find_prime();
  172.         vector<UI> t_vec(size);
  173.         iota(t_vec.begin(), t_vec.end(), 1000000);
  174.         random_shuffle(t_vec.begin(), t_vec.end());
  175.         for (int i = 0; i < storage.size(); i++)
  176.             insert(t_vec[i], rand_adresses[rand() % rand_adresses.size()]);
  177.         t_vec.clear();
  178.     }
  179.     void print_table() {
  180.         for (int i = 0; i < storage.size(); i++) {
  181.             cout << "Key: " << storage[i].cadastral_number << " adress:" << storage[i].adress << '\n';
  182.         }
  183.     }
  184.     HNPrecord convert_2_HNPrecord(UI cadastral_number, string adress) {
  185.         return HNPrecord{ cadastral_number , adress };
  186.     }
  187. };
  188.  
  189. int main()
  190. {
  191.     SetConsoleCP(1251);
  192.     SetConsoleOutputCP(1251);
  193.     srand(time(NULL));
  194.     TableWith2H t;
  195.     Stopwatch s;
  196.     int answer1 = 100;
  197.     while (answer1 != 0) {
  198.         system("cls");
  199.         cout << "Лабораторная работа №8 ИКБО-33-21 Резван М.Б. Вариант 21" << endl << endl;
  200.         cout << "Задание 21" << endl;
  201.         cout << "Условия задачи 1:\n\n\n.";
  202.         cout << "Меню\n";
  203.         cout << "1) Заполнить таблицу рандомными (случайными) значениями\n";
  204.         cout << "2) Заполнить таблицу с клавиатуры\n";
  205.         cout << "3) Поиск\n";
  206.         cout << "4) Вывести таблицу\n";
  207.         cout << "0) Выход\n";
  208.         cout << "Ваш выбор: ";
  209.         cin >> answer1;
  210.         system("cls");
  211.         cout << "Лабораторная работа №8 ИКБО-33-21 Резван М.Б. Вариант 21" << endl << endl;
  212.         switch (answer1)
  213.         {
  214.         case 1:
  215.             cout << "Введите размер таблицы: ";
  216.             cin >> answer1;
  217.             s.start_countdown();
  218.             t.rand_init(answer1);
  219.             cout << "Время работы: " << s.get_milliseconds() << '\n';
  220.             system("pause");
  221.  
  222.             break;
  223.         case 2:
  224.             cout << "Введите размер таблицы: ";
  225.             cin >> answer1;
  226.             t.keyboard_init(answer1);
  227.         system("pause");
  228.         break;
  229.  
  230.         case 3:
  231.             UI key;
  232.             cout << "Введите ключ: ";
  233.             cin >> key;
  234.             s.start_countdown();
  235.             cout << "Результат поиска (брут): " << t.get(key) << "\n";
  236.             cout << "Время работы: " << s.get_milliseconds() << '\n';
  237.             system("pause");
  238.             break;
  239.         case 4:
  240.             t.print_table();
  241.             system("pause");
  242.             break;
  243.         }
  244.     }
  245.  
  246. }
  247.  
  248.  
  249. ///////
  250.  
  251.     //size_t _1hash(UI key)
  252.     //{
  253.     //    return (key % storage.size());
  254.     //}
  255.     //size_t _2hash(UI key)
  256.     //{
  257.     //    return (prime - (key % prime));
  258.     //}
  259.     //bool isFull() {
  260.     //    return ()
  261.     //}
  262.     //void insertHash(int key)
  263.  
  264.     //{
  265.  
  266.     //    // если хеш-таблица заполнена
  267.  
  268.     //    if (isFull())
  269.  
  270.     //        return;
  271.  
  272.  
  273.  
  274.     //    // получить индекс из первого хэша
  275.  
  276.     //    int index = hash1(key);
  277.  
  278.  
  279.  
  280.     //    // если происходит столкновение
  281.  
  282.     //    if (hashTable[index] != -1)
  283.  
  284.     //    {
  285.  
  286.     //        // получаем index2 из второго хэша
  287.  
  288.     //        int index2 = hash2(key);
  289.  
  290.     //        int i = 1;
  291.  
  292.     //        while (1)
  293.  
  294.     //        {
  295.  
  296.     //            // получить новый индекс
  297.  
  298.     //            int newIndex = (index + i * index2) %
  299.  
  300.     //                TABLE_SIZE;
  301.  
  302.  
  303.  
  304.     //            // если нет столкновения, сохраняем
  305.  
  306.     //            // ключ
  307.  
  308.     //            if (hashTable[newIndex] == -1)
  309.  
  310.     //            {
  311.  
  312.     //                hashTable[newIndex] = key;
  313.  
  314.     //                break;
  315.  
  316.     //            }
  317.  
  318.     //            i++;
  319.  
  320.     //        }
  321.  
  322.     //    }
  323.  
  324.  
  325.  
  326.     //    // если не происходит столкновения
  327.  
  328.     //    else
  329.  
  330.     //        hashTable[index] = key;
  331.  
  332.     //    curr_size++;
  333.  
  334.     //}
  335.  
  336.  
  337.  
  338.  
  339. // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
  340. // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
  341.  
  342. // Советы по началу работы
  343. //   1. В окне обозревателя решений можно добавлять файлы и управлять ими.
  344. //   2. В окне Team Explorer можно подключиться к системе управления версиями.
  345. //   3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
  346. //   4. В окне "Список ошибок" можно просматривать ошибки.
  347. //   5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
  348. //   6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
  349.  
  350.  
  351. // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
  352. // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
  353.  
  354. // Советы по началу работы
  355. //   1. В окне обозревателя решений можно добавлять файлы и управлять ими.
  356. //   2. В окне Team Explorer можно подключиться к системе управления версиями.
  357. //   3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
  358. //   4. В окне "Список ошибок" можно просматривать ошибки.
  359. //   5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
  360. //   6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
  361.  
Add Comment
Please, Sign In to add comment