Advertisement
alisadafi

Median-D&C

Nov 17th, 2023 (edited)
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.87 KB | None | 0 0
  1. from typing import List, Tuple
  2. import math
  3.  
  4.  
  5.  
  6. def get_mid_members_of_even_length_array(arr: List[int], l: int, h: int) -> Tuple[int, int]:
  7.     return arr[(l + h) // 2], arr[(l + h) // 2 + 1]
  8.  
  9.  
  10. def get_median_of_sorted_array(arr: List[int], l: int, h: int) -> float:
  11.     size = h - l + 1
  12.  
  13.     if size % 2 == 0:
  14.         return sum(get_mid_members_of_even_length_array(arr, l, h)) / 2
  15.     else:
  16.         return float(arr[(l + h) // 2])
  17.  
  18.  
  19. def find_median_of_sorted_arrays(arr1: List[int], arr2: List[int], l1: int, h1: int, l2: int, h2: int) -> float:
  20.     size = h1 - l1 + 1
  21.  
  22.     if size == 0:
  23.         return 0
  24.  
  25.     if size == 1:
  26.         return (arr1[l1] + arr2[l2]) / 2
  27.  
  28.     if size == 2:
  29.         return (max(arr1[l1], arr2[l2]) + min(arr1[h1], arr2[h2])) / 2
  30.  
  31.  
  32.     if size % 2 == 0:
  33.         mid_arr1_1, mid_arr1_2 = get_mid_members_of_even_length_array(arr1, l1, h1)
  34.         mid_arr2_1, mid_arr2_2 = get_mid_members_of_even_length_array(arr2, l2, h2)
  35.  
  36.  
  37.         if mid_arr1_1 >= mid_arr2_1 and mid_arr1_2 <= mid_arr2_2:
  38.             return get_median_of_sorted_array(arr1, l1, h1)
  39.  
  40.         if mid_arr1_1 <= mid_arr2_1 and mid_arr1_2 >= mid_arr2_2:
  41.             return get_median_of_sorted_array(arr2, l2, h2)
  42.  
  43.     med_arr1 = get_median_of_sorted_array(arr1, l1, h1)
  44.     med_arr2 = get_median_of_sorted_array(arr2, l2, h2)
  45.  
  46.     if med_arr1 == med_arr2:
  47.         return med_arr1
  48.    
  49.     if med_arr1 < med_arr2:
  50.         return find_median_of_sorted_arrays(arr1, arr2, math.ceil((l1 + h1) / 2), h1, l2, (l2 + h2) // 2)
  51.     return find_median_of_sorted_arrays(arr1, arr2, l1, (l1 + h1) // 2, math.ceil((l2 + h2) / 2), h2)
  52.  
  53.  
  54.  
  55. def main():
  56.     n = int(input())
  57.     arr1 = list(map(int, input().split()))
  58.     arr2 = list(map(int, input().split()))
  59.     ans = find_median_of_sorted_arrays(arr1, arr2, 0, n - 1, 0, n - 1)
  60.     print(ans)
  61.  
  62. if __name__ == "__main__":
  63.     main()
Tags: D&C
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement