算法學習——分治算法(二)

問題一:求不被支配的點

對於平面上的兩個點p1=(x1, y1)和p2=(x2,y2),如果x1<=x2且y1<=y2,則p2支配p1,給定平面上的n個點,請設計算法求其中沒有被任何其他點支配的點

問題思路

  • 將平面上的點按照橫座標的平均值mid進行劃分(也可以使用中位數,這樣時間複雜度更穩定),橫座標小於等於mid的點,放到points_left中,橫座標大於mid的點,放到points_right中
  • 處理子問題points_right,得到set_right
  • 找到points_right中縱座標的最大值max_y
  • 遍歷points_left中所有點,將set_left中縱座標小於等於max_y的點刪去
  • 返回set_left和set_right的並
import java.util.HashSet;
import java.util.Set;

public class FindPointSet {
	public Set<Point> pointSet = new HashSet<Point>();
	public void Find(Set<Point> points) {
		if (points == null) return;
		else if (points.size() <= 1) {
			pointSet.addAll(points);
			return ;
		}
		int numX = 0;
		for (Point point : points) {
			numX += point.getX();
		}
		//System.out.println(points.size());
		int mid = numX / points.size();
		Set<Point> pointsLeft = new HashSet<Point>();
		Set<Point> pointsRight = new HashSet<Point>();
		
		for (Point point : points) {
			if (point.getX() <= mid) pointsLeft.add(point);
			else pointsRight.add(point);
		}
		Find(pointsRight);
		//假定這是比最小的縱座標還小的一個數
		int maxY = -1;
		for (Point point : pointsRight) {
			if(point.getY() > maxY)
				maxY = point.getY();
		}
		for (Point point : pointsLeft) {
			if (point.getY() > maxY)
				pointSet.add(point);
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Point point1 = new Point(1, 2);
		Point point2 = new Point(3, 4);
		Point point3 = new Point(6, 0);
		Point point4 = new Point(2, 8);
		Point point5 = new Point(4, 6);
		Point point6 = new Point(5, 5);
		
		Set<Point> points = new HashSet<Point>();
		points.add(point1);
		points.add(point2);
		points.add(point3);
		points.add(point4);
		points.add(point5);
		points.add(point6);
		FindPointSet findPointSet = new FindPointSet();
		findPointSet.Find(points);
		for (Point point : findPointSet.pointSet) {
			System.out.println(point);
		}
	}

}


class Point{
    private int x, y;

    Point(int x, int y){
        this.x = x;
        this.y = y;
    }
    int getX(){
        return this.x;
    }
    int getY(){
        return this.y;
    }
    @Override
    public String toString() {
    	String string = "(" + this.x + "," + this.y +")" + "\n";
    	return string;
    }
}

時間複雜度分析

T(n)=T(n/2)+θ(n)T(n) = T(n / 2) + \theta(n)
由Master定理得,時間複雜度是O(n)O(n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章