【问题标题】:What is the time complexity of the following search algorithm?以下搜索算法的时间复杂度是多少?
【发布时间】:2020-11-15 06:56:22
【问题描述】:
/* 
 * V is sorted 
 * V.size() = N
 * The function is initially called as searchNumOccurrence(V, k, 0, N-1)
 */

int searchNumOccurrence(vector<int> &V, int k, int start, int end) {
    if (start > end) return 0;
    int mid = (start + end) / 2;
    if (V[mid] < k) return searchNumOccurrence(V, k, mid + 1, end);
    if (V[mid] > k) return searchNumOccurrence(V, k, start, mid - 1);
    return searchNumOccurrence(V, k, start, mid - 1) + 1 + searchNumOccurrence(V, k, mid + 1, end);
}

这段代码sn-p的时间复杂度是多少?我觉得它的 O(logN) 但正确答案是 O(N)。有人能解释清楚为什么吗?

【问题讨论】:

    标签: c++ algorithm search time-complexity binary-search


    【解决方案1】:

    它是O(N),因为如果你总是使用这个“分支”(数组包含N 元素,值为k

    return searchNumOccurrence(V, k, start, mid - 1) + 1 + searchNumOccurrence(V, k, mid + 1, end);
    

    你必须做2次调用,你可以把它想象成一个完整的树遍历,即O(N)

    【讨论】:

    • 好的,但是在最后一条语句之前执行的两个 searchNumOccurence 呢?我们不考虑这些吗?在最后一个陈述中也是如此;在这两个调用中,时间复杂度应该是 log(N)。你能详细说明一下吗?
    • 例如。在最后一条语句中;它不是完全横向的。它的 log(N) (二分查找) 两次当然最终都返回 0。即 2*log(N)
    • @DivijJain 最坏的情况是V 只包含k 的N 个副本(即所有元素都是相同的)。然后你执行最后一个 return 语句 N 次。最好的情况(当 V 有 0 或 1 个元素和 k 时)是 O(log(N)) 并且最后的 return 语句不会被执行。
    • @1201ProgramAlarm 啊,好的。谢谢。所以基本上中间的那两条语句在最坏的情况下永远不会被执行。
    • @DivijJain 确切地说,这两个分支比第三个分支更轻,并且由于 O(f(n)) 是上限,因此您需要找到一个始终大于/等于您的函数渐近规划
    猜你喜欢
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2023-03-11
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    相关资源
    最近更新 更多