Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在logn中查找排序数组中元素的频率_C++_Complexity Theory - Fatal编程技术网

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)
中实现

你的实现是否达到这个复杂性,是另一回事。但是在分析你的程序之前,考虑它的功能上的一个缺陷:如果键值最初不在MID点,输出将不被修改,并给出错误的结果。例如:在你的考试中尝试搜索<代码> 1 < /代码>的频率。普尔

如果您单独实现两个二进制搜索,那么分析您的算法会更容易……而且可能会更快,因为简单的二进制搜索可以进行尾部调用优化

注:不需要重新实现二进制搜索。标准库已经提供了一个实现:
std::lower_bound
std::upper_bound
(和
std::equal_range
完全满足您的要求)

在logn中查找排序数组中元素的频率

这可能吗

我所做的是,找到元素的第一个外观和最后一个外观,并扣除索引

这是一个合理的算法

但是它是O(logn)吗

二进制搜索可以在
O(logn)
中实现,2个二进制搜索可以在
2*O(logn)=O(logn)
中实现。因此,所述算法可以在
O(logn)
中实现

你的实现是否达到这个复杂性,是另一回事。但是在分析你的程序之前,考虑它的功能上的一个缺陷:如果键值最初不在MID点,输出将不被修改,并给出错误的结果。例如:在你的考试中尝试搜索<代码> 1 < /代码>的频率。普尔

如果您单独实现两个二进制搜索,那么分析您的算法会更容易……而且可能会更快,因为简单的二进制搜索可以进行尾部调用优化


注:不需要重新实现二进制搜索。标准库已经提供了一个实现:
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)复杂性。我如何实现下限中的一个?或上限中的一个?提供了可能的实现,您可以查看。