【发布时间】:2020-02-21 09:44:24
【问题描述】:
通常说具有对数时间复杂度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 函数具有对数时间复杂度?
【问题讨论】:
-
通常说,具有对数时间复杂度 O(log n) 的算法是这样一种算法,其中将输入加倍并不一定会使所需的工作量加倍。对数并不意味着“不一定是线性的”。
标签: time-complexity complexity-theory