【发布时间】:2023-03-12 12:37:02
【问题描述】:
我收到了以下提示:
创建一个递归函数,通过每次将
A分成两个子数组来计算v在数组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 元素。
【问题讨论】:
-
你不能做得比 O(n) 更好。二进制搜索是因为他们想测试你对递归的理解,而不是因为它更有效。
标签: c++ arrays algorithm search time-complexity