/**
* 一维空间最近点对问题
* @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#实现中,可能会使用控件如TextBox和...
在这个场景下,我们关注的是在一维空间中的点对问题,也就是只考虑沿一条直线分布的点。这个问题相对简单,但仍然是理解和掌握更复杂多维最接近点对算法的基础。 在给定的描述中,提到的实现方式是通过结构体数组的...
利用分治策略,一维和二维最接近点对问题已得到高效解决方案,其时间复杂度为O(n log n)。本文讨论的是如何将这一方法推广至三维空间,解决三维最接近点对问题。 #### 一维情形的算法 在一维情况下,问题简化为在...
形象描述第一维空间到第十二维空间,你能看懂几个?
二维最近点对问题是一个经典的计算机科学问题,主要在几何算法领域中出现,特别是在计算几何和数据结构中。这个问题要求在给定的二维平面上的一组点集中,找到距离最近的两个点。解决这类问题的方法有很多种,其中一...
总结来说,分治法在解决一维和二维点对问题时,通过分解大问题为小问题,利用递归和合并策略,能够有效地降低问题的复杂性,提高算法的效率。对于特定问题,选择合适的数据结构和优化策略也是关键。在实际应用中,...
一维装箱问题,也称为一维背包问题或一维空间分配问题,是组合优化领域的一个经典问题。在物流、仓库管理、生产计划等实际场景中广泛应用。问题的基本设定是:有一系列物品,每个物品都有一定的长度(或重量),目标...
TDMA算法是数值求解此类问题的一种有效方法,它将整个一维空间分成多个时间步,每个时间步只对一部分节点进行更新,然后依次进行,直到所有节点都被处理过。这种方法的优点在于其并行性,可以在多核处理器或分布式...
一维FDTD程序的基本原理是将一维空间离散化为有限个网格点,然后使用有限差分法近似电磁场的时间演化方程。在每个时间步长内,程序将计算电场和磁场的变化,并更新网格点上的电场和磁场值。 一维FDTD程序的输入参数...
在本文中,我们将深入探讨如何使用Matlab来实现一维和二维扩散方程的数值解。扩散方程是描述物质扩散或热量传播等物理过程的重要数学模型,广泛应用于工程、物理和生物科学等领域。Matlab作为一种强大的计算工具,...
kd树是一种特殊的二叉树,用于在k维空间中存储点集,查询最近邻点的时间复杂度可以达到O(log n)。 书中的例子可能采用了某种算法,如平面排序或kd树,并通过编写C++代码实现。在实际编程中,可能会遇到一些挑战,...
2. 欧几里得四维空间:这是一个抽象的几何模型,与三维空间类似,四维空间中的点可以用四个坐标来表示。在这样的空间中,我们可以定义距离、角度和形状,但这些概念会变得更加复杂,因为我们需要处理四维向量和四维...
在空间内设置三个点x,y,z并到其他三点之间的距离
标题中的“一维_用matlab编写的FDTD一维程序_”指的是使用MATLAB编程实现了一维有限差分时域(Finite-Difference Time-Domain, FDTD)算法的示例程序。MATLAB是一种强大的数值计算和数据分析环境,非常适合进行这种...
一维和二维扩散模型是物理、化学和工程等领域中的基础模型,用于描述物质或能量在空间中的分布变化。扩散方程通常表示为偏微分方程,它描述了扩散物质浓度随时间和空间的变化。在数值模拟中,有限差分方法是一种常用...
Java模拟二维空间的点和直线效果,Task: 这个模拟二维空间的点,模拟直线,这个是“因子”,就是用两个数来表示一个数,这样做可以精确表示一个数。代码内判断两个数是否相等,根据给定直线上Y轴坐标,求出X轴坐标,...
多个三维空间点拟合平面,平面方程设为Ax+By+Cz+1=0。
总之,三维空间圆拟合是一个涉及几何、代数和优化的复杂问题,但通过合适的算法和编程技术,我们可以准确地找出一组数据点的最优拟合圆。在处理实际数据时,应考虑数据质量、噪声以及拟合策略等因素,以确保结果的...