Sentry 監控 - Snuba 資料中臺架構(Data Model 簡介)
阿新 • • 發佈:2021-10-10
兩個有序序列的中位數(分治)
時間複雜度為log(n),首先基本思想因為兩個陣列已經排好,而且求中位數,所以比較兩個陣列的中間元素,要是相等,則因為都是中位數,這兩個數一定挨在一起,則整體的中位數必定是這個數,所以直接返回這個數。具體看下圖
所以基本思路就是這樣。為了保證遞迴的時候兩個子陣列長度相等,對mid可以這樣處理
mid1=(la+ua)/2;
mid2=(lb+ub+1)/2;
這樣的意思是若出現一個偶陣列一個奇陣列,得到的中間位置一樣。
因為保證兩陣列長度一樣,會出現陣列只有兩個的情況,如果按上面的方法會出現
造成死迴圈。所以進行處理
mid1=(la+ua)/2; mid2=(lb+ub)/2;
這樣處理的都是0位置元素
遞迴終止條件
當兩個陣列都只有一個元素的時候,中位數肯定就是小的那一個。
經過上述兩個元素陣列的處理,會出現一種型別的情況,a陣列有1個元素,b陣列有2個元素,意味著a的元素大於b的第一個元素,按中位數的定義,比較b的第二個元素和a,小的那個就是中位數。同理a,b調換。
完整程式碼如下:
#include<bits/stdc++.h> using namespace std; int a[100005]; int b[100005]; int binary(int la,int ua,int lb,int ub){ int mid1=(la+ua)/2,mid2=(lb+ub+1)/2; if(la==ua&&lb!=ub){ if(a[la]>b[ub]){ return b[ub]; } return a[la]; } if(la!=ua&&lb==ub){ if(a[ua]<b[ub]){ return a[ua]; } return b[ub]; } if(la==ua&&lb==ub){ if(a[la]>b[lb]){ return b[lb]; } return a[la]; } else{ if(la+1==ua&&lb+1==ub){ mid1=(la+ua)/2; mid2=(lb+ub)/2; } if(a[mid1]==b[mid2]){ return a[mid1]; } if(a[mid1]<b[mid2]){ return binary(mid1,ua,lb,mid2); } if(a[mid1]>b[mid2]){ return binary(la,mid1,mid2,ub); } } } int main(){ int n; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } for(int i=0;i<n;i++){ cin>>b[i]; } cout<<binary(0,n-1,0,n-1); }