【问题标题】:Counting the number of occurrences of an element in an array using recursion使用递归计算数组中元素的出现次数
【发布时间】: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)。由于我们将数组划分为子问题大小为22 部分,因此我创建了以下递归关系:

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


【解决方案1】:

很想在答案中只写“是”,并以缩短的接受答案为目标!

但是为了提供更多信息,在算法分析中最常用的计算模型下,任何涉及log(n)位的操作都假定在O(1)时间执行。这实际上意味着除非您的数组非常大(例如2^n)或值本身非常大,否则您可以安全地假设所有操作都可以在O(1) 时间内执行。

至于您对T(n/2) 的分析,除了是的,没有什么可说的,这是正确的,因为您只是在每次递归调用中将数组的长度减半。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-30
    • 2021-10-10
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多