如何用对数时间算法解决这个问题?

时间:2015-11-26 10:34:44

标签: java algorithm

我遇到了以下问题:

现在你给出一个长度为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)的算法。任何人都可以帮我编码吗?

1 个答案:

答案 0 :(得分:1)

您的数组已排序,这意味着您可以使用binary search。我没有任何内容可以添加到这个答案中,也不会为您提供准备好的代码,因为这是您的责任。主要思想是检查数组的中间元素,然后确定应该移动的方向:数组的前半部分或后半部分等等。