區間包括
阿新 • • 發佈:2017-05-06
cpp family code -s ·· 行處理 amp ogl cut
區間包括
個人信息:就讀於燕大本科軟件project專業 眼下大三;
本人博客:google搜索“cqs_2012”就可以;
個人愛好:酷愛數據結構和算法。希望將來從事算法工作為人民作出自己的貢獻;
編程語言:C++ ;
編程壞境:Windows 7 專業版 x64;
編程工具:vs2008;
制圖工具:office 2010 powerpoint;
硬件信息:7G-3 筆記本;
真言
題目夫妻沒有隔夜仇。
思路區間包括:給定一個源區間【x,y】和N個無序的目標區間【x1,y1】【x2,y2】【x3。y3】····【xn,yn】,推斷源區間【x,y】是不是在目標區間內。
先將源區間合並
折半查找是否包括 O(log n)第一步,源區間排序 O(n log n)
第二步。源區間相鄰合並 O(n)
算法
用c++代碼設計例如以下
第一步:排序
// 區間按x軸排序 void Qujian::Sort_Qujian_x(pair<int,int>* qujian,unsigned int length) { // 異常輸入 if(qujian == NULL || length == 0) { cout<<"異常輸入"<<endl; return void(0); } // 正常輸入 else { qsort(qujian,length,sizeof(pair<int,int>),min_to_max_x); return void(0); } };第二步:合並// 區間集合壓縮 pair<pair<int,int>*,unsigned int> Qujian::Qujian_To_CutDown(pair<int,int> *qujian,unsigned int length) { // 異常輸入 if(qujian == NULL || length == 0) { cout<<"異常輸入"<<endl; return make_pair((pair<int,int>*)0,0); } // 正常輸入 else{ // 開辟最浪費的空間 pair<int,int> * result = new pair<int,int>[length]; Sort_Qujian_x(qujian,length); unsigned int i,j; // 核心算法 // i 指向 result // j 指向 qujian i = 0; j = 0; result[i] = qujian[j]; j++; while( j < length ) { // 更新當前區間 if( qujian[j].first <= result[i].second && qujian[j].second > result[i].second) { result[i].second = qujian[j].second; j++; } // 插入新區間 else if( qujian[j].first > result[i].second ) { i++; result[i] = qujian[j]; j++; } } return make_pair(result,i+1); } };
第三步:折半查找是否包括// 區間集合是否包括某一區間 bool Qujian::Whether_including_Qujian(pair<int,int> * qujian,unsigned int length,pair<int,int> a) { // 對區間排序 Sort_Qujian_x(qujian,length); // 合並區間 pair<pair<int,int>*,unsigned int> newQujian = Qujian_To_CutDown(qujian,length); Show_Qujian(newQujian.first,newQujian.second); // 折半搜索區間 unsigned int i = 0,j = newQujian.second - 1,center = (j-i)/2+i; while(i<j) { center=(j-i)/2+i; if( ((newQujian.first)[center]).first > a.first) { j = center - 1; } else { i = center + 1; } } // 對折半結果進行處理 if( i==j ) { // 退到合適區間 if( ((newQujian.first)[i]).first > a.first ) { if(i == 0) return false; else i--; } // 進行檢查操作 if(((newQujian.first)[i]).second >= a.second ) return true; else return false; } else { i = j; // 進行檢查操作 if(((newQujian.first)[i]).second >= a.second ) return true; else return false; } };
區間包括