【问题标题】:What is the Complexity of Find() Function [duplicate]Find() 函数的复杂性是什么[重复]
【发布时间】:2017-06-09 05:01:49
【问题描述】:

我有两个版本的 find 函数,它们都在数组中搜索一个整数值,如果存在则返回它的位置。 find1() 函数在最坏情况下最多会搜索 N 个元素,而在另一方面 find2() 函数在最坏情况下最多会搜索 N/2 个元素。这是否意味着find2() 函数的复杂度降低到O(N/2)

我假设数组 arr 包含非重复值。

函数:find1()

int find1(int value){
    for (int i = 0; i < N; i++){
        if (arr[i] == value){
            return i;
        }
    }
    return -1;
}

函数:find2()

int find2(int value){
    for (int i = 0, j = N - 1; i <= j; i++, j--){
        if (arr[i] == value){
            return i;
        }
        if (arr[j] == value){
            return j;
        }
    }
    return -1;
}

【问题讨论】:

  • 两个版本似乎搜索相同数量的元素。第二个版本只是在循环中每次搜索两个元素。
  • 是的,但循环将运行一半。它会降低整体复杂性吗?还是仍将其视为 O(N) 函数?我只是想弄清楚它是如何工作的。谢谢@Galik
  • 他们都是 O(n)。 n/2n 在复杂性分析中相同。在这种情况下,情况会加倍,因为 n/2 案例中的每个操作都比 n 案例中的操作复杂两倍。
  • secon 循环运行了一半的次数,但执行了两倍的测试。所以一半乘以二 = 1。两者完全一样。
  • 阅读任何一本称职的算法书籍,你就会得到复杂性的准确定义。

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


【解决方案1】:

首先,第一个版本在最坏的情况下进行 n 次迭代,并且在每次迭代中,都会进行恒定数量的操作。第二个版本在最坏的情况下进行 n / 2 次迭代,并且在每次迭代中,也进行恒定数量的操作,但常数更大。因此,没有理由认为第一个是O(n),第二个是O(n / 2)

无论如何,O(n) = O(n / 2)。在definition of O 中,O(n) 表示存在一个常数 c1,使得对于每个 n > n1,

f(n)1n.

同样,O(n / 2) 表示存在一个常数 c2 使得对于每个 n > n 2,

f(n) 2 n / 2 = (c2 / 2) n.

因为对于任何 n > max(n1, n2) 不等式对 c1 = c2 / 2,这两个中的每一个都意味着另一个。

【讨论】:

  • 谢谢你。现在很清楚了。
  • @SazzadHissainKhan 不客气。一切顺利。
猜你喜欢
  • 2022-11-01
  • 2012-09-17
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多