本系列博客习题来自《算法(第四版)》,算是本人的读书笔记,如果有人在读这本书的,欢迎大家多多交流。为了方便讨论,本人新建了一个微信群(算法交流),想要加入的,请添加我的微信号:zhujinhui207407 谢谢。另外,本人的个人博客 http://www.kyson.cn 也在不停的更新中,欢迎一起讨论
知识点
- 算法优化
- 最接近的一对
题目
1.4.16 最接近一对(一维)。编写一个程序,给定一个含有 N 个 double 值的数组 a[],在其中找到一对最接近的值:两者之差(绝对值)最小的两个数。程序在最坏情况下所需的运行时间应该是线性对数级别的。
1.4.16 Closest pair (in one dimension). Write a program that, given an array a[] of N double values, finds a closest pair : two values whose difference is no greater than the the difference of any other pair (in absolute value). The running time of your program should be linearithmic in the worst case.
分析
这道题的解法也很有意思,我们慢慢分析,首先,如果不考虑任何算法,只是单纯完成这个任务,我们可以写出这样的代码:
public class ClosestPair {
public static void closestPair(double[] a){
double smallestValues = Double.MAX_VALUE;
int smallestIndexI = 0;
int smallestIndexj = 0;
for (int i = 0; i < a.length; i++)
{
for (int j = i+ 1; j < a.length; j++)
{
double value = a[j] -a[i];
if (value < smallestValues)
{
smallestValues = value;
smallestIndexI = i;
smallestIndexj = j;
}
}
}
System.out.println("最接近的两个数为:"+a[smallestIndexI]);
System.out.println("和:"+a[smallestIndexj]);
}
public static void main(String[] args) {
double[] b = {1.0,26,36,74,599,60,7,8};
Arrays.sort(b);
closestPair(b);
}
}
以上代码的地址:ClosestPair.java
如上述代码所示,我们只需要先调用Arrays.sort()
方法将数组排序,这样最接近的一对肯定是相邻的两个,然后新建一个临时变量,不停的判断有没有比这个临时变量小的值即可。那这个算法的复杂度如何呢,稍加分析我们就知道,由于存在两个循环,因此算法复杂度的n2。因此这个算法有待优化。优化的方式就是将两层循环变成一层循环。
答案
public class ClosestPairFaster {
public static void closestPairFaster(double[] x)
{
double minNum = Double.MAX_VALUE;
int minI = 0;
for(int i = 0;i < x.length - 1;++i)
{
if (x[i+1]- x[i] < minNum)
{
minI = i;
minNum = x[i+1]- x[i] ;
}
}
System.out.println("最接近的两个数为:"+x[minI]);
System.out.println("和:"+x[minI+ 1]);
}
public static void main(String[] args){
double[] a = {1,2,3,4,5,888,76,45};
Arrays.sort(a);
closestPairFaster(a);
}
}
代码索引
广告
我的首款个人开发的APP壁纸宝贝上线了,欢迎大家下载。