计算字符串递归方法中的辅音
Count consonants in string recursive method
这是python中写的方法:
def count_con(s, lo, hi):
vls = ['a', 'e', 'i', 'o', 'u']
if lo == hi:
if s[lo] not in vls:
return 1
else:
return 0
mid = (lo + hi) // 2
count_l = count_con(s, lo, mid)
count_r = count_con(s, mid + 1, hi)
return count_l + count_r
假设我们想求出它的时间复杂度。我想出了一个递归关系:
T(n) = 2T(n/2) + f(n), if n > 1 or T(n) = O(1), if n <= 1
但是,我无法确定 f(n)
会是什么。合并这两部分是否需要线性 O(n)
时间,就像合并排序或常数 O(1)
时间一样?我倾向于认为,因为它只是一个加法常数O(1)
时间更合适。
总的来说,这个方法是O(n*logn)
还是O(logn)
?
Will combining the two halves take linear O(n) time just like in merge-sort or constant O(1) time? I tend to think that since it's only an addition constant O(1) time is more suitable.
你是对的。
因此,如果我们假设一次调用完成 1 个工作单元(忽略递归调用),我们所要做的就是确定调用次数。如果我们假设 n = 2k 我们最终会调用 1 + 2 + 4 + ... + 2k = 2n - 1 次调用。这只是 O(n)。
如您的问题所述,合并两半仅消耗常数时间。
代码所做的是,简单地递归检查(访问)索引是否为元音并递增计数器。它的整体只有 O(n).
如果您需要了解何时出现对数复杂度,可以查看此问题以了解一般的时间复杂度:here
f(n) 如您的问题中所述,这里只需要常数时间,但在合并排序中,这是一个 O(n),因为在递归调用之后,在返回排序数组之前,您正在访问并线性排列左右索引之间的整个数组的值。
这是python中写的方法:
def count_con(s, lo, hi):
vls = ['a', 'e', 'i', 'o', 'u']
if lo == hi:
if s[lo] not in vls:
return 1
else:
return 0
mid = (lo + hi) // 2
count_l = count_con(s, lo, mid)
count_r = count_con(s, mid + 1, hi)
return count_l + count_r
假设我们想求出它的时间复杂度。我想出了一个递归关系:
T(n) = 2T(n/2) + f(n), if n > 1 or T(n) = O(1), if n <= 1
但是,我无法确定 f(n)
会是什么。合并这两部分是否需要线性 O(n)
时间,就像合并排序或常数 O(1)
时间一样?我倾向于认为,因为它只是一个加法常数O(1)
时间更合适。
总的来说,这个方法是O(n*logn)
还是O(logn)
?
Will combining the two halves take linear O(n) time just like in merge-sort or constant O(1) time? I tend to think that since it's only an addition constant O(1) time is more suitable.
你是对的。
因此,如果我们假设一次调用完成 1 个工作单元(忽略递归调用),我们所要做的就是确定调用次数。如果我们假设 n = 2k 我们最终会调用 1 + 2 + 4 + ... + 2k = 2n - 1 次调用。这只是 O(n)。
如您的问题所述,合并两半仅消耗常数时间。 代码所做的是,简单地递归检查(访问)索引是否为元音并递增计数器。它的整体只有 O(n).
如果您需要了解何时出现对数复杂度,可以查看此问题以了解一般的时间复杂度:here
f(n) 如您的问题中所述,这里只需要常数时间,但在合并排序中,这是一个 O(n),因为在递归调用之后,在返回排序数组之前,您正在访问并线性排列左右索引之间的整个数组的值。