当前位置: 首页 > 知识库问答 >
问题:

如何直观地证明这段代码的时间复杂性

连厉刚
2023-03-14

我有一段代码如下:

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);
}

谢谢

共有1个答案

钱劲
2023-03-14

考虑相同数字的最坏情况:您的算法将读取所有输入数字:与之比较时的中间元素,然后是前半部分,然后是后半部分。要检查一个元素,它需要O(1),所以要检查n元素,它需要O(n)。

另一种看它的方法:看函数调用的树。这将是一个二叉树(不像二分搜索,其中的“树”是线性的)。此树的深度为O(log n),而每个级别的节点数为O(2^I),其中I是嵌套级别。因此最深嵌套层的节点数为O(2^log(n))O(n)

 类似资料:
  • 我知道嵌套for循环的时间复杂度等于最里面的循环执行的次数。 像外部循环从1到n的每个嵌套循环一样,它应该运行n次,但这里我们有,这使得算法运行的顺序更好。实际上,我在IDE中编写了这段代码,并在循环结束后打印了x的最终结果,对于不同的n值,我看到跳入内部for循环需要将近n倍的时间。 所以我认为这个算法的整个顺序是,但我不确定

  • 我如何发现它的时间和空间复杂性?

  • 由于std::sort的时间复杂度为nlog(n),我们有(N1+N2....Nk)次迭代,因此我假设总的时间复杂度为O((N1+N2....+Nk)klog(k))。但是在每次迭代中,vector的大小可能会有所不同,所以我有点困惑。有人能证实这一点吗? 2.我还在leetcode论坛上看到了另一个使用“合并排序”思想的解决方案。它每次都合并两个链表。 我想知道这个解决方案的时间复杂度是多少?因

  • null null T(n)=O(1)+O(nlogn)=O(nlogn) 但我不确定。有人能帮帮我吗。

  • 有人能帮我了解一下这个代码片段的时间和空间复杂性吗?请参考leetcode问题-单词中断II。给定一个非空字符串s和一个包含非空单词列表的字典单词dict,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。返回所有这些可能的句子。