ORACLE 11G 单实例 磁盘文件系统 DG 归档日志删除脚本 基于RED HAT LINUX 5.3 X86 64BIT

时间:2014-05-07 11:29:48   收藏:0   阅读:519

变形了的最近点对,关键在于计算距离的时候,如果同类点的话,直接判定为无穷大即可。

其他闲话:

(1)因为一些原因,被迫暂时用回C++.

(2)好久没刷题,忘记了数组一开始要开最大,多次new和delete,导致超时。

(3) 感觉算法导论的最近点对没有考虑到有多个点都在一条vertical line上的情形。


#include<iostream>
#include<fstream>
#include<algorithm>
#include<math.h>
#include<vector>
using namespace std;


enum PointTag{Agent=0, Station=1};

const double NaN = (double)(1<<31 - 1);


struct Point{
	double x;
	double y;
	PointTag tag;

	Point(double tx, double ty, PointTag ttag)
	{
		x = tx;
		y = ty;
		tag = ttag;
	}

	Point()
	{
		x = 0;
		y = 0;
	}
};

Point pointSet[2 * 100000 + 2];
Point pointY[2 * 100000 + 2];
Point pointTrip[2 * 100000 + 2];



double Min(double a, double b)
{
	if (a < b)
		return a;
	return b;
}

bool CompX(Point a, Point b){
	return a.x < b.x;
}

bool CompY(Point a, Point b){
	return a.y < b.y;
}

double Distance_Tag(Point a, Point b){
	if (a.tag == b.tag){
		return NaN;
	}

	double distance = sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));

	return distance;
}

double ClosestPair_Bru(int left, int right)
{
	if (right - left < 1)
		return NaN;

	double minDis = NaN;

	for (int i = left; i < right-1; i++){
		for (int j = i+1; j < right; j++){
			double dis = Distance_Tag(pointSet[i], pointSet[j]);

			if (dis < minDis)
				minDis = dis;
		}
	}

	return minDis;
}

double ClosestPair_Rec( int left, int right)
{
	int N = right - left + 1;
	
	if (N <= 3)
	{
		return ClosestPair_Bru(left,right);
	}

	//1: Find the middle index of station
	int mid = (right + left) >> 1;
	double midX = pointSet[mid].x;

	double combineMin = NaN;

	//left
	double leftMin = ClosestPair_Rec(left, mid);

	//right
	double rightMin = ClosestPair_Rec(mid+1, right);

	//The minimal distance from the either side
	combineMin = Min(leftMin, rightMin);
	
	

	//Search the points within the strip
	int count = 0;
	for (int i = left; i <= right; i++)
	{
		if (abs(pointSet[i].x - midX) <= combineMin)
		{
			pointTrip[count++] = pointSet[i];
		}
	}

	sort(pointTrip, pointTrip + count, CompY);

	//Search the minimal distance between the pointTrip
	for (int i = 0; i < count-1; i++){
		for (int j = i + 1; j< count && j < i+ 8 ; j++){
			double dis = Distance_Tag(pointTrip[i], pointTrip[j]);
			if (dis < combineMin)
				combineMin = dis;
		}
	}

	return combineMin;
}

int main()
{
	int T;
	scanf("%d", &T);

	for (int k = 0; k < T; k++){
		int N;
		scanf("%d", &N);
		

		//the station
		for (int i = 0; i < N; i++){
			double x;
			double y;
			scanf("%lf", &x);
			scanf("%lf", &y);
			pointSet[i] = Point(x,y, Station);
			//pointY[i] = Point(x, y, Station);
		}
		//the agent
		for (int i = 0; i < N; i++){
			double x;
			double y;
			scanf("%lf", &x);
			scanf("%lf", &y);
			pointSet[i+N] = Point(x, y, Agent);
			//pointY[i+N] = Point(x, y, Agent);
		}

		//get the sortex X point
		sort(pointSet, pointSet + 2*N, CompX);
		//get the sorted Y point
		//sort(pointY, pointY + 2*N, CompY);

		double mindis = ClosestPair_Rec(0, 2*N);


		printf("%.3f\n", mindis);
	}
}


ORACLE 11G 单实例 磁盘文件系统 DG 归档日志删除脚本 基于RED HAT LINUX 5.3 X86 64BIT,布布扣,bubuko.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!