`
zy3381
  • 浏览: 157642 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

一维空间最近点对问题

 
阅读更多
/**
 * 一维空间最近点对问题
 * @author zy
 *
 */
public class CPair1
{
	static class CPair
	{
		int dist;
		int d1,d2;
		public CPair(int dist, int d1, int d2)
		{
			this.dist = dist;
			this.d1 = d1;
			this.d2 = d2;
		}
		public String toString()
		{
			return dist + "  " + d1 + "  " + d2;
		}
	}
	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		int[] S = {1,3,4,6,8};
		System.out.println(cpair1(S, S.length));
	}
	
	public static CPair cpair1(int[] S, int n)
	{
		if(n<2) return new CPair1.CPair(Integer.MAX_VALUE, 0, 0);
		
		//获取S中的最大值
		int m1 = max(S, 0, n);
		
		//后去S中的最小值
		int m2 = min(S, 0, n);
		
		//取得中位数
		int m = (m1+m2)/2;	//中位数
		
		//记录两个分组的长度
		int j=0,k=0;
		
		//根据中位数来分组(最长不会超过n)
		int[] s1 = new int[n];
		int[] s2 = new int[n];
		//s1全部小于=m,s2全部大于m
		for (int i = 0; i < n; i++)
		{
			if(S[i]<=m)
			{
				s1[j]=S[i];
				j++;
			}
			else
			{
				s2[k] = S[i];
				k++;
			}
		}
		
		//递归求解S1,S2
		CPair d1 = cpair1(s1, j);
		CPair d2 = cpair1(s2, k);
		
		//找出S1中的最大值和S2中的最小值
		int p = max(s1, 0, j);
		int q = min(s2, 0, k);
		
		//比较S1中的最小距离和S2中的最小距离,以及S1中最大的数字和S2中最小的数字的距离,取三者的最小值
		//返回s[]中的具有最近距离的点对及其距离
		if(d1.dist<d2.dist)
		{
			if((q-p) < d1.dist)
			{
				return new CPair(q-p, q, p);
			}
			else
			{
				return d1;
			}
		}
		else
		{
			if((q-p)<d2.dist)
			{
				return new CPair(q-p, q, p);
			}
			else
			{
				return d2;
			}
		}
	}
	
	public static int min(int a, int b, int c)
	{
		int min = a;
		if(b<min)
		{
			min = b;
		}
		if(c<min)
		{
			min = c;
		}
		return min;
	}
	
	public static int max(int[] S, int begin, int end)
	{
		int m1 = S[begin];
		for (int i = begin+1; i < end; i++)
		{
			if(S[i]>m1)
			{
				m1 = S[i];
			}
		}
		return m1;
	}
	
	public static int min(int[] S, int begin, int end)
	{
		int m2 = S[begin];
		for (int i = begin+1; i < end; i++)
		{
			if(S[i]<m2)
			{
				m2 = S[i];
			}
		}
		return m2;
	}
}










分享到:
评论

相关推荐

    一维最近点对——C语言代码

    本问题的标题“一维最近点对——C语言代码”表明我们要探讨的是一段使用C语言编写的程序,它用于寻找一维空间中距离最近的两个点。在描述中提到,这是一个课程的随堂作业,适用于初学者,代码可能并不完美,但能够...

    一维最接近点对问题c#实现

    对于一维最接近点对问题,分治法可能的实现方式是将点集分为两部分,计算每部分内点的最近点对,然后找出这两部分间的最近点对,最终选择所有候选最近点对中的最小值。 在C#实现中,可能会使用控件如TextBox和...

    算法 最接近点对问题一维

    在这个场景下,我们关注的是在一维空间中的点对问题,也就是只考虑沿一条直线分布的点。这个问题相对简单,但仍然是理解和掌握更复杂多维最接近点对算法的基础。 在给定的描述中,提到的实现方式是通过结构体数组的...

    分治法实现最接近点对问题的三维推广算法

    利用分治策略,一维和二维最接近点对问题已得到高效解决方案,其时间复杂度为O(n log n)。本文讨论的是如何将这一方法推广至三维空间,解决三维最接近点对问题。 #### 一维情形的算法 在一维情况下,问题简化为在...

    从一维空间到十二维空间\从一维空间到十二维空间

    形象描述第一维空间到第十二维空间,你能看懂几个?

    二维最近点对-分治法

    二维最近点对问题是一个经典的计算机科学问题,主要在几何算法领域中出现,特别是在计算几何和数据结构中。这个问题要求在给定的二维平面上的一组点集中,找到距离最近的两个点。解决这类问题的方法有很多种,其中一...

    分治法解决一二维点对

    总结来说,分治法在解决一维和二维点对问题时,通过分解大问题为小问题,利用递归和合并策略,能够有效地降低问题的复杂性,提高算法的效率。对于特定问题,选择合适的数据结构和优化策略也是关键。在实际应用中,...

    一维装箱问题的解决

    一维装箱问题,也称为一维背包问题或一维空间分配问题,是组合优化领域的一个经典问题。在物流、仓库管理、生产计划等实际场景中广泛应用。问题的基本设定是:有一系列物品,每个物品都有一定的长度(或重量),目标...

    一维 稳态 TDMA_TDMA传热_一维稳态导热TDMA_一维稳态_

    TDMA算法是数值求解此类问题的一种有效方法,它将整个一维空间分成多个时间步,每个时间步只对一部分节点进行更新,然后依次进行,直到所有节点都被处理过。这种方法的优点在于其并行性,可以在多核处理器或分布式...

    一维FDTD程序一维FDTD程序

    一维FDTD程序的基本原理是将一维空间离散化为有限个网格点,然后使用有限差分法近似电磁场的时间演化方程。在每个时间步长内,程序将计算电场和磁场的变化,并更新网格点上的电场和磁场值。 一维FDTD程序的输入参数...

    Matlab实现一维和二维扩散方程

    在本文中,我们将深入探讨如何使用Matlab来实现一维和二维扩散方程的数值解。扩散方程是描述物质扩散或热量传播等物理过程的重要数学模型,广泛应用于工程、物理和生物科学等领域。Matlab作为一种强大的计算工具,...

    最接近点对问题.二维

    kd树是一种特殊的二叉树,用于在k维空间中存储点集,查询最近邻点的时间复杂度可以达到O(log n)。 书中的例子可能采用了某种算法,如平面排序或kd树,并通过编写C++代码实现。在实际编程中,可能会遇到一些挑战,...

    怎么理解四维空间

    2. 欧几里得四维空间:这是一个抽象的几何模型,与三维空间类似,四维空间中的点可以用四个坐标来表示。在这样的空间中,我们可以定义距离、角度和形状,但这些概念会变得更加复杂,因为我们需要处理四维向量和四维...

    在一个三维空间中 求点到点之间的距离

    在空间内设置三个点x,y,z并到其他三点之间的距离

    一维_用matlab编写的FDTD一维程序_

    标题中的“一维_用matlab编写的FDTD一维程序_”指的是使用MATLAB编程实现了一维有限差分时域(Finite-Difference Time-Domain, FDTD)算法的示例程序。MATLAB是一种强大的数值计算和数据分析环境,非常适合进行这种...

    一维二维扩散模型Matlab代码.rar

    一维和二维扩散模型是物理、化学和工程等领域中的基础模型,用于描述物质或能量在空间中的分布变化。扩散方程通常表示为偏微分方程,它描述了扩散物质浓度随时间和空间的变化。在数值模拟中,有限差分方法是一种常用...

    Java模拟二维空间的点和直线效果.rar

    Java模拟二维空间的点和直线效果,Task: 这个模拟二维空间的点,模拟直线,这个是“因子”,就是用两个数来表示一个数,这样做可以精确表示一个数。代码内判断两个数是否相等,根据给定直线上Y轴坐标,求出X轴坐标,...

    多个三维空间点拟合平面

    多个三维空间点拟合平面,平面方程设为Ax+By+Cz+1=0。

    三维空间圆拟合——center:XYZ Radius

    总之,三维空间圆拟合是一个涉及几何、代数和优化的复杂问题,但通过合适的算法和编程技术,我们可以准确地找出一组数据点的最优拟合圆。在处理实际数据时,应考虑数据质量、噪声以及拟合策略等因素,以确保结果的...

Global site tag (gtag.js) - Google Analytics