人们常说,对数时间复杂度为O(log n)的算法是这样一种算法,其中将输入加倍并不一定会使所需的工作量加倍。 通常,搜索算法作为具有对数复杂度的算法的示例给出。

考虑到这一点,假设我有一个函数,它将字符串数组作为第一个参数,将单个字符串作为第二个参数,并返回数组中字符串的索引:

function getArrayItemIndex(array, str) {
  let i = 0
  for(let item of array) {
    if(item === str) {
      return i
    }
    i++
  }
}

让我们说这个函数的调用方式如下:

getArrayItemIndex(['John', 'Jack', 'James', 'Jason'], 'Jack')

在这种情况下,该函数在返回索引1之前不会最终遍历整个数组。 同样,如果我们将数组中的项目加倍,使其最终被调用如下:

getArrayItemIndex(
  [
    'John', 
    'Jack', 
    'James', 
    'Jason',
    'Jerome',
    'Jameson',
    'Jamar',
    'Jabar'
  ], 
  'John'
)

...然后将数组中的项目加倍不一定会导致函数的运行时间加倍,因为它会在第一次迭代后跳出循环并返回。 因此,说getArrayItemIndex函数具有对数时间复杂度是否准确?

#1楼 票数:0 已采纳

不完全的。 你在这里拥有的是线性搜索。 其最坏情况下的性能是 Theta(n),因为如果搜索目标不在列表中,它必须检查所有元素。 您发现它的最佳性能是 Theta(1),因为如果幸运的话,该算法只需要运行一些检查。

预排序数组上的二分搜索是 O(log n) 最坏情况算法的一个例子(最好的情况仍然是 O(1))。 它是这样工作的:

检查中间元素。 如果匹配,则返回。 否则,如果元素太大,则对数组的前半部分进行二分查找。 如果太大,则在后半部分执行二分查找。 继续,直到找到目标或用完要检查的新元素。

在二分搜索中,我们从不查看所有元素。 这就是区别。

  ask by Jairus Ruth translate from so

未解决问题?本站智能推荐:

1回复

时间复杂度-For循环[重复]

这个问题在这里已经有了答案: 如何找到算法的时间复杂度(9 个回答) 去年关闭。 我有一个关于使用 O-Notation 计算时间复杂度的问题。 我们给了这
1回复

以下程序的时间复杂度

在上面的程序中,我被要求找出时间复杂度,其中过程A花费O(1)时间,过程B花费O(1 / n)。 我形成了递归关系T(n)= T(n-1)+ O(1 / n) 求解它,我得到T(n)= O(log n),因为如果使用反向替换方法求解谐波序列,并且计算时间序列的总和为O(lgn),则将得到
3回复

本系列的时间复杂度

如何找到以下系列的时间复杂度 请告诉我这是否正确。
1回复

HashMapput/getinside的时间复杂度?

假设我有以下代码片段: 我的地图是一个 HashMap。 我知道 for 将是 O(n) 然后映射操作有 O(1),但是我在那里有三个映射操作(containsKey、put 和 get)所以那是 O(3n) 还是 O(n)? 为什么?
1回复

循环相关的时间复杂度

我知道父循环执行n + 1次,子循环执行(val)^(1/62)次。 对于父循环时间复杂度将是O(n)但是没有找到计算子循环的方法。 那么,上述计划的时间复杂度是多少? 提前致谢。
1回复

变量赋值的时间复杂度

我知道如果我有这样的功能: 时间复杂度顺序为 O(1),因为我们只执行一个操作(总和)。 但是如果我有一个不做任何操作的函数,只是给一些全局变量赋值。 像这样: 这个函数的时间复杂度是多少? 我的猜测是它仍然是 O(1)。 那是对的吗?
1回复

计算此函数的时间复杂度

给定此功能(用伪代码编写),时间复杂度是多少? 尝试一下,我会说时间复杂度为θ(n ^ 3),因为我们需要先遍历树θ(n),然后将ANCESTOR的贡献θ(n)与ADDTOQUEUEθ(n)的贡献相乘。 这个对吗? ====================================
4回复

内部for循环的时间复杂度

我对以下以下程序的时间复杂度有疑问。 我知道为什么第一个for循环是n + 2,但是第二个for循环为什么是(n + 1)/ 2? //用于循环的示例//这不是一个完整的编码程序,仅用于循环时间复杂度分析