9.7数学与概率(四)——在二维平面上,有一些点,请找出经过点数最多的那条线
来源:互联网 发布:小学生杀手软件 编辑:程序博客网 时间:2024/04/29 14:10
/**
* 功能:在二维平面上,有一些点,请找出经过点数最多的那条线。
/** * 思路:在任意两点之间画一条无线长的直线,用散列表追踪那条直线出现的次数最多。时间复杂度O(N*N) * 注意: * 1)用斜率和y轴截距来确定是否是同一条直线。 * 2)浮点数不一定能用二进制数准确表示,因此检查两个浮点数的差值是否在某个极小值(epsilon)内。 * 3)对于散列表而言,斜率相等,未必散列值相同。因此,将斜率减去一个极小值,并以得到的结果flooredSlope作为散列键。 * 4)取得所有可能相等的直线,搜索三个位置:flooredSlope,flooredSlope-epsilon,flooredSlope+epsilon。 * @param points * @return */public static MyLine1 findBestLine(GraphPoint[] points){MyLine1 bestLine=null;int bestCount=0;HashMap<Double,ArrayList<MyLine1>> lineBySlope=new HashMap<Double, ArrayList<MyLine1>>();for(int i=0;i<points.length-1;i++){for(int j=i+1;j<points.length;j++){MyLine1 line=new MyLine1(points[i],points[j]);insertLine(lineBySlope,line);int count=countEquivalentLines(lineBySlope,line);if(count>bestCount){bestCount=count;bestLine=line;}}}return bestLine;}private static int countEquivalentLines(HashMap<Double, ArrayList<MyLine1>> lineBySlope, MyLine1 line) {double key=line.floorToNearestEpsilon(line.slope);double eps=line.epsilon;int count=countEquivalentLines(lineBySlope.get(key), line)+countEquivalentLines(lineBySlope.get(key-eps), line)+countEquivalentLines(lineBySlope.get(key+eps), line);return count;}public static int countEquivalentLines(ArrayList<MyLine1> lines,MyLine1 line){if(lines==null)return 0;int count=0;for(MyLine1 paralleLine:lines){if(paralleLine==line)count++;}return count;}private static void insertLine(HashMap<Double, ArrayList<MyLine1>> lineBySlope, MyLine1 line) {ArrayList<MyLine1> lines=null;double key=line.floorToNearestEpsilon(line.slope);if(!lineBySlope.containsKey(key)){lines=new ArrayList<MyLine1>();lineBySlope.put(key, lines);}else{lines=lineBySlope.get(key);}lines.add(line);//注意此处添加的用法}class MyLine1{public static double epsilon=0.0001;public double slope,intercept;public boolean infiniteSlope=false;public MyLine1(GraphPoint p,GraphPoint q){if(Math.abs(p.x-q.x)>epsilon){//两个点的x坐标不同slope=(p.y-q.y)/(p.x-q.x);//斜率intercept=p.y-slope*p.x;//y轴截距}else{infiniteSlope=true;intercept=p.x;//x轴截距}}public double floorToNearestEpsilon(double d){int r=(int) (d/epsilon);//使原d保留小数位后的4位(epsilon=0.0001)return ((double)r)*epsilon;}public boolean isEquivalent(MyLine1 line){if((slope==line.slope)&&(intercept==line.intercept)&&(infiniteSlope==line.infiniteSlope))return true;return false;}public boolean isEquivalent(double a,double b){return Math.abs(a-b)<epsilon;}}class GraphPoint{int x;int y;public GraphPoint(int x,int y){this.x=x;this.y=y;}}
*/
0 0
- 9.7数学与概率(四)——在二维平面上,有一些点,请找出经过点数最多的那条线
- 在二维平面上,有一些点。请找出经过点数最多的那条线
- 程序员面试金典: 9.7数学与概率 7.6在二维平面上,有一些点,请找出经过点最多的那条线
- 9.7数学与概率(三)——在二维平面上,有两个正方形,请找出一条直线,能够将这两个正方形对半分
- 二位平面上,经过点数最多的线
- 求二维平面上共线最多的点数
- java 平面上在一条直线上最多的点数
- 二维平面上最多有多少个点在同一条直线上
- 在平面上找出横坐标最小的点
- 求一条直线经过一个直角坐标系里m个点最多点的点数
- 二维平面上点与线段关系的判定
- Max Points on a line ,在二维平面寻找共线的最多点
- 寻找平面内共线点数最多的直线和点数
- POJ 1118+2606+2780 (求平面上同一条直线的最多点数)
- UVALive 3695 Distant Galaxy 用矩阵的边覆盖二维平面上最多的点 科学的枚举
- 题目1548:平面上的点:直线穿过最多点(不应该这样AC吗?)
- 在一个二维平面上找到离固定点最近的k个点位置
- 算法导论——二维平面上的最邻近点对
- 计算递归算法时间复杂度通用公式
- HBase+ZooKeeper+Hadoop2.6.0的ResourceManager HA集群高可用配置 [复制链接] 韩克拉玛寒 韩克拉玛寒 当前离线 积分2439. 窥视卡 雷达
- log4j2 详细讲解
- 浅析云计算的六种架构
- 取消与关闭
- 9.7数学与概率(四)——在二维平面上,有一些点,请找出经过点数最多的那条线
- poj3487 & hdu1914 The Stable Marriage Problem 稳定婚姻系统
- 在Android studio中进行NDK开发
- View类的XML属性
- 9.7数学与概率(五)——功能:有些数的素数因子只有3、5、7,找出其中第k个数
- HEVC码率控制算法研究与HM相应代码分析(二)——新的码率控制模型
- SequenceFile类
- Oracle 实现跨库查询
- 最简单简洁高效的Json数据解析