int searchNumOccurrence(vector<int> &V, int k, int start, int end) {
if (start > end) return 0;
int mid = (start + end) / 2;
if (V[mid] < k) return searchNumOccurrence(V, k, mid + 1, end);
if (V[mid] > k) return searchNumOccurrence(V, k, start, mid - 1);
return searchNumOccurrence(V, k, start, mid - 1) + 1 + searchNumOccurrence(V, k, mid + 1, end);
}
有人可以帮我解决这个问题吗?
预先感谢您的解释。
答案 0 :(得分:0)
需要考虑的事情-假设您的向量包含n个完全相同的副本。在这种情况下,该函数将继续将阵列分成两半,并搜索两个部分以计算其中有多少个副本。这样一来,它将至少访问数组的每个元素一次(选中此按钮-您知道为什么吗?)因此,在这种情况下,每个元素的工作量是恒定的。基于此,您认为运行时复杂度是什么?
答案 1 :(得分:0)
相同的元素越多,通过二进制搜索找到它们的时间就越少。 当您只寻找一个元素log(n)时,最慢的首次搜索将发生 在其他情况下,找到第一个元素将发生在log(n / log(repsOfK))之类的事件中 但是,您要寻找的元素越多,意味着您将需要多次运行函数,因此这将是总和 O(n)= Log(n / log(repsOfK))+ 2 * log(n /(2 * log(repsOfK-1))+ ... + 2 ^ n log(n /(2 ^ n log(repsOfK-2 ^(n-1))))
您将必须找到此功能的最大值才能找出答案