Advertisement
RobertDeMilo

YB4.13 Алгоритмы поиска

Nov 11th, 2023
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.83 KB | None | 0 0
  1. #include <iostream>
  2. #include <iterator>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <set>
  6. #include <map>
  7.  
  8. using namespace std;
  9.  
  10. template<typename It>
  11. void PrintRange(It range_begin, It range_end)
  12. {
  13.     for (auto it = range_begin; it != range_end; ++it)
  14.     {
  15.         cout << *it << " ";
  16.     }
  17. }
  18.  
  19. int main()
  20. {
  21.     // Перебор всех пробелов строки
  22.     // Выведем позиции всех пробелов строки s
  23.     // next(it) - более универсальный способ записать it + 1
  24.  
  25.     string s;
  26.     for (auto it = find(begin(s), end(s), ' '); it != end(s); it = find(next(it), end(s), ' '))
  27.     {
  28.         cout << it - begin(s) << " ";
  29.     }
  30.    
  31.     return 0;
  32. }
  33.  
  34. // Где будем искать:
  35.  
  36. // 1 Не отсортированный вектор (или строка)
  37. // 2 Отсортированный вектор
  38. // 3 Множество (или словарь)
  39.  
  40. // Что будем искать и проверять:
  41.  
  42. // 1 Проверить существование конкретного элемента
  43. // 2 Проверить существование и найти первый
  44. // 3 Найти первый элемент, больший или равный данному
  45. // 4 Найти первый элемент, больший данного
  46. // 5 Подсчитать кол-во элементов
  47. // 6 Перебрать все элементы, которые удовлетворяют данному условию или равны данному элементу
  48.  
  49. // Поиск в НЕотсортированном векторе
  50.  
  51. // find(begin(v), end(v), x);
  52. // (Найти элемент по какому-то условию в векторе, например, первый элемент меньший либо равный данному)
  53. // find_if(begin(v), end(v), [](int y){...});
  54. // count(begin(v), end(v), x);
  55. // Перебрать все можно с помощью цикла и find
  56.  
  57. // Поиск в отсортированном векторе
  58.  
  59. // binary_search (begin(v), end(v), x); Проверка на существование  
  60. // lower_bound(begin(v), end(v), x); Первый элемент, больший или равный данному
  61. // upper_bound(begin(v), end(v), x); Первый элемент, больший данного
  62. // equal_range(begin(v), end(v), x) == make_pair( lower_bound(...), upper_bound(...))
  63. // Диапазон элементов, равных данному
  64.  
  65.  
  66. // equal_range
  67. // Если элемент есть,
  68. // equal_range = [lower_bound,upper_bound) - диапазон всех вхождений
  69. //
  70. // Если элемента нет,
  71. // lower_bound == upper_bound - позиция, куда можно вставить элемент без нарушения порядка сортировки
  72. // (они будут равны)(и не всегда будут равны end) будут указывать на первый элемент больший данного
  73.  
  74. // Как найти кол-во вхождений
  75. // upper_bound - lower_bound
  76. //
  77. // Как перебрать все вхождения
  78. // Проитерировать ОТ lower_bound ДО upper_bound
  79.  
  80.  
  81. // Если каждый раз уменьшаем размер вдвое, то мы проделываем ровно столько операций какова степень 2ки массива
  82. // В какую степень нужно возвести 2 чтобы получить размер нашего диапазона
  83. // Двоичный логарифм log2(N)
  84. // Столько же работает поиск во множестве и словаре
  85.  
  86. // Поиск во множестве
  87.  
  88. // s.count(x);
  89. // s.find(x);
  90. // s.lower_bound(x);
  91. // s.upper_bound(x);
  92. // s.equal_range(x);
  93.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement