分治法实验报告一

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 { @Override

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 { @Override

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 cmp = new MyComparatorX();

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 cmp = new MyComparatorY();

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;

}

相关文档
最新文档