分治法实验报告一
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
宁波工程学院电信学院计算机系
实验报告
课程名称:算法设计与分析实验项目:用分治法算法解
最接近点对问题
指导教师:崔迪
实验位置:软件工程实验室姓名:
班级:
学号:
日期: 2016/10/12
一、实验目的
通过上机实验,要求掌握分治法算法的问题描述、算法设计思想、程序设
计和算法复杂性分析等。
二、实验环境:
Eclipse
三、实验内容:用分治法解最接近点对问题
(1)问题描述
给定平面S上n个点,找其中的一对点,使得在n(n-1)/2 个点对中,该
点对的距离最小。
(2)算法设计思想
1. n较小时直接求 (n=2).
2.将S上的n个点分成大致相等的2个子集S1和S2
3.分别求S1和S2中的最接近点对
4.求一点在S1、另一点在S2中的最近点对
5.从上述三对点中找距离最近的一对.
(3)程序设计(程序清单及说明)
package closestpair;
import java.util.Arrays;
import parator;
import java.util.Random;
import java.util.Scanner;
//定义坐标点
class Point {
double x;
double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
}
// 根据x坐标排序
class MyComparatorX implements Comparator
public int compare(Point p1, Point p2) {
if (p1.x < p2.x) {
return -1;
} else if (p1.x > p2.x) {
return 1;
} else {
return 0;
}
}
}
// 根据Y坐标排序
class MyComparatorY implements Comparator
public int compare(Point p1, Point p2) {
if (p1.y < p2.y) {
return -1;
} else if (p1.y > p2.y) {
return 1;
} else {
return 0;
}
}
}
public class ClosestPair {
public static Point[] point = new Point[2];
public static double mindis = Double.POSITIVE_INFINITY;
public static void main(String[] args) {
do {
System.out.print("请输入坐标点数:");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
if (n <= 1) {
System.out.println("请输入大于1的点数!");
} else {
Random random = new Random();
Point point[] = new Point[n];
for (int i = 0; i < n; i++) {
point[i] = new Point(random.nextInt(100), random.nextInt(100));
System.out.println("(" + point[i].x + "," + point[i].y + ")");
}
Comparator
Arrays.sort(point, cmp);
closestUtil(point, point.length);
break;
}
} while (true);
System.out.println("最近点对是(" + point[0].x + "," + point[0].y + ")和" + "(" + point[1].x + "," + point[1].y + ")");
System.out.println("距离为" + mindis);
}
// 比教两数最小
public static double min(double x, double y) {
return (x < y) ? x : y;
}
// 求两点之间距离
public static double dist(Point p1, Point p2) {
return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));
}
// 暴力方法找到最小的点对
public static double minpair(Point P[], int n) {
double min = Double.POSITIVE_INFINITY;
for (int i = 0; i < n; ++i)
for (int j = i + 1; j < n; ++j)
if (dist(P[i], P[j]) < min) {
min = dist(P[i], P[j]);
if (min < mindis) {
mindis = min;
point[0] = P[i];
point[1] = P[j];
}
}
return min;
}
// 找出strip[] 数组中的最小点对
public static double stripClosest(Point strip[], int size, double d) { double min = d;
Comparator
Arrays.sort(strip, cmp);
for (int i = 0; i < size; ++i)
for (int j = i + 1; j < size && (strip[j].y - strip[i].y) < min; ++j)
if (dist(strip[i], strip[j]) < min) {
min = dist(strip[i], strip[j]);
if (min < mindis) {
mindis = min;
point[0] = strip[i];
point[1] = strip[j];
}
}
return min;
}