【问题标题】:How to solve this with a logarithmic time algorithm?如何用对数时间算法解决这个问题?
【发布时间】: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. 在每一个递归步骤中,算法都会将搜索空间分成若干相等的部分,并丢弃其中的一部分。

标签: java algorithm


【解决方案1】:

您的数组已排序,这意味着您可以使用binary search。我对此答案没有什么要补充的,也不会为您提供现成的代码,因为这是您的责任。主要思想是检查数组的中间元素,然后确定应该朝哪个方向移动:数组的前半部分或后半部分,依此类推。

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 2021-06-19
    • 2020-03-27
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    相关资源
    最近更新 更多