使用递归计算数组中某个元素出现的次数

Counting the number of occurrences of an element in an array using recursion

本文关键字:元素 递归计算 数组      更新时间:2023-10-16

我得到了以下提示:

创建一个递归函数,计算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)的分析,除了"是"之外没有别的可说的,这是正确的,因为你只是在每次递归调用中将数组的长度减半。