C++ 在logn中查找排序数组中元素的频率
这可能吗? 我想到了这个:C++ 在logn中查找排序数组中元素的频率,c++,complexity-theory,C++,Complexity Theory,这可能吗? 我想到了这个: void binary_search(int list[], int lo, int hi, int key, int* maxIndex, int* minIndex) { int mid; if (lo > hi) { printf("Key not found\n"); return; } mid = (lo + hi) / 2; if (list[mid] == key) {
void binary_search(int list[], int lo, int hi, int key, int* maxIndex, int* minIndex) {
int mid;
if (lo > hi) {
printf("Key not found\n");
return;
}
mid = (lo + hi) / 2;
if (list[mid] == key) {
counter++;
if (*maxIndex == -1) {
*maxIndex = mid;
cout << "Init max" << endl;
}
if (mid > *maxIndex) {
*maxIndex = mid;
cout << "Change max" << endl;
}
if (*minIndex == -1) {
*minIndex = mid;
cout << "Init min" << endl;
}
if (mid < *minIndex) {
*minIndex = mid;
cout << "Change min" << endl;
}
}
if (mid - 1 >= 0)
if (list[mid - 1] == key)
binary_search(list, lo, mid - 1, key, maxIndex, minIndex);
if (mid + 1 <= hi)
if (list[mid + 1] == key)
binary_search(list, mid + 1, hi, key, maxIndex, minIndex);
}
int main() {
int min = 10;
int max = -1;
int arr[] = { 1,1,3,3,3,3,4,7,8,9 };
binary_search(arr, 0, 10, 3, &max, &min);
cout << max - min + 1 << endl;
cout << counter;
return 0;
}
无效二进制搜索(int-list[],int-lo,int-hi,int-key,int*maxIndex,int*minIndex){
int mid;
如果(低>高){
printf(“找不到密钥\n”);
返回;
}
中期=(低+高)/2;
如果(列表[mid]==键){
计数器++;
如果(*maxIndex==-1){
*maxIndex=mid;
库特
在logn中查找排序数组中元素的频率
这可能吗
对
我所做的是,找到元素的第一个外观和最后一个外观,并扣除索引
这是一个合理的算法
但是它是O(logn)吗
二进制搜索可以在O(logn)
中实现,2个二进制搜索可以在2*O(logn)=O(logn)
中实现。因此,所述算法可以在O(logn)
中实现
你的实现是否达到这个复杂性,是另一回事。但是在分析你的程序之前,考虑它的功能上的一个缺陷:如果键值最初不在
std::lower_bound
和std::upper_bound
(和std::equal_range
完全满足您的要求)
在logn中查找排序数组中元素的频率
这可能吗
对
我所做的是,找到元素的第一个外观和最后一个外观,并扣除索引
这是一个合理的算法
但是它是O(logn)吗
二进制搜索可以在O(logn)
中实现,2个二进制搜索可以在2*O(logn)=O(logn)
中实现。因此,所述算法可以在O(logn)
中实现
你的实现是否达到这个复杂性,是另一回事。但是在分析你的程序之前,考虑它的功能上的一个缺陷:如果键值最初不在
注:不需要重新实现二进制搜索。标准库已经提供了一个实现:
std::lower_bound
和std::upper_bound
(和std::equal_range
,它完全满足您的要求)。我在这里回答我自己的问题。
伪代码。我在这里回答我自己的问题。
在伪代码中。Yes,.Yes,它可以在O(logN)中完成。正确的二进制搜索是O(logN),这里需要执行其中两个(一个用于下限,一个用于上限)。这意味着2*log(n),在big-O中,常量因子被忽略,因此它是O(logN)。正确实现的二进制搜索有最坏的情况O(logN)复杂性。我如何实现一个下限?或者一个上限?提供了可能的实现,您可以查看。是的,。是的,它可以在O(logn)中完成。正确的二进制搜索是O(logn),这里您需要执行其中两个(一个下限,一个上限)。这意味着2*log(n),在big-O中,常量因子被忽略,因此它是O(logN)。正确实现的二进制搜索具有最坏的情况O(logN)复杂性。我如何实现下限中的一个?或上限中的一个?提供了可能的实现,您可以查看。