算法4课后习题: 1_2_1

1_2_1

编写一个Point2D的用例,从命令行接受一个整数N。在单位正方形中生成N个随机点,然后计算两点之间的最短距离。

package Practices;

import edu.princeton.cs.algs4.*;//算法4自带的方法库
import java.text.DecimalFormat;

public class point2D {
    public point2D() {
        StdOut.print("Please input a number to limit the size of the 2 points:");
        double n = StdIn.readDouble();
        double points[][] = new double[2][2];

        points = GetPoints(points, n);
        Display(points);

        double lenth = CalculatedLength(points);

        StdOut.println("\nThe length of the two points is "+lenth);
    }

    public double[][] GetPoints(double [][]points, double n) {
        //用于获得随机数,使用的算法4自带的方法库
        for(int i = 0; i < 2; i++) {
            for(int j = 0; j < 2; j++) {
                points[i][j] = StdRandom.uniform(0, n);
            }
        }
        return points;
    }

    public void Display(double [][]points) {
        //用于显示两个点
        DecimalFormat fo = new DecimalFormat("0.000");  //用于把两个点对进行三位有效数字的显示
        StdOut.print("The two points are:\n");
        for(int i = 0; i < 2; i++) {
            StdOut.print("("+fo.format(points[i][0])+","+fo.format(points[i][1])+")\t");
        }
    }

    public double CalculatedLength(double [][]points) {
        //用于计算两个点之间的长度并且返回长度值
        double len = (points[0][0] - points[0][1]) * (points[0][0] - points[0][1]);
        len += ((points[1][0] - points[1][1]) * (points[1][0] - points[1][1]));

        return Math.sqrt(len);
    }
}

似乎这个有点问题,只找了两个点,重新写一个;这里面用了算法4自带的方法库,想要知道怎么导入,之后专门写一个博客记录吧。上面的方法可以当作是一个基础版吧。下面准备进阶版(强行挽回错误)

#python
import math
import random

n = int(input('Please input the limit of this question:'))
a = [(n*random.random(), n*random.random()) for i in range(0,n)] #生成随机点
a.sort()
par = []
mi = float("inf")
def eudis(x, y):
    global par
    h = math.sqrt((x[0]-y[0])**2+(x[1]-y[1])**2)
    if h < mi:
        par = [] # 当发现最短距离时保存坐标
        par.append(x)
        par.append(y)
    return h

def combine(l1,l2,alpha):
    x = float("inf")
    mini = l1[-1][0] - alpha #alpha为当前最短距离 
    maxi = l1[-1][0] + alpha
    for i in l1:
        if (mini < i[0] < maxi):
            for j in l2:
                if ((mini < j[0] < maxi)and abs(i[1]-j[1]) < alpha):
                    x = min(x, eudis(i, j))
    return x

def divide(a):
    global mi #需要设置全局变量,才可以进行修改
    if (len(a) == 2):
        return eudis(a[0], a[1])
    if (len(a) < 2):
        return float("inf")
    else:
        i = int(len(a)/2)
        left = a[0:i]
        right = a[i:]
        s1 = divide(left)
        s2 = divide(right)
        s3 = combine(left, right, mi)
        s = min(s1,s2, s3)
        mi = min(s, mi)
        return mi

answer = divide(a)
print(answer, par)

Java 的二维分治法我还得再看看才能写出来,python 的 sort 真的太强了,直接少了分治的步骤,尽早完成 Java 和 C++ 的相关代码的编写。

你可能感兴趣的:(算法)