1. 程式人生 > >區間包括

區間包括

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(n log n)

第二步。源區間相鄰合並 O(n)

折半查找是否包括 O(log 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;
		}	
	};



區間包括