使用递归计算数组中某个元素出现的次数
Counting the number of occurrences of an element in an array using recursion
我得到了以下提示:
创建一个递归函数,计算
v
在数组A
中出现的次数,每次将A
分为两个子数组。
还有比使用BinarySearch
更好的方法吗?我创建了以下函数:
int count(int *A, int low, int high, int v) {
if(low > high) return 0;
int total = 0, mid = (low + high)/2;
if(A[mid] == v) total++;
return count(A, low, mid - 1, v) + total + count(A, mid + 1, high, v);
}
这个可以工作,所以我不需要对这部分进行验证。
我们没有被告知数组A
是否被排序,所以这就是为什么有必要搜索数组A
的左半部分和右半部分。但是我需要求出我写的这个函数的时间复杂度。以下是我的想法:
任何变量赋值都是O(1)
,所以我们只需要考虑count(A, low, mid - 1, v) + total + count(A, mid + 1, high, v)
。由于我们将数组分成2
部分,子问题大小为2
,因此我创建了以下递归关系:
T(n) = T(n/2) + O(1) + T(n/2) = 2T(n/2) + O(1)
,
,我们可以用主定理得到T(n) = O(n)
。我的问题:我是否假设变量赋值与O(1)
是恒定的,并且count
函数的每个部分都是T(n/2)
有效?
O(n)
的总体时间复杂度是有意义的,因为我们必须检查数组中所有的n
元素。
很想在答案中只写"是",目的是为了得到一个简短的接受答案!
但是为了提供更多的信息,在算法分析中最常用的计算模型下,任何涉及log(n)
位的操作都假定在O(1)
时间内执行。这实际上意味着,除非您的数组非常大(例如2^n
)或值本身非常大,否则您可以安全地假设所有操作都可以在O(1)
时间内执行。
至于你对T(n/2)
的分析,除了"是"之外没有别的可说的,这是正确的,因为你只是在每次递归调用中将数组的长度减半。
- 递归函数计算序列中的平方和(并输出过程)
- 数组元素打印的递归方法
- 打包可变参数模板具有零元素时的递归
- 使用变量模板的递归计算 - gcc 与 clang
- 使用递归计算一个函数中的高度和大小
- 如何使用递归计算从 0 到给定数字的奇数?
- 递归计算满足条件的值数并返回该数字
- 通过递归计算模数而不使用模除法
- 使用条件运算符递归计算模板化值或函数时出现错误 C1202(堆栈溢出)
- 递归计算在不使用静态局部变量,全局变量或静态函数的情况下,在递归函数中发生的环数
- 递归计算函数f = n!/(c^n)的值
- friend get 函数,返回通过可变参数模板递归计算的类型
- 用递归计算函数f(n)
- 在 C++ 中使用递归计算值 Pi (π)
- 用递归计算数字的位数
- 为什么我在计算帕斯卡三角形元素时在递归 C 程序中出现堆栈溢出错误
- C++:递归计算所有数字0-9的置换
- 使用迭代和递归计算阶乘时的不同答案
- 如何使用递归计算从点 A 到 B 的可用路径数
- 使用递归计算数组中某个元素出现的次数