亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

從求逆序對和mergeSort談起

2019-11-08 01:35:28
字體:
來源:轉載
供稿:網友

先來談談mergeSort, 它是排序算法的一種,核心思想是:對一個數組nums[0,…,n],首先把它分成兩部分nums[0,…,mid]和nums[mid+1,…,n],首先兩個子數組是排好序的,只要對兩個子數組進行整合,然后就排好序了,但是我們可以在對數組整合的時候,作好多事情,。。。 根據主定理,T(0,n)=T(0,(n-1)/2)+T((n-1)/2,n)+C, 其中C是合并時的時間復雜度。只有當C遠小于O(n2)時,分治算法才比較有意義,將算法復雜度從O(n2)降低到O(nlogn)。

下面是mergeSort的實現:

class Solution {public: void combineMerge(vector<int>& nums,int s,int m,int e) { vector<int> cache(e-s+1,0); int i=s,j=m+1,r=0; while(i<=m||j<=e) { if(j>e||(i<=m&&nums[i]<nums[j])) cache[r++]=nums[i++]; else cache[r++]=nums[j++]; } copy(cache.begin(),cache.end(),nums.begin()+s); } void whileMergeSort(vector<int>& nums, int s, int e) { if(s>=e) return ; int mid=s+(e-s)/2; whileMergeSort(nums,s,mid);//前半數組排好序 whileMergeSort(nums,mid+1,e);//后半數組排好序 combineMerge(nums,s,mid,e); }};

這里的combineMerge函數的復雜度決定了這里分治算法的復雜度,因為其復雜度為O(n)。 其實,在combineMerge這個過程,可以解決許多和數組下標有關的問題。

void whileMergeSort(vector<int>& nums, int s,int e){ int mid=s+(e-s)/2; whileMergeSort(nums,s,mid); whileMergeSort(nums,mid+1,e); //這里可以做很多事情。。。 /* ...... */ combineMerge(nums,s,mid,e);}

可以做的事情一:Reverse Pairs

class Solution {public: int reversePairs(vector<int>& nums) { return whileMergeSort(nums,0,nums.size()-1); } int whileMergeSort(vector<int>& nums, int s, int e) { if(s>=e) return 0; int mid=s+(e-s)/2; int cnt=whileMergeSort(nums,s,mid)+whileMergeSort(nums,mid+1,e); /*i是前半數組的指針,j是后半組的指針;必定i<j 題目條件:i<j且nums[i]/2>nums[j] */ for(int i = s, j = mid+1; i<=mid; i++){ while(j<=e && nums[i]/2.0 > nums[j]) j++; //不滿足nums[i]/2>nums[j]時退出,滿足的有[mid+1,...,j-1] cnt += j-(mid+1); } combineMerge(nums,s,mid,e); return cnt; } void combineMerge(vector<int>& nums,int s,int m,int e) { vector<int> cache(e-s+1,0); int i=s,j=m+1,r=0; while(i<=m||j<=e) { if(j>e||(i<=m&&nums[i]<nums[j])) cache[r++]=nums[i++]; else cache[r++]=nums[j++]; } copy(cache.begin(),cache.end(),nums.begin()+s); }};

可以做的事情二:Count of Smaller Numbers After Self

class Solution {public: vector<int> countSmaller(vector<int>& nums) { int n=nums.size(); vector<int> smaller(n,0); if(!n) return smaller; vector<int> vec(n,0),copy(n,0); for(int i=0;i<n;i++) vec[i]=i; whileMergeSort(nums,vec,copy,0,n-1,smaller); return smaller; } void whileMergeSort(vector<int>& nums,vector<int>& vec,vector<int>& copy,int s,int e,vector<int>& smaller) { if(s>=e) return; int mid=s+(e-s)/2; whileMergeSort(nums,vec,copy,s,mid,smaller); whileMergeSort(nums,vec,copy,mid+1,e,smaller); /* 這里的題目要求是:對任意一個nums[i],滿足如下的條件:i<j且nums[i]>nums[j]計數。因此這里的排序,nums不變,只是記錄下標的vec改變。但必有vec[s,..,mid]<vec[mid+1,...,e] */ int i=s,j=mid+1,k=s; while(i<=mid||j<=e) { if(j==e+1||(i<=mid &&nums[vec[i]]<=nums[vec[j]])) { copy[k++]=vec[i];//用于對vec排序 smaller[vec[i]]+=j-mid-1;//下標vec[mid+1,...,j]的nums小于nums[vec[i]] i++; }else copy[k++]=vec[j++]; } for(i=s;i<=e;i++) vec[i]=copy[i]; } };

可以解決的事情三:Count of Range Sum

class Solution {public: int countRangeSum(vector<int>& nums, int lower, int upper) { int n=nums.size(); vector<long> sums(n+1,0); for(int i=0;i<n;i++) sums[i+1]=sums[i]+nums[i]; //這里nums[i,...j]的和:sums[j+1]-sums[i] //因此找到在[lower,upper]之間的rangeSum的條件可以看成: //i<=j且lower<=sums[j]-sums[i]<=upper return countMergesort(sums,0,n,lower,upper); } int countMergesort(vector<long>& sums,int s,int e,int low,int up) { if(e-s<1) return 0; int mid=s+(e-s)/2; int count=countMergesort(sums,s,mid,low,up)+countMergesort(sums,mid+1,e,low,up); /* 這里對sums進行排序,前半部分和后半部分的sums都是已排好序的; 這里要對前半部分的任意i,找到起始點k,sums[k]-sums[i]>=low,k之后到e都滿足〉=low; 找到結束點j,使sums[j]-sums[k]<=up,j之前到mid+1的點都滿足<=up. 兩者的重合:[k,...,j-1] */ int j,k,t;j=k=t=mid+1; vector<long> cache(e-s+1,0); for(int i=s,r=0;i<=mid;++i,++r) { while(k<=e&&sums[k]-sums[i]<low) k++; while(j<=e&&sums[j]-sums[i]<=up) j++; while(t<=e&&sums[t]<sums[i]) cache[r++]=sums[t++]; cache[r]=sums[i];//方便對sums排序 count+=j-k; } copy(cache.begin(),cache.begin()+t-s,sums.begin()+s); sort(sums.begin()+s,sums.begin()+e); return count; }};

總結:用Divide and Conquer方法可以解決許多類似的問題,一般能用此方法解決的問題,都可以用BST,BIT,segment Tree。。。 參考資料: 1. Mergesort solution 2. Very Short and Clear MergeSort & BST java Solutions 3. Share my solution


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av在线免费观看| 久久久国产精品亚洲一区| 国产精品亚洲аv天堂网| 中文字幕日韩高清| 日韩精品极品在线观看播放免费视频| 亚洲精品第一页| 亚洲第一区中文字幕| 亚洲精品美女久久久久| 最好看的2019年中文视频| 欧美日韩精品在线| 久久久91精品| 少妇激情综合网| 国产自产女人91一区在线观看| 国产精品网红直播| 日韩激情视频在线播放| 日韩大片免费观看视频播放| 最近2019中文字幕第三页视频| 久久精品美女视频网站| 日韩欧美aⅴ综合网站发布| 91av在线网站| 色伦专区97中文字幕| 伊人久久久久久久久久久| 欧美中文在线免费| 久久这里只有精品视频首页| 亚洲综合最新在线| 国产精品日韩在线一区| 欧美性受xxxx黑人猛交| 亚洲精品福利免费在线观看| 国产午夜精品理论片a级探花| 91在线无精精品一区二区| 国产福利视频一区| 亚洲毛茸茸少妇高潮呻吟| 国产精品久久久久国产a级| 欧美在线激情视频| 久久成人免费视频| 久久综合久久美利坚合众国| 午夜精品一区二区三区在线播放| 91av中文字幕| 欧美日韩亚洲天堂| 成人在线小视频| 亚洲激情第一页| 国产极品精品在线观看| 国产人妖伪娘一区91| 欧美成人精品三级在线观看| 日韩电影在线观看中文字幕| 日韩欧美成人免费视频| 中文字幕日韩欧美在线视频| 日本免费在线精品| 精品久久久久久久久久久| 亚洲mm色国产网站| 成人网在线免费看| 国产成人精品视频在线| 日韩经典中文字幕在线观看| 亚洲精品久久久久中文字幕欢迎你| 成人激情春色网| 久久在线观看视频| 成人h视频在线观看播放| 久久久久久中文| 国产不卡在线观看| 日本精品久久久久影院| 91精品国产色综合久久不卡98口| 亚洲欧洲av一区二区| 久久久精品视频在线观看| 国产精品第七十二页| 国产精品美女久久久久av超清| 日韩一区二区三区在线播放| 97在线视频免费看| 久久精品国产亚洲精品2020| 亚洲精品视频网上网址在线观看| 91精品国产免费久久久久久| 亚洲精品中文字幕女同| 操日韩av在线电影| 青青草成人在线| 日韩欧美一区二区三区久久| 欧美成人高清视频| 成人免费看黄网站| 97国产成人精品视频| 亚洲成人精品av| 97香蕉超级碰碰久久免费软件| 亚洲成人精品视频| 国产在线高清精品| 3344国产精品免费看| 深夜福利亚洲导航| 91久久嫩草影院一区二区| 国产精品美腿一区在线看| 国产精品入口日韩视频大尺度| 久久久久久久久久国产| 日韩欧美在线视频观看| 97精品一区二区视频在线观看| zzijzzij亚洲日本成熟少妇| 中文字幕欧美视频在线| 亚洲精品国产综合区久久久久久久| 人人澡人人澡人人看欧美| 91成人天堂久久成人| 亚洲肉体裸体xxxx137| 亚洲人成伊人成综合网久久久| 另类图片亚洲另类| 国产日本欧美在线观看| 中文字幕亚洲无线码在线一区| 精品国产一区二区三区久久狼黑人| 亚洲国产日韩一区| 国产精品视频yy9099| 亚洲欧美日韩中文视频| 精品福利一区二区| 国产精品白嫩初高中害羞小美女| 国产精品美乳在线观看| 中文字幕亚洲第一| 日韩精品免费一线在线观看| 日韩大陆毛片av| 欧美性xxxx极品hd满灌| 青草热久免费精品视频| 国产一区二区三区日韩欧美| 成人在线激情视频| 亚洲www永久成人夜色| 亚洲国产另类久久精品| 日韩av高清不卡| 伊人精品在线观看| 欧美国产日产韩国视频| 91精品在线看| 蜜臀久久99精品久久久无需会员| 亚洲精品国产精品国产自| 亚洲男人天堂手机在线| 成人免费在线视频网址| 夜夜嗨av色一区二区不卡| 国产在线高清精品| 亚州国产精品久久久| 亚洲第一精品夜夜躁人人躁| 伊是香蕉大人久久| 国产精品久久久久久av福利| 欧美极品少妇xxxxx| 4438全国亚洲精品在线观看视频| 中文日韩在线观看| 欧美电影在线免费观看网站| 少妇av一区二区三区| 51精品国产黑色丝袜高跟鞋| 中文亚洲视频在线| 亚洲欧美日本精品| 亚洲女人天堂成人av在线| 国产精品视频在线观看| 国产精品久久中文| 777午夜精品福利在线观看| 久久精品国产成人精品| 51精品在线观看| 亚洲少妇激情视频| 欧美日韩免费看| 精品一区二区三区四区在线| 日韩欧美国产视频| 欧美成人精品一区| 国产在线播放不卡| 亚洲精品不卡在线| 中文字幕一区二区精品| 亚洲免费av电影| 亚洲欧美国产精品va在线观看| 日韩中文字幕在线视频播放| 91精品视频在线免费观看| 欧美疯狂性受xxxxx另类| 亚洲精品欧美一区二区三区| 精品爽片免费看久久| 成人av.网址在线网站| 欧美激情xxxx| 亚洲精品美女在线观看| 色综合久久88| 2020久久国产精品| 亚洲欧美国产精品专区久久|