Time complexity 这是对数时间复杂度的一个例子吗?

Time complexity 这是对数时间复杂度的一个例子吗?,time-complexity,complexity-theory,Time Complexity,Complexity Theory,通常说,具有对数时间复杂度O(logn)的算法是这样一种算法,即输入加倍并不一定意味着所需工作量加倍。通常情况下,搜索算法是作为对数复杂度算法的一个例子给出的 考虑到这一点,假设我有一个函数,它将字符串数组作为第一个参数,将单个字符串作为第二个参数,并返回数组中字符串的索引: function getArrayItemIndex(array, str) { let i = 0 for(let item of array) { if(item === str) { re

通常说,具有对数时间复杂度
O(logn)
的算法是这样一种算法,即输入加倍并不一定意味着所需工作量加倍。通常情况下,搜索算法是作为对数复杂度算法的一个例子给出的

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

function getArrayItemIndex(array, str) {
  let i = 0
  for(let item of array) {
    if(item === str) {
      return i
    }
    i++
  }
}
假设此函数的调用方式如下:

getArrayItemIndex(['John', 'Jack', 'James', 'Jason'], 'Jack')
getArrayItemIndex(
  [
    'John', 
    'Jack', 
    'James', 
    'Jason',
    'Jerome',
    'Jameson',
    'Jamar',
    'Jabar'
  ], 
  'John'
)
在本例中,函数在返回
1
的索引之前不会遍历整个数组。类似地,如果我们将数组中的项加倍,那么它最终将被调用,如下所示:

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

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

不太准确。这里是线性搜索。它最差的ccase性能是θ(n),因为如果搜索目标不在列表中,它必须检查所有元素。您发现它的最佳情况性能是θ(1),因为如果幸运的话,该算法只需运行几次检查

预排序数组上的二进制搜索是O(logn)最坏情况算法的一个示例(最佳情况仍然是O(1))。它的工作原理如下:

检查中间的元素。如果匹配,则返回。否则,如果元素太大,则对数组的前半部分执行二进制搜索。如果它太大,在后半部分执行二进制搜索。继续,直到找到目标或没有新元素可供检查


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

通常说,对数时间复杂度为O(logn)的算法是输入加倍不一定需要加倍所需工作量的算法。对数并不意味着“不一定是线性的”。谢谢你的回答。非常感谢。所以我得到的是,我们总是担心最坏的情况。换句话说,如果最坏的情况是O(logn),那么它只会是O(logn)。在我的示例中,最坏的情况是数组被完全循环,总共循环一次,这是一个线性(即O(n))操作。然而,对于二进制搜索示例,因为我们永远不会查看数组中的每个元素,即使在最坏的情况下,这意味着该操作是一个O(logn)操作。。。在最坏的情况下,它是O(logn)。对吗?@JairusRuth听起来是个正确的总结,对。我要补充的是,除了考虑上界以外的最坏的界限以外,考虑技术上的错误在技术上不是错误的,但通常情况下,最坏情况下的上限是人们谈论W.R.T.算法,因为这与底层问题的复杂性类有关。