Advertisement
fenixD3

Untitled

Jul 26th, 2023
912
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.16 KB | None | 0 0
  1. template <typename TEdge, typename TFunc, typename... TArgs>
  2. TEdge left_bin_search(
  3.     TEdge lhs,
  4.     TEdge rhs,
  5.     TFunc&& check_func,
  6.     TArgs&&... extra_parameters)
  7. {
  8.     while (lhs != rhs)
  9.     {
  10.         auto mid = (rhs + lhs) / 2;
  11.         if (check_func(mid, std::forward<TArgs>(extra_parameters)...))
  12.         {
  13.             rhs = mid;
  14.         }
  15.         else
  16.         {
  17.             lhs = mid + 1;
  18.         }
  19.     }
  20.     return lhs;
  21. }
  22.  
  23. template <typename TEdge, typename TFunc, typename... TArgs>
  24. TEdge right_bin_search(
  25.     TEdge lhs,
  26.     TEdge rhs,
  27.     TFunc&& check_func,
  28.     TArgs&&... extra_parameters)
  29. {
  30.     while (lhs != rhs)
  31.     {
  32.         auto mid = (rhs + lhs + 1) / 2;
  33.         if (check_func(mid, std::forward<TArgs>(extra_parameters)...))
  34.         {
  35.             lhs = mid;
  36.         }
  37.         else
  38.         {
  39.             rhs = mid - 1;
  40.         }
  41.     }
  42.     return lhs;
  43. }
  44.  
  45. double find_median_of_parts(const std::vector<int>& part1, const std::vector<int>& part2)
  46. {
  47.     auto get_median = [](auto lhs, auto rhs) -> double
  48.     {
  49.         if (rhs == lhs)
  50.         {
  51.             return -1;
  52.         }
  53.  
  54.         auto mid = (rhs - lhs) / 2;
  55.         if ((rhs - lhs) % 2 == 1)
  56.         {
  57.             return *(lhs + mid);
  58.         }
  59.         return (*(lhs + mid) + *(lhs + mid - 1)) / 2.;
  60.     };
  61.  
  62.     auto check_lbs = [](size_t checking_offset, double median, auto begin)
  63.     {
  64.         return std::isgreater(*(begin + checking_offset), median);
  65.     };
  66.  
  67.     auto check_rbs = [](size_t checking_offset, double median, auto begin)
  68.     {
  69.         return std::islessequal(*(begin + checking_offset), median);
  70.     };
  71.  
  72.     auto Is_doubles_equal = [](double lhs, double rhs)
  73.     {
  74.         return fabs(lhs - rhs) <= std::numeric_limits<double>::epsilon();
  75.     };
  76.  
  77.     for (auto start_1 = part1.begin(), end_1 = part1.end(), start_2 = part2.begin(), end_2 = part2.end();;)
  78.     {
  79.         if (end_1 - start_1 == 1 && end_2 - start_2 == 1)
  80.         {
  81.             return (*start_1 + *start_2) / 2.;
  82.         }
  83.  
  84.         auto med_1 = get_median(start_1, end_1);
  85.         auto med_2 = get_median(start_2, end_2);
  86.  
  87.         if (Is_doubles_equal(med_1, -1))
  88.         {
  89.             return med_2;
  90.         }
  91.         if (Is_doubles_equal(med_2, -1))
  92.         {
  93.             return med_1;
  94.         }
  95.  
  96.         if (Is_doubles_equal(med_1, med_2))
  97.         {
  98.             return med_1;
  99.         }
  100.         if (std::isless(med_1, med_2))
  101.         {
  102.             start_1 += left_bin_search(0l, end_1 - start_1 - 1, check_lbs, med_1, start_1);
  103.             if (!check_lbs(start_1 - part1.begin(), med_1, part1.begin()))
  104.             {
  105.                 start_1 = end_1;
  106.             }
  107.  
  108.             end_2 = start_2 + right_bin_search(0l, end_2 - start_2 - 1, check_rbs, med_2, start_2) + 1;
  109.         }
  110.         else
  111.         {
  112.             start_2 += left_bin_search(0l, end_2 - start_2 - 1, check_lbs, med_2, start_2);
  113.             if (!check_lbs(start_2 - part2.begin(), med_2, part2.begin()))
  114.             {
  115.                 start_2 = end_2;
  116.             }
  117.  
  118.             end_1 = start_1 + right_bin_search(0l, end_1 - start_1 - 1, check_rbs, med_1, start_1) + 1;
  119.         }
  120.     }
  121. }
  122.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement