【发布时间】:2015-11-26 20:00:36
【问题描述】:
我遇到了以下问题:
现在给定一个长度为 n(n 已知)的双倍数数组为double sample[n],并且它是升序排列的(所有元素都不同)。请编写一个带有一个参数double num 的函数,它返回sample[n] 中最接近参数num 的元素的索引。如果num正好位于一个区间的中间,则返回小于它的元素的索引。
这是我的 Java 代码:
public int getIndex(double num) {
if(sample[0] >= num) {return 0;}
for(int i = 1, i < sample.length; i++) {
if(sample[i] == num) {return i;}
else if(sample[i] > num) {
return (sample[i]-num) < (num-sample[i-1]) ? i : i-1;
else {continue;}
}
return sample.length;
}
这显然是线性复杂度。但是,我的老师告诉我存在 O(log n) 的算法。谁能帮我写代码?
【问题讨论】:
-
阅读二分搜索。 PS,Arrays 中有一种方法可以满足您的需求 -
public static int binarySearch(double[] a, double key)。 -
您可以使用二分法搜索,因为元素已排序:en.wikipedia.org/wiki/Dichotomic_search
-
作为解决此类问题的一般建议:如果您被告知要找到对数算法,您可以确定两件事:1. 解决方案将是递归的。 2. 在每一个递归步骤中,算法都会将搜索空间分成若干相等的部分,并丢弃其中的一部分。